summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--base/win/scoped_comptr_unittest.cc86
-rw-r--r--base/win/shortcut_unittest.cc11
-rw-r--r--chrome/browser/history/history_publisher.h3
-rw-r--r--chrome/browser/history/history_publisher_win.cc3
-rw-r--r--chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc8
-rw-r--r--chrome/installer/setup/setup_main.cc25
-rw-r--r--chrome/installer/util/run_all_unittests.cc11
-rw-r--r--chrome/service/cloud_print/print_system_win.cc22
-rw-r--r--chrome_frame/test/reliability/reliability_test_suite.h18
-rw-r--r--chrome_frame/update_launcher.cc14
-rw-r--r--chrome_frame/urlmon_url_request.cc4
-rw-r--r--chrome_frame/urlmon_url_request.h11
-rw-r--r--chrome_frame/utils.h21
-rw-r--r--content/browser/accessibility/browser_accessibility_win_unittest.cc13
-rw-r--r--content/browser/accessibility/cross_platform_accessibility_browsertest.cc12
-rw-r--r--content/browser/browser_process_sub_thread.cc15
-rw-r--r--content/browser/browser_process_sub_thread.h12
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc16
-rw-r--r--content/plugin/plugin_main.cc6
-rw-r--r--net/url_request/url_request_unittest.cc4
-rw-r--r--remoting/host/setup/daemon_controller_win.cc9
-rw-r--r--ui/base/dialogs/base_shell_dialog_win.cc13
22 files changed, 173 insertions, 164 deletions
diff --git a/base/win/scoped_comptr_unittest.cc b/base/win/scoped_comptr_unittest.cc
index 54dcfc0..d8d12be8 100644
--- a/base/win/scoped_comptr_unittest.cc
+++ b/base/win/scoped_comptr_unittest.cc
@@ -7,6 +7,7 @@
#include <shlobj.h>
#include "base/memory/scoped_ptr.h"
+#include "base/win/scoped_com_initializer.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace base {
@@ -33,50 +34,47 @@ TEST(ScopedComPtrTest, ScopedComPtr) {
EXPECT_TRUE(memcmp(&ScopedComPtr<IUnknown>::iid(), &IID_IUnknown,
sizeof(IID)) == 0);
- EXPECT_TRUE(SUCCEEDED(::CoInitialize(NULL)));
-
- {
- ScopedComPtr<IUnknown> unk;
- EXPECT_TRUE(SUCCEEDED(unk.CreateInstance(CLSID_ShellLink)));
- ScopedComPtr<IUnknown> unk2;
- unk2.Attach(unk.Detach());
- EXPECT_TRUE(unk == NULL);
- EXPECT_TRUE(unk2 != NULL);
-
- ScopedComPtr<IMalloc> mem_alloc;
- EXPECT_TRUE(SUCCEEDED(CoGetMalloc(1, mem_alloc.Receive())));
-
- ScopedComPtr<IUnknown> qi_test;
- EXPECT_HRESULT_SUCCEEDED(mem_alloc.QueryInterface(IID_IUnknown,
- reinterpret_cast<void**>(qi_test.Receive())));
- EXPECT_TRUE(qi_test.get() != NULL);
- qi_test.Release();
-
- // test ScopedComPtr& constructor
- ScopedComPtr<IMalloc> copy1(mem_alloc);
- EXPECT_TRUE(copy1.IsSameObject(mem_alloc));
- EXPECT_FALSE(copy1.IsSameObject(unk2)); // unk2 is valid but different
- EXPECT_FALSE(copy1.IsSameObject(unk)); // unk is NULL
-
- IMalloc* naked_copy = copy1.Detach();
- copy1 = naked_copy; // Test the =(T*) operator.
- naked_copy->Release();
-
- copy1.Release();
- EXPECT_FALSE(copy1.IsSameObject(unk2)); // unk2 is valid, copy1 is not
-
- // test Interface* constructor
- ScopedComPtr<IMalloc> copy2(static_cast<IMalloc*>(mem_alloc));
- EXPECT_TRUE(copy2.IsSameObject(mem_alloc));
-
- EXPECT_TRUE(SUCCEEDED(unk.QueryFrom(mem_alloc)));
- EXPECT_TRUE(unk != NULL);
- unk.Release();
- EXPECT_TRUE(unk == NULL);
- EXPECT_TRUE(unk.IsSameObject(copy1)); // both are NULL
- }
-
- ::CoUninitialize();
+ base::win::ScopedCOMInitializer com_initializer;
+ EXPECT_TRUE(com_initializer.succeeded());
+
+ ScopedComPtr<IUnknown> unk;
+ EXPECT_TRUE(SUCCEEDED(unk.CreateInstance(CLSID_ShellLink)));
+ ScopedComPtr<IUnknown> unk2;
+ unk2.Attach(unk.Detach());
+ EXPECT_TRUE(unk == NULL);
+ EXPECT_TRUE(unk2 != NULL);
+
+ ScopedComPtr<IMalloc> mem_alloc;
+ EXPECT_TRUE(SUCCEEDED(CoGetMalloc(1, mem_alloc.Receive())));
+
+ ScopedComPtr<IUnknown> qi_test;
+ EXPECT_HRESULT_SUCCEEDED(mem_alloc.QueryInterface(IID_IUnknown,
+ reinterpret_cast<void**>(qi_test.Receive())));
+ EXPECT_TRUE(qi_test.get() != NULL);
+ qi_test.Release();
+
+ // test ScopedComPtr& constructor
+ ScopedComPtr<IMalloc> copy1(mem_alloc);
+ EXPECT_TRUE(copy1.IsSameObject(mem_alloc));
+ EXPECT_FALSE(copy1.IsSameObject(unk2)); // unk2 is valid but different
+ EXPECT_FALSE(copy1.IsSameObject(unk)); // unk is NULL
+
+ IMalloc* naked_copy = copy1.Detach();
+ copy1 = naked_copy; // Test the =(T*) operator.
+ naked_copy->Release();
+
+ copy1.Release();
+ EXPECT_FALSE(copy1.IsSameObject(unk2)); // unk2 is valid, copy1 is not
+
+ // test Interface* constructor
+ ScopedComPtr<IMalloc> copy2(static_cast<IMalloc*>(mem_alloc));
+ EXPECT_TRUE(copy2.IsSameObject(mem_alloc));
+
+ EXPECT_TRUE(SUCCEEDED(unk.QueryFrom(mem_alloc)));
+ EXPECT_TRUE(unk != NULL);
+ unk.Release();
+ EXPECT_TRUE(unk == NULL);
+ EXPECT_TRUE(unk.IsSameObject(copy1)); // both are NULL
}
TEST(ScopedComPtrTest, ScopedComPtrVector) {
diff --git a/base/win/shortcut_unittest.cc b/base/win/shortcut_unittest.cc
index e0e4387..e13bc28 100644
--- a/base/win/shortcut_unittest.cc
+++ b/base/win/shortcut_unittest.cc
@@ -4,9 +4,6 @@
#include "base/win/shortcut.h"
-#include <windows.h>
-#include <objbase.h>
-
#include <string>
#include "base/file_path.h"
@@ -14,6 +11,7 @@
#include "base/scoped_temp_dir.h"
#include "base/test/test_file_util.h"
#include "base/test/test_shortcut_win.h"
+#include "base/win/scoped_com_initializer.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
@@ -27,8 +25,6 @@ class ShortcutTest : public testing::Test {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
ASSERT_TRUE(temp_dir_2_.CreateUniqueTempDir());
- EXPECT_EQ(S_OK, CoInitialize(NULL));
-
link_file_ = temp_dir_.path().Append(L"My Link.lnk");
// Shortcut 1's properties
@@ -65,10 +61,7 @@ class ShortcutTest : public testing::Test {
}
}
- virtual void TearDown() OVERRIDE {
- CoUninitialize();
- }
-
+ base::win::ScopedCOMInitializer com_initializer_;
ScopedTempDir temp_dir_;
ScopedTempDir temp_dir_2_;
diff --git a/chrome/browser/history/history_publisher.h b/chrome/browser/history/history_publisher.h
index 51d6504..5585290 100644
--- a/chrome/browser/history/history_publisher.h
+++ b/chrome/browser/history/history_publisher.h
@@ -11,6 +11,7 @@
#include "base/string16.h"
#if defined(OS_WIN)
+#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_comptr.h"
#include "history_indexer.h"
#endif
@@ -71,6 +72,8 @@ class HistoryPublisher {
// The Registry key under HKCU where the indexers need to register their
// CLSID.
static const wchar_t* const kRegKeyRegisteredIndexersInfo;
+
+ base::win::ScopedCOMInitializer com_initializer_;
#endif
// The format of the thumbnail we pass to indexers.
diff --git a/chrome/browser/history/history_publisher_win.cc b/chrome/browser/history/history_publisher_win.cc
index ac04a87..706b6e6 100644
--- a/chrome/browser/history/history_publisher_win.cc
+++ b/chrome/browser/history/history_publisher_win.cc
@@ -5,7 +5,6 @@
#include "chrome/browser/history/history_publisher.h"
#include <atlsafe.h>
-#include <objbase.h>
#include <oleauto.h>
#include <wtypes.h>
@@ -70,11 +69,9 @@ double HistoryPublisher::TimeToUTCVariantTime(const base::Time& time) {
}
HistoryPublisher::HistoryPublisher() {
- CoInitialize(NULL);
}
HistoryPublisher::~HistoryPublisher() {
- CoUninitialize();
}
bool HistoryPublisher::Init() {
diff --git a/chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc b/chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc
index b152c81..319cd91 100644
--- a/chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc
+++ b/chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc
@@ -5,6 +5,7 @@
#include <oleacc.h>
#include "base/utf_string_conversions.h"
+#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_comptr.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
@@ -55,15 +56,18 @@ class BrowserViewsAccessibilityTest : public InProcessBrowserTest {
void TestAccessibilityInfo(IAccessible* acc_obj,
std::wstring name,
int32 role);
+
+ private:
+ base::win::ScopedCOMInitializer com_initializer_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserViewsAccessibilityTest);
};
BrowserViewsAccessibilityTest::BrowserViewsAccessibilityTest() {
ui::win::CreateATLModuleIfNeeded();
- ::CoInitialize(NULL);
}
BrowserViewsAccessibilityTest::~BrowserViewsAccessibilityTest() {
- ::CoUninitialize();
}
BrowserWindowTesting* BrowserViewsAccessibilityTest::GetBrowserWindowTesting() {
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
index 9d621b5..2219e45 100644
--- a/chrome/installer/setup/setup_main.cc
+++ b/chrome/installer/setup/setup_main.cc
@@ -21,6 +21,7 @@
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "base/win/registry.h"
+#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_comptr.h"
#include "base/win/scoped_handle.h"
#include "base/win/win_util.h"
@@ -1317,26 +1318,6 @@ bool ShowRebootDialog() {
return true;
}
-// Class to manage COM initialization and uninitialization
-class AutoCom {
- public:
- AutoCom() : initialized_(false) { }
- ~AutoCom() {
- if (initialized_) CoUninitialize();
- }
- bool Init(bool system_install) {
- if (CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) != S_OK) {
- LOG(ERROR) << "COM initialization failed.";
- return false;
- }
- initialized_ = true;
- return true;
- }
-
- private:
- bool initialized_;
-};
-
// Returns the Custom information for the client identified by the exe path
// passed in. This information is used for crash reporting.
google_breakpad::CustomClientInfo* GetCustomInfo(const wchar_t* exe_path) {
@@ -1444,8 +1425,8 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance,
}
// Initialize COM for use later.
- AutoCom auto_com;
- if (!auto_com.Init(system_install)) {
+ base::win::ScopedCOMInitializer com_initializer;
+ if (!com_initializer.succeeded()) {
installer_state.WriteInstallerResult(
installer::OS_ERROR, IDS_INSTALL_OS_ERROR_BASE, NULL);
return installer::OS_ERROR;
diff --git a/chrome/installer/util/run_all_unittests.cc b/chrome/installer/util/run_all_unittests.cc
index 79a2e4b..faa57e62 100644
--- a/chrome/installer/util/run_all_unittests.cc
+++ b/chrome/installer/util/run_all_unittests.cc
@@ -2,9 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <shlobj.h>
-
#include "base/test/test_suite.h"
+#include "base/win/scoped_com_initializer.h"
#include "chrome/common/chrome_paths.h"
int main(int argc, char** argv) {
@@ -13,10 +12,6 @@ int main(int argc, char** argv) {
// Register Chrome Path provider so that we can get test data dir.
chrome::RegisterPathProvider();
- if (CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) != S_OK)
- return -1;
-
- int ret = test_suite.Run();
- CoUninitialize();
- return ret;
+ base::win::ScopedCOMInitializer com_initializer;
+ return com_initializer.succeeded() ? test_suite.Run() : -1;
}
diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc
index 6e92465..adc20c7 100644
--- a/chrome/service/cloud_print/print_system_win.cc
+++ b/chrome/service/cloud_print/print_system_win.cc
@@ -15,6 +15,7 @@
#include "base/utf_string_conversions.h"
#include "base/win/object_watcher.h"
#include "base/win/scoped_bstr.h"
+#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_comptr.h"
#include "base/win/scoped_hdc.h"
#include "chrome/common/child_process_logging.h"
@@ -389,8 +390,7 @@ class PrintSystemWin : public PrintSystem {
: last_page_printed_(-1),
job_id_(-1),
delegate_(NULL),
- saved_dc_(0),
- should_couninit_(false) {
+ saved_dc_(0) {
}
~Core() {}
@@ -514,10 +514,8 @@ class PrintSystemWin : public PrintSystem {
job_progress_watcher_.StopWatching();
job_progress_watcher_.StartWatching(job_progress_event_.Get(), this);
}
- if (done && should_couninit_) {
- CoUninitialize();
- should_couninit_ = false;
- }
+ if (done)
+ com_initializer_.reset();
}
virtual void OnRenderPDFPagesToMetafileFailed() OVERRIDE {
@@ -595,8 +593,9 @@ class PrintSystemWin : public PrintSystem {
job_progress_event_.Set(CreateEvent(NULL, TRUE, FALSE, NULL));
if (!job_progress_event_.Get())
return false;
- should_couninit_ = SUCCEEDED(CoInitializeEx(NULL,
- COINIT_MULTITHREADED));
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer(
+ new base::win::ScopedCOMInitializer(
+ base::win::ScopedCOMInitializer::kMTA));
base::win::ScopedComPtr<IXpsPrintJobStream> doc_stream;
base::win::ScopedComPtr<IXpsPrintJobStream> print_ticket_stream;
bool ret = false;
@@ -628,6 +627,7 @@ class PrintSystemWin : public PrintSystem {
if (SUCCEEDED(doc_stream->Close())) {
job_progress_watcher_.StartWatching(job_progress_event_.Get(),
this);
+ com_initializer_.swap(com_initializer);
ret = true;
}
}
@@ -639,10 +639,6 @@ class PrintSystemWin : public PrintSystem {
xps_print_job_->Cancel();
xps_print_job_.Release();
}
- if (should_couninit_) {
- CoUninitialize();
- should_couninit_ = false;
- }
}
return ret;
}
@@ -662,7 +658,7 @@ class PrintSystemWin : public PrintSystem {
base::win::ScopedHandle job_progress_event_;
base::win::ObjectWatcher job_progress_watcher_;
base::win::ScopedComPtr<IXpsPrintJob> xps_print_job_;
- bool should_couninit_;
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
DISALLOW_COPY_AND_ASSIGN(Core);
};
diff --git a/chrome_frame/test/reliability/reliability_test_suite.h b/chrome_frame/test/reliability/reliability_test_suite.h
index e245ba5..af58003 100644
--- a/chrome_frame/test/reliability/reliability_test_suite.h
+++ b/chrome_frame/test/reliability/reliability_test_suite.h
@@ -5,8 +5,7 @@
#ifndef CHROME_FRAME_TEST_RELIABILITY_RELIABILITY_TEST_SUITE_H_
#define CHROME_FRAME_TEST_RELIABILITY_RELIABILITY_TEST_SUITE_H_
-#include <objbase.h>
-
+#include "base/win/scoped_com_initializer.h"
#include "chrome_frame/test/reliability/page_load_test.h"
#include "chrome/test/ui/ui_test_suite.h"
@@ -15,17 +14,22 @@ class ReliabilityTestSuite : public UITestSuite {
ReliabilityTestSuite(int argc, char** argv) : UITestSuite(argc, argv) {
}
- protected:
- virtual void Initialize() {
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
+ private:
+ virtual void Initialize() OVERRIDE {
+ com_initializer_.reset(new base::win::ScopedCOMInitializer(
+ base::win::ScopedCOMInitializer::kMTA));
SetPageRange(*CommandLine::ForCurrentProcess());
UITestSuite::Initialize();
}
- virtual void Shutdown() {
- CoUninitialize();
+ virtual void Shutdown() OVERRIDE {
UITestSuite::Shutdown();
+ com_initializer_.reset();
}
+
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+
+ DISALLOW_COPY_AND_ASSIGN(ReliabilityTestSuite);
};
#endif // CHROME_FRAME_TEST_RELIABILITY_RELIABILITY_TEST_SUITE_H_
diff --git a/chrome_frame/update_launcher.cc b/chrome_frame/update_launcher.cc
index b2d23123..439626d 100644
--- a/chrome_frame/update_launcher.cc
+++ b/chrome_frame/update_launcher.cc
@@ -7,6 +7,7 @@
#include <windows.h>
#include <Shellapi.h>
+#include "base/win/scoped_com_initializer.h"
#include "google_update/google_update_idl.h"
namespace {
@@ -54,15 +55,14 @@ std::wstring GetUpdateCommandFromArguments(const wchar_t* command_line) {
DWORD LaunchUpdateCommand(const std::wstring& command) {
DWORD exit_code = kLaunchFailureExitCode;
- HRESULT hr = ::CoInitialize(NULL);
-
- if (SUCCEEDED(hr)) {
+ base::win::ScopedCOMInitializer com_initializer;
+ if (com_initializer.succeeded()) {
IProcessLauncher* ipl = NULL;
HANDLE process = NULL;
- hr = ::CoCreateInstance(__uuidof(ProcessLauncherClass), NULL,
- CLSCTX_ALL, __uuidof(IProcessLauncher),
- reinterpret_cast<void**>(&ipl));
+ HRESULT hr = ::CoCreateInstance(__uuidof(ProcessLauncherClass), NULL,
+ CLSCTX_ALL, __uuidof(IProcessLauncher),
+ reinterpret_cast<void**>(&ipl));
if (SUCCEEDED(hr)) {
ULONG_PTR phandle = NULL;
@@ -80,8 +80,6 @@ DWORD LaunchUpdateCommand(const std::wstring& command) {
::CloseHandle(process);
if (ipl)
ipl->Release();
-
- ::CoUninitialize();
}
return exit_code;
diff --git a/chrome_frame/urlmon_url_request.cc b/chrome_frame/urlmon_url_request.cc
index bf441b3..535debb 100644
--- a/chrome_frame/urlmon_url_request.cc
+++ b/chrome_frame/urlmon_url_request.cc
@@ -1455,9 +1455,9 @@ UrlmonUrlRequestManager::ResourceFetcherThread::~ResourceFetcherThread() {
}
void UrlmonUrlRequestManager::ResourceFetcherThread::Init() {
- CoInitialize(NULL);
+ com_initializer_.reset(new base::win::ScopedCOMInitializer());
}
void UrlmonUrlRequestManager::ResourceFetcherThread::CleanUp() {
- CoUninitialize();
+ com_initializer_.reset();
}
diff --git a/chrome_frame/urlmon_url_request.h b/chrome_frame/urlmon_url_request.h
index b74b881..94027ff 100644
--- a/chrome_frame/urlmon_url_request.h
+++ b/chrome_frame/urlmon_url_request.h
@@ -16,6 +16,12 @@
#include "chrome_frame/urlmon_moniker.h"
#include "chrome_frame/utils.h"
+namespace base {
+namespace win {
+class ScopedCOMInitializer;
+}
+}
+
class UrlmonUrlRequest;
class UrlmonUrlRequestManager
@@ -30,6 +36,11 @@ class UrlmonUrlRequestManager
virtual void Init();
virtual void CleanUp();
+
+ private:
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+
+ DISALLOW_COPY_AND_ASSIGN(ResourceFetcherThread);
};
// Contains the privacy information for all requests issued by this instance.
diff --git a/chrome_frame/utils.h b/chrome_frame/utils.h
index a741b65..389a8f5 100644
--- a/chrome_frame/utils.h
+++ b/chrome_frame/utils.h
@@ -17,6 +17,7 @@
#include "base/metrics/histogram.h"
#include "base/string16.h"
#include "base/threading/thread.h"
+#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_comptr.h"
#include "googleurl/src/gurl.h"
#include "ui/gfx/rect.h"
@@ -399,22 +400,26 @@ STDMETHODIMP QueryInterfaceIfDelegateSupports(void* obj, REFIID iid,
class STAThread : public base::Thread {
public:
explicit STAThread(const char *name) : Thread(name) {}
- ~STAThread() {
+ virtual ~STAThread() {
Stop();
}
+
bool Start() {
return StartWithOptions(Options(MessageLoop::TYPE_UI, 0));
}
- protected:
- // Called just prior to starting the message loop
- virtual void Init() {
- ::CoInitialize(0);
+
+ private:
+ virtual void Init() OVERRIDE {
+ com_initializer_.reset(new base::win::ScopedCOMInitializer());
}
- // Called just after the message loop ends
- virtual void CleanUp() {
- ::CoUninitialize();
+ virtual void CleanUp() OVERRIDE {
+ com_initializer_.reset();
}
+
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+
+ DISALLOW_COPY_AND_ASSIGN(STAThread);
};
std::wstring GuidToString(const GUID& guid);
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc
index 264d8a2..bca0f99 100644
--- a/content/browser/accessibility/browser_accessibility_win_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/memory/scoped_ptr.h"
+#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_comptr.h"
#include "content/browser/accessibility/browser_accessibility_manager.h"
#include "content/browser/accessibility/browser_accessibility_win.h"
@@ -51,15 +52,17 @@ VARIANT CreateI4Variant(LONG value) {
}
class BrowserAccessibilityTest : public testing::Test {
- protected:
+ public:
+ BrowserAccessibilityTest() {}
+
+ private:
virtual void SetUp() {
ui::win::CreateATLModuleIfNeeded();
- ::CoInitialize(NULL);
}
- virtual void TearDown() {
- ::CoUninitialize();
- }
+ base::win::ScopedCOMInitializer com_initializer_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityTest);
};
// Test that BrowserAccessibilityManager correctly releases the tree of
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
index 2b52e613..7135283 100644
--- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
+++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -19,6 +19,7 @@
#if defined(OS_WIN)
#include <atlbase.h>
#include <atlcom.h>
+#include "base/win/scoped_com_initializer.h"
#include "ui/base/win/atl_module.h"
#endif
@@ -66,19 +67,26 @@ class CrossPlatformAccessibilityBrowserTest : public ContentBrowserTest {
const AccessibilityNodeData::IntAttribute attr);
bool GetBoolAttr(const AccessibilityNodeData& node,
const AccessibilityNodeData::BoolAttribute attr);
+
+ private:
+#if defined(OS_WIN)
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+#endif
+
+ DISALLOW_COPY_AND_ASSIGN(CrossPlatformAccessibilityBrowserTest);
};
void CrossPlatformAccessibilityBrowserTest::SetUpInProcessBrowserTestFixture() {
#if defined(OS_WIN)
ui::win::CreateATLModuleIfNeeded();
- ::CoInitialize(NULL);
+ com_initializer_.reset(new base::win::ScopedCOMInitializer());
#endif
}
void
CrossPlatformAccessibilityBrowserTest::TearDownInProcessBrowserTestFixture() {
#if defined(OS_WIN)
- ::CoUninitialize();
+ com_initializer_.reset();
#endif
}
diff --git a/content/browser/browser_process_sub_thread.cc b/content/browser/browser_process_sub_thread.cc
index 19a9e15..942ecd9 100644
--- a/content/browser/browser_process_sub_thread.cc
+++ b/content/browser/browser_process_sub_thread.cc
@@ -4,10 +4,6 @@
#include "content/browser/browser_process_sub_thread.h"
-#if defined(OS_WIN)
-#include <Objbase.h>
-#endif
-
#include "base/debug/leak_tracker.h"
#include "base/threading/thread_restrictions.h"
#include "build/build_config.h"
@@ -16,6 +12,10 @@
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request.h"
+#if defined(OS_WIN)
+#include "base/win/scoped_com_initializer.h"
+#endif
+
namespace content {
BrowserProcessSubThread::BrowserProcessSubThread(BrowserThread::ID identifier)
@@ -28,8 +28,7 @@ BrowserProcessSubThread::~BrowserProcessSubThread() {
void BrowserProcessSubThread::Init() {
#if defined(OS_WIN)
- // Initializes the COM library on the current thread.
- CoInitialize(NULL);
+ com_initializer_.reset(new base::win::ScopedCOMInitializer());
#endif
notification_service_.reset(new NotificationServiceImpl());
@@ -54,9 +53,7 @@ void BrowserProcessSubThread::CleanUp() {
notification_service_.reset();
#if defined(OS_WIN)
- // Closes the COM library on the current thread. CoInitialize must
- // be balanced by a corresponding call to CoUninitialize.
- CoUninitialize();
+ com_initializer_.reset();
#endif
}
diff --git a/content/browser/browser_process_sub_thread.h b/content/browser/browser_process_sub_thread.h
index 7efb8af..e006388 100644
--- a/content/browser/browser_process_sub_thread.h
+++ b/content/browser/browser_process_sub_thread.h
@@ -9,6 +9,14 @@
#include "content/browser/browser_thread_impl.h"
#include "content/common/content_export.h"
+#if defined(OS_WIN)
+namespace base {
+namespace win {
+class ScopedCOMInitializer;
+}
+}
+#endif
+
namespace content {
class NotificationService;
}
@@ -38,6 +46,10 @@ class CONTENT_EXPORT BrowserProcessSubThread : public BrowserThreadImpl {
// before we call the embedder's CleanUp function.
void IOThreadPreCleanUp();
+#if defined (OS_WIN)
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+#endif
+
// Each specialized thread has its own notification service.
scoped_ptr<NotificationService> notification_service_;
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 8bc872e..912b382 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -7,10 +7,6 @@
#include "content/browser/renderer_host/render_process_host_impl.h"
-#if defined(OS_WIN)
-#include <objbase.h> // For CoInitialize/CoUninitialize.
-#endif
-
#include <algorithm>
#include <limits>
#include <vector>
@@ -122,6 +118,7 @@
#include "webkit/plugins/plugin_switches.h"
#if defined(OS_WIN)
+#include "base/win/scoped_com_initializer.h"
#include "content/common/font_cache_dispatcher_win.h"
#endif
@@ -142,14 +139,14 @@ class RendererMainThread : public base::Thread {
channel_id_(channel_id) {
}
- ~RendererMainThread() {
+ virtual ~RendererMainThread() {
Stop();
}
protected:
virtual void Init() {
#if defined(OS_WIN)
- CoInitialize(NULL);
+ com_initializer_.reset(new base::win::ScopedCOMInitializer());
#endif
render_process_.reset(new RenderProcessImpl());
@@ -160,7 +157,7 @@ class RendererMainThread : public base::Thread {
render_process_.reset();
#if defined(OS_WIN)
- CoUninitialize();
+ com_initializer_.reset();
#endif
// It's a little lame to manually set this flag. But the single process
// RendererThread will receive the WM_QUIT. We don't need to assert on
@@ -176,7 +173,12 @@ class RendererMainThread : public base::Thread {
private:
std::string channel_id_;
+#if defined(OS_WIN)
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+#endif
scoped_ptr<RenderProcess> render_process_;
+
+ DISALLOW_COPY_AND_ASSIGN(RendererMainThread);
};
namespace {
diff --git a/content/plugin/plugin_main.cc b/content/plugin/plugin_main.cc
index 696a5d6..d31f016 100644
--- a/content/plugin/plugin_main.cc
+++ b/content/plugin/plugin_main.cc
@@ -5,7 +5,6 @@
#include "build/build_config.h"
#if defined(OS_WIN)
-#include <objbase.h>
#include <windows.h>
#endif
@@ -22,6 +21,7 @@
#include "content/public/common/main_function_params.h"
#if defined(OS_WIN)
+#include "base/win/scoped_com_initializer.h"
#include "content/public/common/injection_test_win.h"
#include "sandbox/win/src/sandbox.h"
#elif defined(OS_POSIX) && !defined(OS_MACOSX)
@@ -118,7 +118,8 @@ int PluginMain(const content::MainFunctionParams& parameters) {
sandbox::TargetServices* target_services =
parameters.sandbox_info->target_services;
- CoInitialize(NULL);
+ base::win::ScopedCOMInitializer com_initializer;
+
DVLOG(1) << "Started plugin with "
<< parsed_command_line.GetCommandLineString();
@@ -183,7 +184,6 @@ int PluginMain(const content::MainFunctionParams& parameters) {
#if defined(OS_WIN)
DestroyIMEForFlash();
- CoUninitialize();
#endif
return 0;
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index d38c527..67779a0 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -64,6 +64,7 @@
#include "testing/platform_test.h"
#if defined(OS_WIN)
+#include "base/win/scoped_com_initializer.h"
#include "base/win/windows_version.h"
#endif
@@ -702,7 +703,7 @@ TEST_F(URLRequestTest, ResolveShortcutTest) {
std::wstring lnk_path = app_path.value() + L".lnk";
- CoInitialize(NULL);
+ base::win::ScopedCOMInitializer com_initializer;
// Temporarily create a shortcut for test
IShellLink* shell = NULL;
@@ -751,7 +752,6 @@ TEST_F(URLRequestTest, ResolveShortcutTest) {
// Clean the shortcut
DeleteFile(lnk_path.c_str());
- CoUninitialize();
}
#endif // defined(OS_WIN)
diff --git a/remoting/host/setup/daemon_controller_win.cc b/remoting/host/setup/daemon_controller_win.cc
index 814fa40..ca33966 100644
--- a/remoting/host/setup/daemon_controller_win.cc
+++ b/remoting/host/setup/daemon_controller_win.cc
@@ -22,6 +22,7 @@
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "base/win/scoped_bstr.h"
+#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_comptr.h"
#include "base/win/windows_version.h"
#include "remoting/base/scoped_sc_handle_win.h"
@@ -71,10 +72,12 @@ class ComThread : public base::Thread {
bool Start();
- protected:
+ private:
virtual void Init() OVERRIDE;
virtual void CleanUp() OVERRIDE;
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+
DISALLOW_COPY_AND_ASSIGN(ComThread);
};
@@ -183,11 +186,11 @@ bool ComThread::Start() {
}
void ComThread::Init() {
- CoInitialize(NULL);
+ com_initializer_.reset(new base::win::ScopedCOMInitializer());
}
void ComThread::CleanUp() {
- CoUninitialize();
+ com_initializer_.reset();
}
DaemonControllerWin::DaemonControllerWin()
diff --git a/ui/base/dialogs/base_shell_dialog_win.cc b/ui/base/dialogs/base_shell_dialog_win.cc
index 8d6072d..fa339cb 100644
--- a/ui/base/dialogs/base_shell_dialog_win.cc
+++ b/ui/base/dialogs/base_shell_dialog_win.cc
@@ -7,6 +7,7 @@
#include <algorithm>
#include "base/threading/thread.h"
+#include "base/win/scoped_com_initializer.h"
namespace {
@@ -17,11 +18,12 @@ class ShellDialogThread : public base::Thread {
ShellDialogThread() : base::Thread("Chrome_ShellDialogThread") { }
~ShellDialogThread();
- protected:
+ private:
void Init();
void CleanUp();
- private:
+ scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+
DISALLOW_COPY_AND_ASSIGN(ShellDialogThread);
};
@@ -30,14 +32,11 @@ ShellDialogThread::~ShellDialogThread() {
}
void ShellDialogThread::Init() {
- // Initializes the COM library on the current thread.
- CoInitialize(NULL);
+ com_initializer_.reset(new base::win::ScopedCOMInitializer());
}
void ShellDialogThread::CleanUp() {
- // Closes the COM library on the current thread. CoInitialize must
- // be balanced by a corresponding call to CoUninitialize.
- CoUninitialize();
+ com_initializer_.reset();
}
} // namespace