diff options
39 files changed, 328 insertions, 196 deletions
diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h index 0824b1c..ca828e9 100644 --- a/chrome/browser/browser_process.h +++ b/chrome/browser/browser_process.h @@ -47,6 +47,7 @@ class WebRtcLogUploader; namespace chrome { class MediaFileSystemRegistry; +class StorageMonitor; } namespace chrome_variations { @@ -217,6 +218,8 @@ class BrowserProcess { virtual chrome::MediaFileSystemRegistry* media_file_system_registry() = 0; + virtual chrome::StorageMonitor* storage_monitor() = 0; + virtual bool created_local_state() const = 0; #if defined(ENABLE_WEBRTC) diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 9dffeab..75897f2 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc @@ -62,6 +62,7 @@ #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/shell_integration.h" #include "chrome/browser/status_icons/status_tray.h" +#include "chrome/browser/storage_monitor/storage_monitor.h" #include "chrome/browser/thumbnails/render_widget_snapshot_taker.h" #include "chrome/browser/ui/bookmarks/bookmark_prompt_controller.h" #include "chrome/browser/ui/browser_finder.h" @@ -106,7 +107,7 @@ #include "ui/aura/env.h" #endif -#if !defined(OS_ANDROID) +#if !defined(OS_ANDROID) && !defined(OS_IOS) #include "chrome/browser/media_galleries/media_file_system_registry.h" #endif @@ -251,6 +252,15 @@ void BrowserProcessImpl::StartTearDown() { ExtensionRendererState::GetInstance()->Shutdown(); +#if !defined(OS_ANDROID) && !defined(OS_IOS) + media_file_system_registry_.reset(); + // Delete |storage_monitor_| now. Otherwise the FILE thread would be gone + // when we try to release it in the dtor and Valgrind would report a + // leak on almost every single browser_test. + // TODO(gbillock): Make this unnecessary. + storage_monitor_.reset(); +#endif + message_center::MessageCenter::Shutdown(); #if defined(ENABLE_CONFIGURATION_POLICY) @@ -619,9 +629,24 @@ BookmarkPromptController* BrowserProcessImpl::bookmark_prompt_controller() { #endif } +chrome::StorageMonitor* BrowserProcessImpl::storage_monitor() { +#if defined(OS_ANDROID) || defined(OS_IOS) + return NULL; +#else + return storage_monitor_.get(); +#endif +} + +void BrowserProcessImpl::set_storage_monitor_for_test( + scoped_ptr<chrome::StorageMonitor> monitor) { +#if !defined(OS_ANDROID) && !defined(OS_IOS) + storage_monitor_ = monitor.Pass(); +#endif +} + chrome::MediaFileSystemRegistry* BrowserProcessImpl::media_file_system_registry() { -#if defined(OS_ANDROID) +#if defined(OS_ANDROID) || defined(OS_IOS) return NULL; #else if (!media_file_system_registry_) @@ -910,6 +935,10 @@ void BrowserProcessImpl::PreMainMessageLoopRun() { } #endif +#if !defined(OS_ANDROID) && !defined(OS_IOS) + storage_monitor_.reset(chrome::StorageMonitor::Create()); +#endif + #if defined(OS_MACOSX) app_shim_host_manager_.reset(new AppShimHostManager); AppListService::InitAll(NULL); diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h index 66191dc..50a76d1 100644 --- a/chrome/browser/browser_process_impl.h +++ b/chrome/browser/browser_process_impl.h @@ -127,6 +127,8 @@ class BrowserProcessImpl : public BrowserProcess, virtual CRLSetFetcher* crl_set_fetcher() OVERRIDE; virtual PnaclComponentInstaller* pnacl_component_installer() OVERRIDE; virtual BookmarkPromptController* bookmark_prompt_controller() OVERRIDE; + virtual chrome::StorageMonitor* storage_monitor() OVERRIDE; + void set_storage_monitor_for_test(scoped_ptr<chrome::StorageMonitor> monitor); virtual chrome::MediaFileSystemRegistry* media_file_system_registry() OVERRIDE; virtual bool created_local_state() const OVERRIDE; @@ -196,6 +198,10 @@ class BrowserProcessImpl : public BrowserProcess, // Bookmark prompt controller displays the prompt for frequently visited URL. scoped_ptr<BookmarkPromptController> bookmark_prompt_controller_; +#endif + +#if !defined(OS_ANDROID) && !defined(OS_IOS) + scoped_ptr<chrome::StorageMonitor> storage_monitor_; scoped_ptr<chrome::MediaFileSystemRegistry> media_file_system_registry_; #endif diff --git a/chrome/browser/chrome_browser_main_linux.cc b/chrome/browser/chrome_browser_main_linux.cc index dd83909..299154d 100644 --- a/chrome/browser/chrome_browser_main_linux.cc +++ b/chrome/browser/chrome_browser_main_linux.cc @@ -118,11 +118,6 @@ void ChromeBrowserMainPartsLinux::PreProfileInit() { if (IsCrashReportingEnabled(local_state())) InitCrashReporter(); -#if !defined(OS_CHROMEOS) - const base::FilePath kDefaultMtabPath("/etc/mtab"); - storage_monitor_.reset(new chrome::StorageMonitorLinux(kDefaultMtabPath)); -#endif - ChromeBrowserMainPartsPosix::PreProfileInit(); } @@ -132,14 +127,3 @@ void ChromeBrowserMainPartsLinux::PostProfileInit() { g_browser_process->metrics_service()->RecordBreakpadRegistration( IsCrashReporterEnabled()); } - -void ChromeBrowserMainPartsLinux::PostMainMessageLoopRun() { - ChromeBrowserMainPartsPosix::PostMainMessageLoopRun(); - -#if !defined(OS_CHROMEOS) - // Delete it now. Otherwise the FILE thread would be gone when we try to - // release it in the dtor and Valgrind would report a leak on almost every - // single browser_test. - storage_monitor_.reset(); -#endif -} diff --git a/chrome/browser/chrome_browser_main_linux.h b/chrome/browser/chrome_browser_main_linux.h index 3cc5476..37f35ce 100644 --- a/chrome/browser/chrome_browser_main_linux.h +++ b/chrome/browser/chrome_browser_main_linux.h @@ -8,15 +8,8 @@ #define CHROME_BROWSER_CHROME_BROWSER_MAIN_LINUX_H_ #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/chrome_browser_main_posix.h" -#if !defined(OS_CHROMEOS) -namespace chrome { -class StorageMonitorLinux; -} -#endif - class ChromeBrowserMainPartsLinux : public ChromeBrowserMainPartsPosix { public: explicit ChromeBrowserMainPartsLinux( @@ -26,13 +19,8 @@ class ChromeBrowserMainPartsLinux : public ChromeBrowserMainPartsPosix { // ChromeBrowserMainParts overrides. virtual void PreProfileInit() OVERRIDE; virtual void PostProfileInit() OVERRIDE; - virtual void PostMainMessageLoopRun() OVERRIDE; private: -#if !defined(OS_CHROMEOS) - scoped_ptr<chrome::StorageMonitorLinux> storage_monitor_; -#endif - DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsLinux); }; diff --git a/chrome/browser/chrome_browser_main_mac.h b/chrome/browser/chrome_browser_main_mac.h index 52f6cf1..efe1bc7 100644 --- a/chrome/browser/chrome_browser_main_mac.h +++ b/chrome/browser/chrome_browser_main_mac.h @@ -5,13 +5,8 @@ #ifndef CHROME_BROWSER_CHROME_BROWSER_MAIN_MAC_H_ #define CHROME_BROWSER_CHROME_BROWSER_MAIN_MAC_H_ -#include "base/memory/scoped_ptr.h" #include "chrome/browser/chrome_browser_main_posix.h" -namespace chrome { -class StorageMonitorMac; -} - class ChromeBrowserMainPartsMac : public ChromeBrowserMainPartsPosix { public: explicit ChromeBrowserMainPartsMac( @@ -21,7 +16,6 @@ class ChromeBrowserMainPartsMac : public ChromeBrowserMainPartsPosix { // BrowserParts overrides. virtual void PreEarlyInitialization() OVERRIDE; virtual void PreMainMessageLoopStart() OVERRIDE; - virtual void PreProfileInit() OVERRIDE; virtual void PostProfileInit() OVERRIDE; // Perform platform-specific work that needs to be done after the main event @@ -29,8 +23,6 @@ class ChromeBrowserMainPartsMac : public ChromeBrowserMainPartsPosix { static void DidEndMainMessageLoop(); private: - scoped_ptr<chrome::StorageMonitorMac> storage_monitor_; - DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsMac); }; diff --git a/chrome/browser/chrome_browser_main_mac.mm b/chrome/browser/chrome_browser_main_mac.mm index af5ee81..3d41c65 100644 --- a/chrome/browser/chrome_browser_main_mac.mm +++ b/chrome/browser/chrome_browser_main_mac.mm @@ -22,7 +22,6 @@ #include "chrome/browser/mac/keychain_reauthorize.h" #import "chrome/browser/mac/keystone_glue.h" #include "chrome/browser/metrics/metrics_service.h" -#include "chrome/browser/storage_monitor/storage_monitor_mac.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "content/public/common/main_function_params.h" @@ -265,12 +264,6 @@ void ChromeBrowserMainPartsMac::PreMainMessageLoopStart() { setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; } -void ChromeBrowserMainPartsMac::PreProfileInit() { - storage_monitor_.reset(new chrome::StorageMonitorMac()); - - ChromeBrowserMainPartsPosix::PreProfileInit(); -} - void ChromeBrowserMainPartsMac::PostProfileInit() { ChromeBrowserMainPartsPosix::PostProfileInit(); g_browser_process->metrics_service()->RecordBreakpadRegistration( diff --git a/chrome/browser/chrome_browser_main_win.cc b/chrome/browser/chrome_browser_main_win.cc index 8165f82..a2e3008 100644 --- a/chrome/browser/chrome_browser_main_win.cc +++ b/chrome/browser/chrome_browser_main_win.cc @@ -27,7 +27,6 @@ #include "chrome/browser/profiles/profile_info_cache.h" #include "chrome/browser/profiles/profile_shortcut_manager.h" #include "chrome/browser/shell_integration.h" -#include "chrome/browser/storage_monitor/storage_monitor_win.h" #include "chrome/browser/search_engines/template_url.h" #include "chrome/browser/search_engines/template_url_prepopulate_data.h" #include "chrome/browser/search_engines/template_url_service.h" @@ -230,12 +229,6 @@ void ChromeBrowserMainPartsWin::PostMainMessageLoopRun() { ChromeBrowserMainParts::PostMainMessageLoopRun(); } -void ChromeBrowserMainPartsWin::PreProfileInit() { - storage_monitor_.reset(chrome::StorageMonitorWin::Create()); - - ChromeBrowserMainParts::PreProfileInit(); -} - void ChromeBrowserMainPartsWin::ShowMissingLocaleMessageBox() { ui::MessageBox(NULL, ASCIIToUTF16(chrome_browser::kMissingLocaleDataMessage), ASCIIToUTF16(chrome_browser::kMissingLocaleDataTitle), diff --git a/chrome/browser/chrome_browser_main_win.h b/chrome/browser/chrome_browser_main_win.h index 6da509e..496d234 100644 --- a/chrome/browser/chrome_browser_main_win.h +++ b/chrome/browser/chrome_browser_main_win.h @@ -7,16 +7,10 @@ #ifndef CHROME_BROWSER_CHROME_BROWSER_MAIN_WIN_H_ #define CHROME_BROWSER_CHROME_BROWSER_MAIN_WIN_H_ -#include "base/memory/scoped_ptr.h" #include "chrome/browser/chrome_browser_main.h" class CommandLine; -namespace chrome { -class StorageMonitorWin; -} // namespace chrome - - // Handle uninstallation when given the appropriate the command-line switch. // If |chrome_still_running| is true a modal dialog will be shown asking the // user to close the other chrome instance. @@ -34,7 +28,6 @@ class ChromeBrowserMainPartsWin : public ChromeBrowserMainParts { virtual void PreMainMessageLoopStart() OVERRIDE; virtual int PreCreateThreads() OVERRIDE; virtual void PostMainMessageLoopRun() OVERRIDE; - virtual void PreProfileInit() OVERRIDE; // ChromeBrowserMainParts overrides. virtual void ShowMissingLocaleMessageBox() OVERRIDE; @@ -68,8 +61,6 @@ class ChromeBrowserMainPartsWin : public ChromeBrowserMainParts { static void SetupInstallerUtilStrings(); private: - scoped_ptr<chrome::StorageMonitorWin> storage_monitor_; - DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsWin); }; diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index f31caa7..8b88552 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc @@ -84,7 +84,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/rlz/rlz.h" -#include "chrome/browser/storage_monitor/storage_monitor_chromeos.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_version_info.h" @@ -555,8 +554,6 @@ void ChromeBrowserMainPartsChromeos::PreProfileInit() { base::Bind(&ChromeOSVersionCallback), &tracker_); - storage_monitor_.reset(new StorageMonitorCros()); - // Make sure that wallpaper boot transition and other delays in OOBE // are disabled for tests and kiosk app launch by default. // Individual tests may enable them if they want. @@ -801,7 +798,6 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() { power_button_observer_.reset(); screensaver_controller_.reset(); idle_action_warning_observer_.reset(); - storage_monitor_.reset(); // Delete ContactManager while |g_browser_process| is still alive. contact_manager_.reset(); diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h index f1073b0..df86349 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h @@ -31,7 +31,6 @@ class ResumeObserver; class ScreenLockObserver; class ScreensaverController; class SessionManagerObserver; -class StorageMonitorCros; class SuspendObserver; class SwapMetrics; class UserActivityNotifier; @@ -83,7 +82,6 @@ class ChromeBrowserMainPartsChromeos : public ChromeBrowserMainPartsLinux { scoped_ptr<content::PowerSaveBlocker> retail_mode_power_save_blocker_; scoped_ptr<UserActivityNotifier> user_activity_notifier_; scoped_ptr<VideoActivityNotifier> video_activity_notifier_; - scoped_ptr<StorageMonitorCros> storage_monitor_; scoped_ptr<IdleActionWarningObserver> idle_action_warning_observer_; scoped_ptr<SwapMetrics> swap_metrics_; diff --git a/chrome/browser/extensions/api/media_galleries_private/media_galleries_eject_apitest.cc b/chrome/browser/extensions/api/media_galleries_private/media_galleries_eject_apitest.cc index 32055eb..ba8407e 100644 --- a/chrome/browser/extensions/api/media_galleries_private/media_galleries_eject_apitest.cc +++ b/chrome/browser/extensions/api/media_galleries_private/media_galleries_eject_apitest.cc @@ -53,7 +53,9 @@ base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("/qux"); class MediaGalleriesPrivateEjectApiTest : public ExtensionApiTest { public: - MediaGalleriesPrivateEjectApiTest() : device_id_(GetDeviceId()) {} + MediaGalleriesPrivateEjectApiTest() + : device_id_(GetDeviceId()), + monitor_(NULL) {} virtual ~MediaGalleriesPrivateEjectApiTest() {} protected: @@ -64,6 +66,11 @@ class MediaGalleriesPrivateEjectApiTest : public ExtensionApiTest { kTestExtensionId); } + virtual void SetUpOnMainThread() OVERRIDE { + monitor_ = chrome::test::TestStorageMonitor::CreateForBrowserTests(); + ExtensionApiTest::SetUpOnMainThread(); + } + content::RenderViewHost* GetHost() { const extensions::Extension* extension = LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath)); @@ -103,6 +110,8 @@ class MediaGalleriesPrivateEjectApiTest : public ExtensionApiTest { protected: const std::string device_id_; + chrome::test::TestStorageMonitor* monitor_; + private: DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateEjectApiTest); }; @@ -113,11 +122,6 @@ class MediaGalleriesPrivateEjectApiTest : public ExtensionApiTest { /////////////////////////////////////////////////////////////////////////////// IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateEjectApiTest, EjectTest) { - scoped_ptr<chrome::test::TestStorageMonitor> monitor( - chrome::test::TestStorageMonitor::CreateForBrowserTests()); - monitor->Init(); - monitor->MarkInitialized(); - content::RenderViewHost* host = GetHost(); ExecuteCmdAndCheckReply(host, kAddAttachListenerCmd, kAddAttachListenerOk); @@ -130,18 +134,13 @@ IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateEjectApiTest, EjectTest) { EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied()); ExecuteCmdAndCheckReply(host, kEjectTestCmd, kEjectListenerOk); - EXPECT_EQ(device_id_, monitor->ejected_device()); + EXPECT_EQ(device_id_, monitor_->ejected_device()); Detach(); } IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateEjectApiTest, EjectBadDeviceTest) { - scoped_ptr<chrome::test::TestStorageMonitor> monitor( - chrome::test::TestStorageMonitor::CreateForBrowserTests()); - monitor->Init(); - monitor->MarkInitialized(); - ExecuteCmdAndCheckReply(GetHost(), kEjectFailTestCmd, kEjectFailListenerOk); - EXPECT_EQ("", monitor->ejected_device()); + EXPECT_EQ("", monitor_->ejected_device()); } diff --git a/chrome/browser/extensions/api/media_galleries_private/media_galleries_private_apitest.cc b/chrome/browser/extensions/api/media_galleries_private/media_galleries_private_apitest.cc index 45737e5..df662f0 100644 --- a/chrome/browser/extensions/api/media_galleries_private/media_galleries_private_apitest.cc +++ b/chrome/browser/extensions/api/media_galleries_private/media_galleries_private_apitest.cc @@ -108,12 +108,8 @@ class MediaGalleriesPrivateApiTest : public ExtensionApiTest { }; IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateApiTest, DeviceAttachDetachEvents) { - scoped_ptr<chrome::test::TestStorageMonitor> monitor( - chrome::test::TestStorageMonitor::CreateForBrowserTests()); - monitor->Init(); - monitor->MarkInitialized(); - // Setup. + chrome::test::TestStorageMonitor::SyncInitialize(); const extensions::Extension* extension = LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath)); ASSERT_TRUE(extension); diff --git a/chrome/browser/extensions/api/system_info_storage/system_info_storage_apitest.cc b/chrome/browser/extensions/api/system_info_storage/system_info_storage_apitest.cc index f05dc880..671f628 100644 --- a/chrome/browser/extensions/api/system_info_storage/system_info_storage_apitest.cc +++ b/chrome/browser/extensions/api/system_info_storage/system_info_storage_apitest.cc @@ -11,14 +11,12 @@ #include "chrome/browser/extensions/extension_test_message_listener.h" #include "chrome/browser/storage_monitor/storage_info.h" #include "chrome/browser/storage_monitor/storage_monitor.h" -#include "chrome/browser/storage_monitor/test_storage_monitor.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/ui_test_utils.h" namespace { using chrome::StorageMonitor; -using chrome::test::TestStorageMonitor; using extensions::api::experimental_system_info_storage::ParseStorageUnitType; using extensions::api::experimental_system_info_storage::StorageUnitInfo; using extensions::StorageInfoProvider; @@ -87,9 +85,6 @@ IN_PROC_BROWSER_TEST_F(SystemInfoStorageApiTest, Storage) { } IN_PROC_BROWSER_TEST_F(SystemInfoStorageApiTest, StorageAttachment) { - scoped_ptr<TestStorageMonitor> monitor( - TestStorageMonitor::CreateForBrowserTests()); - TestStorageInfoProvider* provider = new TestStorageInfoProvider(kRemovableStorageData, arraysize(kRemovableStorageData)); diff --git a/chrome/browser/extensions/api/system_info_storage/system_info_storage_eject_apitest.cc b/chrome/browser/extensions/api/system_info_storage/system_info_storage_eject_apitest.cc index ba51993..7f66a00 100644 --- a/chrome/browser/extensions/api/system_info_storage/system_info_storage_eject_apitest.cc +++ b/chrome/browser/extensions/api/system_info_storage/system_info_storage_eject_apitest.cc @@ -35,7 +35,7 @@ struct TestStorageUnitInfo kRemovableStorageData[] = { class SystemInfoStorageEjectApiTest : public ExtensionApiTest { public: - SystemInfoStorageEjectApiTest() {} + SystemInfoStorageEjectApiTest() : monitor_(NULL) {} virtual ~SystemInfoStorageEjectApiTest() {} protected: @@ -45,6 +45,11 @@ class SystemInfoStorageEjectApiTest : public ExtensionApiTest { command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis); } + virtual void SetUpOnMainThread() OVERRIDE { + monitor_ = chrome::test::TestStorageMonitor::CreateForBrowserTests(); + ExtensionApiTest::SetUpOnMainThread(); + } + content::RenderViewHost* GetHost() { const extensions::Extension* extension = LoadExtension(test_data_dir_.AppendASCII("systeminfo/storage_eject")); @@ -75,17 +80,15 @@ class SystemInfoStorageEjectApiTest : public ExtensionApiTest { content::RunAllPendingInMessageLoop(); } + protected: + chrome::test::TestStorageMonitor* monitor_; + private: DISALLOW_COPY_AND_ASSIGN(SystemInfoStorageEjectApiTest); }; IN_PROC_BROWSER_TEST_F(SystemInfoStorageEjectApiTest, EjectTest) { - scoped_ptr<chrome::test::TestStorageMonitor> monitor( - chrome::test::TestStorageMonitor::CreateForBrowserTests()); - monitor->Init(); - monitor->MarkInitialized(); - TestStorageInfoProvider* provider = new TestStorageInfoProvider(kRemovableStorageData, arraysize(kRemovableStorageData)); @@ -104,17 +107,12 @@ IN_PROC_BROWSER_TEST_F(SystemInfoStorageEjectApiTest, EjectTest) { EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied()); ExecuteCmdAndCheckReply(host, "ejectTest()", "eject_ok"); - EXPECT_EQ(kRemovableStorageData[0].device_id, monitor->ejected_device()); + EXPECT_EQ(kRemovableStorageData[0].device_id, monitor_->ejected_device()); Detach(); } IN_PROC_BROWSER_TEST_F(SystemInfoStorageEjectApiTest, EjectBadDeviceTest) { - scoped_ptr<chrome::test::TestStorageMonitor> monitor( - chrome::test::TestStorageMonitor::CreateForBrowserTests()); - monitor->Init(); - monitor->MarkInitialized(); - TestStorageInfoProvider* provider = new TestStorageInfoProvider(kRemovableStorageData, arraysize(kRemovableStorageData)); @@ -122,5 +120,5 @@ IN_PROC_BROWSER_TEST_F(SystemInfoStorageEjectApiTest, EjectBadDeviceTest) { ExecuteCmdAndCheckReply(GetHost(), "ejectFailTest()", "eject_no_such_device"); - EXPECT_EQ("", monitor->ejected_device()); + EXPECT_EQ("", monitor_->ejected_device()); } diff --git a/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac_unittest.mm b/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac_unittest.mm index ec0f4fed..3543759 100644 --- a/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac_unittest.mm +++ b/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac_unittest.mm @@ -184,7 +184,9 @@ class MTPDeviceDelegateImplMacTest : public testing::Test { content::BrowserThread::IO)); ASSERT_TRUE(io_thread_->Start()); - manager_.SetNotifications(monitor_.receiver()); + chrome::test::TestStorageMonitor* monitor = + chrome::test::TestStorageMonitor::CreateAndInstall(); + manager_.SetNotifications(monitor->receiver()); camera_ = [MockMTPICCameraDevice alloc]; id<ICDeviceBrowserDelegate> delegate = manager_.device_browser(); @@ -304,7 +306,6 @@ class MTPDeviceDelegateImplMacTest : public testing::Test { scoped_ptr<content::TestBrowserThread> file_thread_; scoped_ptr<content::TestBrowserThread> io_thread_; base::ScopedTempDir temp_dir_; - chrome::test::TestStorageMonitor monitor_; chrome::ImageCaptureDeviceManager manager_; MockMTPICCameraDevice* camera_; diff --git a/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc b/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc index 8416947..93fd983 100644 --- a/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc +++ b/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc @@ -18,9 +18,11 @@ #include "chrome/browser/storage_monitor/storage_info.h" #include "chrome/browser/storage_monitor/storage_monitor.h" #include "chrome/browser/storage_monitor/test_portable_device_watcher_win.h" +#include "chrome/browser/storage_monitor/test_storage_monitor.h" #include "chrome/browser/storage_monitor/test_storage_monitor_win.h" #include "chrome/browser/storage_monitor/test_volume_mount_watcher_win.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" @@ -60,8 +62,8 @@ class MTPDeviceDelegateImplWinTest : public ChromeRenderViewHostTestHarness { bool removable, bool media_device); - // Note: need to make this weak ptr once ownership moves to g_browser_process - scoped_ptr<test::TestStorageMonitorWin> monitor_; + // Pointer to the storage monitor. Owned by TestingBrowserProcess. + test::TestStorageMonitorWin* monitor_; scoped_refptr<extensions::Extension> extension_; EnsureMediaDirectoriesExists media_directories_; @@ -69,13 +71,21 @@ class MTPDeviceDelegateImplWinTest : public ChromeRenderViewHostTestHarness { void MTPDeviceDelegateImplWinTest::SetUp() { ChromeRenderViewHostTestHarness::SetUp(); + + test::TestStorageMonitor::RemoveSingleton(); test::TestPortableDeviceWatcherWin* portable_device_watcher = new test::TestPortableDeviceWatcherWin; test::TestVolumeMountWatcherWin* mount_watcher = new test::TestVolumeMountWatcherWin; portable_device_watcher->set_use_dummy_mtp_storage_info(true); - monitor_.reset(new test::TestStorageMonitorWin( - mount_watcher, portable_device_watcher)); + scoped_ptr<test::TestStorageMonitorWin> monitor( + new test::TestStorageMonitorWin( + mount_watcher, portable_device_watcher)); + TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal(); + DCHECK(browser_process); + monitor_ = monitor.get(); + browser_process->SetStorageMonitor(monitor.Pass()); + base::RunLoop runloop; monitor_->EnsureInitialized(runloop.QuitClosure()); runloop.Run(); @@ -93,7 +103,9 @@ void MTPDeviceDelegateImplWinTest::SetUp() { } void MTPDeviceDelegateImplWinTest::TearDown() { - monitor_.reset(); + // Windows storage monitor must be destroyed on the same thread + // as construction. + test::TestStorageMonitor::RemoveSingleton(); ChromeRenderViewHostTestHarness::TearDown(); } diff --git a/chrome/browser/storage_monitor/image_capture_device_manager_unittest.mm b/chrome/browser/storage_monitor/image_capture_device_manager_unittest.mm index d6be33d..a259ef17 100644 --- a/chrome/browser/storage_monitor/image_capture_device_manager_unittest.mm +++ b/chrome/browser/storage_monitor/image_capture_device_manager_unittest.mm @@ -15,6 +15,7 @@ #include "chrome/browser/storage_monitor/image_capture_device.h" #include "chrome/browser/storage_monitor/image_capture_device_manager.h" #include "chrome/browser/storage_monitor/test_storage_monitor.h" +#include "chrome/test/base/testing_browser_process.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -257,6 +258,8 @@ class ImageCaptureDeviceManagerTest : public testing::Test { virtual void SetUp() OVERRIDE { ui_thread_.reset(new content::TestBrowserThread( content::BrowserThread::UI, &message_loop_)); + + monitor_ = chrome::test::TestStorageMonitor::CreateAndInstall(); } MockICCameraDevice* AttachDevice( @@ -278,28 +281,29 @@ class ImageCaptureDeviceManagerTest : public testing::Test { protected: base::MessageLoopForUI message_loop_; scoped_ptr<content::TestBrowserThread> ui_thread_; - chrome::test::TestStorageMonitor monitor_; + + chrome::test::TestStorageMonitor* monitor_; TestCameraListener listener_; }; TEST_F(ImageCaptureDeviceManagerTest, TestAttachDetach) { chrome::ImageCaptureDeviceManager manager; - manager.SetNotifications(monitor_.receiver()); + manager.SetNotifications(monitor_->receiver()); ICCameraDevice* device = AttachDevice(&manager); std::vector<chrome::StorageInfo> devices = - monitor_.GetAllAvailableStorages(); + monitor_->GetAllAvailableStorages(); ASSERT_EQ(1U, devices.size()); EXPECT_EQ(std::string("ic:") + kDeviceId, devices[0].device_id()); DetachDevice(&manager, device); - devices = monitor_.GetAllAvailableStorages(); + devices = monitor_->GetAllAvailableStorages(); ASSERT_EQ(0U, devices.size()); }; TEST_F(ImageCaptureDeviceManagerTest, OpenCamera) { chrome::ImageCaptureDeviceManager manager; - manager.SetNotifications(monitor_.receiver()); + manager.SetNotifications(monitor_->receiver()); ICCameraDevice* device = AttachDevice(&manager); EXPECT_FALSE(chrome::ImageCaptureDeviceManager::deviceForUUID( @@ -335,7 +339,7 @@ TEST_F(ImageCaptureDeviceManagerTest, OpenCamera) { TEST_F(ImageCaptureDeviceManagerTest, RemoveCamera) { chrome::ImageCaptureDeviceManager manager; - manager.SetNotifications(monitor_.receiver()); + manager.SetNotifications(monitor_->receiver()); ICCameraDevice* device = AttachDevice(&manager); base::scoped_nsobject<ImageCaptureDevice> camera( @@ -354,7 +358,7 @@ TEST_F(ImageCaptureDeviceManagerTest, DownloadFile) { content::BrowserThread::FILE, &message_loop_)); chrome::ImageCaptureDeviceManager manager; - manager.SetNotifications(monitor_.receiver()); + manager.SetNotifications(monitor_->receiver()); MockICCameraDevice* device = AttachDevice(&manager); base::scoped_nsobject<ImageCaptureDevice> camera( @@ -410,7 +414,7 @@ TEST_F(ImageCaptureDeviceManagerTest, TestSubdirectories) { content::BrowserThread::FILE, &message_loop_)); chrome::ImageCaptureDeviceManager manager; - manager.SetNotifications(monitor_.receiver()); + manager.SetNotifications(monitor_->receiver()); MockICCameraDevice* device = AttachDevice(&manager); base::scoped_nsobject<ImageCaptureDevice> camera( diff --git a/chrome/browser/storage_monitor/media_storage_util_unittest.cc b/chrome/browser/storage_monitor/media_storage_util_unittest.cc index 12fd336..4ed217e 100644 --- a/chrome/browser/storage_monitor/media_storage_util_unittest.cc +++ b/chrome/browser/storage_monitor/media_storage_util_unittest.cc @@ -13,6 +13,7 @@ #include "chrome/browser/storage_monitor/removable_device_constants.h" #include "chrome/browser/storage_monitor/storage_monitor.h" #include "chrome/browser/storage_monitor/test_storage_monitor.h" +#include "chrome/test/base/testing_browser_process.h" #include "content/public/browser/browser_thread.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -47,7 +48,7 @@ class MediaStorageUtilTest : public testing::Test { const string16& name, const base::FilePath::StringType& location) { StorageInfo info(id, name, location, string16(), string16(), string16(), 0); - monitor_.receiver()->ProcessAttach(info); + monitor_->receiver()->ProcessAttach(info); } protected: @@ -62,11 +63,12 @@ class MediaStorageUtilTest : public testing::Test { } virtual void SetUp() OVERRIDE { + monitor_ = chrome::test::TestStorageMonitor::CreateAndInstall(); ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); file_thread_.Start(); } - virtual void TearDown() { + virtual void TearDown() OVERRIDE { WaitForFileThread(); } @@ -86,7 +88,7 @@ class MediaStorageUtilTest : public testing::Test { base::MessageLoop message_loop_; private: - chrome::test::TestStorageMonitor monitor_; + chrome::test::TestStorageMonitor* monitor_; content::TestBrowserThread ui_thread_; content::TestBrowserThread file_thread_; base::ScopedTempDir scoped_temp_dir_; diff --git a/chrome/browser/storage_monitor/media_transfer_protocol_device_observer_linux_unittest.cc b/chrome/browser/storage_monitor/media_transfer_protocol_device_observer_linux_unittest.cc index 4a1827b..c895cee 100644 --- a/chrome/browser/storage_monitor/media_transfer_protocol_device_observer_linux_unittest.cc +++ b/chrome/browser/storage_monitor/media_transfer_protocol_device_observer_linux_unittest.cc @@ -12,10 +12,12 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/storage_monitor/mock_removable_storage_observer.h" #include "chrome/browser/storage_monitor/storage_info.h" #include "chrome/browser/storage_monitor/storage_monitor.h" #include "chrome/browser/storage_monitor/test_storage_monitor.h" +#include "chrome/test/base/testing_browser_process.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -92,13 +94,16 @@ class MediaTransferProtocolDeviceObserverLinuxTest : public testing::Test { protected: virtual void SetUp() OVERRIDE { mock_storage_observer_.reset(new MockRemovableStorageObserver); + chrome::test::TestStorageMonitor* monitor = + chrome::test::TestStorageMonitor::CreateAndInstall(); mtp_device_observer_.reset( - new TestMediaTransferProtocolDeviceObserverLinux(monitor_.receiver())); - monitor_.AddObserver(mock_storage_observer_.get()); + new TestMediaTransferProtocolDeviceObserverLinux(monitor->receiver())); + monitor->AddObserver(mock_storage_observer_.get()); } virtual void TearDown() OVERRIDE { - monitor_.RemoveObserver(mock_storage_observer_.get()); + StorageMonitor* monitor = g_browser_process->storage_monitor(); + monitor->RemoveObserver(mock_storage_observer_.get()); mtp_device_observer_.reset(); } @@ -115,7 +120,6 @@ class MediaTransferProtocolDeviceObserverLinuxTest : public testing::Test { base::MessageLoop message_loop_; content::TestBrowserThread file_thread_; - chrome::test::TestStorageMonitor monitor_; scoped_ptr<TestMediaTransferProtocolDeviceObserverLinux> mtp_device_observer_; scoped_ptr<MockRemovableStorageObserver> mock_storage_observer_; diff --git a/chrome/browser/storage_monitor/storage_monitor.cc b/chrome/browser/storage_monitor/storage_monitor.cc index a771fd5..10d043e6 100644 --- a/chrome/browser/storage_monitor/storage_monitor.cc +++ b/chrome/browser/storage_monitor/storage_monitor.cc @@ -6,13 +6,12 @@ #include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/storage_monitor/removable_storage_observer.h" #include "chrome/browser/storage_monitor/transient_device_ids.h" namespace chrome { -static StorageMonitor* g_storage_monitor = NULL; - StorageMonitor::Receiver::~Receiver() { } @@ -46,7 +45,10 @@ void StorageMonitor::ReceiverImpl::MarkInitialized() { } StorageMonitor* StorageMonitor::GetInstance() { - return g_storage_monitor; + if (g_browser_process) + return g_browser_process->storage_monitor(); + + return NULL; } std::vector<StorageInfo> StorageMonitor::GetAllAvailableStorages() const { @@ -117,18 +119,9 @@ StorageMonitor::StorageMonitor() initialized_(false), transient_device_ids_(new TransientDeviceIds) { receiver_.reset(new ReceiverImpl(this)); - - DCHECK(!g_storage_monitor); - g_storage_monitor = this; } StorageMonitor::~StorageMonitor() { - g_storage_monitor = NULL; -} - -// static -void StorageMonitor::RemoveSingletonForTesting() { - g_storage_monitor = NULL; } StorageMonitor::Receiver* StorageMonitor::receiver() const { diff --git a/chrome/browser/storage_monitor/storage_monitor.h b/chrome/browser/storage_monitor/storage_monitor.h index 9258dd4..5c0cd96 100644 --- a/chrome/browser/storage_monitor/storage_monitor.h +++ b/chrome/browser/storage_monitor/storage_monitor.h @@ -37,8 +37,8 @@ class TransientDeviceIds; // Base class for platform-specific instances watching for removable storage // attachments/detachments. -// Lifecycle contracts: This class is created by ChromeBrowserMain -// implementations before the profile is initialized, so listeners can be +// Lifecycle contracts: This class is created in the browser process +// before the profile is initialized, so listeners can be // created during profile construction. The platform-specific initialization, // which can lead to calling registered listeners with notifications of // attached volumes, are done lazily at first use through the async @@ -70,10 +70,18 @@ class StorageMonitor { EJECT_FAILURE }; - // Returns a pointer to an object owned by the BrowserMainParts, with lifetime - // somewhat shorter than a process Singleton. + // Returns a pointer to a newly created per-platform object with the + // StorageMonitor interface. + static StorageMonitor* Create(); + + // Returns a pointer to an object owned by BrowserProcess, with lifetime + // starting before main message loop start, and ending after main message loop + // shutdown. Called outside it's lifetime (or with no browser process), + // returns NULL. static StorageMonitor* GetInstance(); + virtual ~StorageMonitor(); + // Ensures that the storage monitor is initialized. The provided callback, If // non-null, will be called when initialization is complete. If initialization // has already completed, this callback will be invoked within the calling @@ -135,11 +143,6 @@ class StorageMonitor { friend class ::SystemInfoStorageEjectApiTest; StorageMonitor(); - virtual ~StorageMonitor(); - - // Removes the existing singleton for testing. - // (So that a new one can be created.) - static void RemoveSingletonForTesting(); virtual Receiver* receiver() const; diff --git a/chrome/browser/storage_monitor/storage_monitor_chromeos.cc b/chrome/browser/storage_monitor/storage_monitor_chromeos.cc index c61f530..a871fa8 100644 --- a/chrome/browser/storage_monitor/storage_monitor_chromeos.cc +++ b/chrome/browser/storage_monitor/storage_monitor_chromeos.cc @@ -307,3 +307,11 @@ void StorageMonitorCros::AddMountedPath( } } // namespace chromeos + +namespace chrome { + +StorageMonitor* StorageMonitor::Create() { + return new chromeos::StorageMonitorCros(); +} + +} // namespace chrome diff --git a/chrome/browser/storage_monitor/storage_monitor_chromeos_unittest.cc b/chrome/browser/storage_monitor/storage_monitor_chromeos_unittest.cc index 67302fd..f972c87 100644 --- a/chrome/browser/storage_monitor/storage_monitor_chromeos_unittest.cc +++ b/chrome/browser/storage_monitor/storage_monitor_chromeos_unittest.cc @@ -16,6 +16,8 @@ #include "chrome/browser/storage_monitor/removable_device_constants.h" #include "chrome/browser/storage_monitor/storage_info.h" #include "chrome/browser/storage_monitor/test_media_transfer_protocol_manager_linux.h" +#include "chrome/browser/storage_monitor/test_storage_monitor.h" +#include "chrome/test/base/testing_browser_process.h" #include "chromeos/disks/mock_disk_mount_manager.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -135,7 +137,7 @@ class StorageMonitorCrosTest : public testing::Test { base::MessageLoop ui_loop_; - scoped_ptr<TestStorageMonitorCros> monitor_; + TestStorageMonitorCros* monitor_; // Owned by DiskMountManager. disks::MockDiskMountManager* disk_mount_manager_mock_; @@ -176,14 +178,20 @@ void StorageMonitorCrosTest::SetUp() { mock_storage_observer_.reset(new chrome::MockRemovableStorageObserver); // Initialize the test subject. - monitor_.reset(new TestStorageMonitorCros()); + chrome::test::TestStorageMonitor::RemoveSingleton(); + monitor_ = new TestStorageMonitorCros(); + scoped_ptr<chrome::StorageMonitor> pass_monitor(monitor_); + TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal(); + DCHECK(browser_process); + browser_process->SetStorageMonitor(pass_monitor.Pass()); + monitor_->Init(); monitor_->AddObserver(mock_storage_observer_.get()); } void StorageMonitorCrosTest::TearDown() { monitor_->RemoveObserver(mock_storage_observer_.get()); - monitor_.reset(); + monitor_ = NULL; disk_mount_manager_mock_ = NULL; DiskMountManager::Shutdown(); diff --git a/chrome/browser/storage_monitor/storage_monitor_linux.cc b/chrome/browser/storage_monitor/storage_monitor_linux.cc index 6435529..f2154edf 100644 --- a/chrome/browser/storage_monitor/storage_monitor_linux.cc +++ b/chrome/browser/storage_monitor/storage_monitor_linux.cc @@ -513,4 +513,9 @@ void StorageMonitorLinux::AddNewMount(const base::FilePath& mount_device, receiver()->ProcessAttach(*storage_info); } +StorageMonitor* StorageMonitor::Create() { + const base::FilePath kDefaultMtabPath("/etc/mtab"); + return new StorageMonitorLinux(kDefaultMtabPath); +} + } // namespace chrome diff --git a/chrome/browser/storage_monitor/storage_monitor_linux_unittest.cc b/chrome/browser/storage_monitor/storage_monitor_linux_unittest.cc index 4c87e3d..1a19918 100644 --- a/chrome/browser/storage_monitor/storage_monitor_linux_unittest.cc +++ b/chrome/browser/storage_monitor/storage_monitor_linux_unittest.cc @@ -23,6 +23,8 @@ #include "chrome/browser/storage_monitor/storage_info.h" #include "chrome/browser/storage_monitor/storage_monitor.h" #include "chrome/browser/storage_monitor/test_media_transfer_protocol_manager_linux.h" +#include "chrome/browser/storage_monitor/test_storage_monitor.h" +#include "chrome/test/base/testing_browser_process.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -181,8 +183,13 @@ class StorageMonitorLinuxTest : public testing::Test { arraysize(initial_test_data), true /* overwrite */); - // Initialize the test subject. - monitor_.reset(new TestStorageMonitorLinux(mtab_file_, &message_loop_)); + test::TestStorageMonitor::RemoveSingleton(); + monitor_ = new TestStorageMonitorLinux(mtab_file_, &message_loop_); + scoped_ptr<StorageMonitor> pass_monitor(monitor_); + TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal(); + DCHECK(browser_process); + browser_process->SetStorageMonitor(pass_monitor.Pass()); + mock_storage_observer_.reset(new MockRemovableStorageObserver); monitor_->AddObserver(mock_storage_observer_.get()); @@ -193,8 +200,10 @@ class StorageMonitorLinuxTest : public testing::Test { virtual void TearDown() OVERRIDE { base::RunLoop().RunUntilIdle(); monitor_->RemoveObserver(mock_storage_observer_.get()); - monitor_.reset(); base::RunLoop().RunUntilIdle(); + + // Linux storage monitor must be destroyed on the UI thread, so do it here. + test::TestStorageMonitor::RemoveSingleton(); } // Append mtab entries from the |data| array of size |data_size| to the mtab @@ -243,7 +252,7 @@ class StorageMonitorLinuxTest : public testing::Test { } StorageMonitor* notifier() { - return monitor_.get(); + return monitor_; } uint64 GetStorageSize(const base::FilePath& path) { @@ -316,7 +325,7 @@ class StorageMonitorLinuxTest : public testing::Test { // Path to the test mtab file. base::FilePath mtab_file_; - scoped_ptr<TestStorageMonitorLinux> monitor_; + TestStorageMonitorLinux* monitor_; DISALLOW_COPY_AND_ASSIGN(StorageMonitorLinuxTest); }; diff --git a/chrome/browser/storage_monitor/storage_monitor_mac.mm b/chrome/browser/storage_monitor/storage_monitor_mac.mm index 346f958..f642864 100644 --- a/chrome/browser/storage_monitor/storage_monitor_mac.mm +++ b/chrome/browser/storage_monitor/storage_monitor_mac.mm @@ -369,4 +369,8 @@ bool StorageMonitorMac::FindDiskWithMountPoint( return false; } +StorageMonitor* StorageMonitor::Create() { + return new StorageMonitorMac(); +} + } // namespace chrome diff --git a/chrome/browser/storage_monitor/storage_monitor_mac_unittest.mm b/chrome/browser/storage_monitor/storage_monitor_mac_unittest.mm index b8c584f..ec3f7ff 100644 --- a/chrome/browser/storage_monitor/storage_monitor_mac_unittest.mm +++ b/chrome/browser/storage_monitor/storage_monitor_mac_unittest.mm @@ -14,6 +14,8 @@ #include "chrome/browser/storage_monitor/mock_removable_storage_observer.h" #include "chrome/browser/storage_monitor/removable_device_constants.h" #include "chrome/browser/storage_monitor/storage_info.h" +#include "chrome/browser/storage_monitor/test_storage_monitor.h" +#include "chrome/test/base/testing_browser_process.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -44,7 +46,12 @@ class StorageMonitorMacTest : public testing::Test { } virtual void SetUp() OVERRIDE { - monitor_.reset(new StorageMonitorMac); + test::TestStorageMonitor::RemoveSingleton(); + monitor_ = new StorageMonitorMac; + scoped_ptr<StorageMonitor> pass_monitor(monitor_); + TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal(); + DCHECK(browser_process); + browser_process->SetStorageMonitor(pass_monitor.Pass()); mock_storage_observer_.reset(new MockRemovableStorageObserver); monitor_->AddObserver(mock_storage_observer_.get()); @@ -60,7 +67,7 @@ class StorageMonitorMacTest : public testing::Test { void UpdateDisk(StorageInfo info, StorageMonitorMac::UpdateType update_type) { content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, base::Bind(&StorageMonitorMac::UpdateDisk, - base::Unretained(monitor_.get()), + base::Unretained(monitor_), "dummy_bsd_name", info, update_type)); base::RunLoop().RunUntilIdle(); } @@ -79,7 +86,7 @@ class StorageMonitorMacTest : public testing::Test { std::string device_id_; StorageInfo disk_info_; - scoped_ptr<StorageMonitorMac> monitor_; + StorageMonitorMac* monitor_; }; TEST_F(StorageMonitorMacTest, AddRemove) { diff --git a/chrome/browser/storage_monitor/storage_monitor_unittest.cc b/chrome/browser/storage_monitor/storage_monitor_unittest.cc index 50a3a4a..a98ec54 100644 --- a/chrome/browser/storage_monitor/storage_monitor_unittest.cc +++ b/chrome/browser/storage_monitor/storage_monitor_unittest.cc @@ -10,22 +10,31 @@ #include "chrome/browser/storage_monitor/test_storage_monitor.h" #include "testing/gtest/include/gtest/gtest.h" +namespace { + +void SetLatch(bool* called) { + *called = true; +} + +} // namespace + namespace chrome { TEST(StorageMonitorTest, TestInitialize) { + test::TestStorageMonitor::RemoveSingleton(); test::TestStorageMonitor monitor; EXPECT_FALSE(monitor.init_called_); - base::WaitableEvent event(false, false); - monitor.EnsureInitialized(base::Bind(&base::WaitableEvent::Signal, - base::Unretained(&event))); + bool initialized = false; + monitor.EnsureInitialized(base::Bind(&SetLatch, &initialized)); EXPECT_TRUE(monitor.init_called_); - EXPECT_FALSE(event.IsSignaled()); + EXPECT_FALSE(initialized); monitor.MarkInitialized(); - EXPECT_TRUE(event.IsSignaled()); + EXPECT_TRUE(initialized); } TEST(StorageMonitorTest, DeviceAttachDetachNotifications) { + test::TestStorageMonitor::RemoveSingleton(); base::MessageLoop message_loop; const string16 kDeviceName = ASCIIToUTF16("media device"); const std::string kDeviceId1 = "dcim:UUID:FFF0-0001"; @@ -73,6 +82,7 @@ TEST(StorageMonitorTest, DeviceAttachDetachNotifications) { } TEST(StorageMonitorTest, GetAllAvailableStoragesEmpty) { + test::TestStorageMonitor::RemoveSingleton(); base::MessageLoop message_loop; test::TestStorageMonitor monitor; std::vector<StorageInfo> devices = monitor.GetAllAvailableStorages(); @@ -80,6 +90,7 @@ TEST(StorageMonitorTest, GetAllAvailableStoragesEmpty) { } TEST(StorageMonitorTest, GetAllAvailableStorageAttachDetach) { + test::TestStorageMonitor::RemoveSingleton(); base::MessageLoop message_loop; test::TestStorageMonitor monitor; const std::string kDeviceId1 = "dcim:UUID:FFF0-0042"; diff --git a/chrome/browser/storage_monitor/storage_monitor_win.cc b/chrome/browser/storage_monitor/storage_monitor_win.cc index 4fcc8f6..beec36d 100644 --- a/chrome/browser/storage_monitor/storage_monitor_win.cc +++ b/chrome/browser/storage_monitor/storage_monitor_win.cc @@ -18,12 +18,6 @@ namespace chrome { // StorageMonitorWin ------------------------------------------------------- -// static -StorageMonitorWin* StorageMonitorWin::Create() { - return new StorageMonitorWin(new VolumeMountWatcherWin(), - new PortableDeviceWatcherWin()); -} - StorageMonitorWin::StorageMonitorWin( VolumeMountWatcherWin* volume_mount_watcher, PortableDeviceWatcherWin* portable_device_watcher) @@ -167,4 +161,9 @@ void StorageMonitorWin::OnDeviceChange(UINT event_type, LPARAM data) { portable_device_watcher_->OnWindowMessage(event_type, data); } +StorageMonitor* StorageMonitor::Create() { + return new StorageMonitorWin(new VolumeMountWatcherWin(), + new PortableDeviceWatcherWin()); +} + } // namespace chrome diff --git a/chrome/browser/storage_monitor/storage_monitor_win.h b/chrome/browser/storage_monitor/storage_monitor_win.h index 6472c0d..c036fbb 100644 --- a/chrome/browser/storage_monitor/storage_monitor_win.h +++ b/chrome/browser/storage_monitor/storage_monitor_win.h @@ -25,10 +25,6 @@ class VolumeMountWatcherWin; class StorageMonitorWin : public StorageMonitor { public: - // Creates an instance of StorageMonitorWin. Should only be called by browser - // start up code. Use GetInstance() instead. - static StorageMonitorWin* Create(); - virtual ~StorageMonitorWin(); // Must be called after the file thread is created. @@ -49,10 +45,11 @@ class StorageMonitorWin : public StorageMonitor { private: class PortableDeviceNotifications; friend class test::TestStorageMonitorWin; + friend StorageMonitor* StorageMonitor::Create(); // To support unit tests, this constructor takes |volume_mount_watcher| and // |portable_device_watcher| objects. These params are either constructed in - // unit tests or in StorageMonitorWin::Create() function. + // unit tests or in StorageMonitorWin Create() function. StorageMonitorWin(VolumeMountWatcherWin* volume_mount_watcher, PortableDeviceWatcherWin* portable_device_watcher); diff --git a/chrome/browser/storage_monitor/storage_monitor_win_unittest.cc b/chrome/browser/storage_monitor/storage_monitor_win_unittest.cc index 12a742b..c23cb34 100644 --- a/chrome/browser/storage_monitor/storage_monitor_win_unittest.cc +++ b/chrome/browser/storage_monitor/storage_monitor_win_unittest.cc @@ -19,9 +19,11 @@ #include "chrome/browser/storage_monitor/storage_info.h" #include "chrome/browser/storage_monitor/storage_monitor_win.h" #include "chrome/browser/storage_monitor/test_portable_device_watcher_win.h" +#include "chrome/browser/storage_monitor/test_storage_monitor.h" #include "chrome/browser/storage_monitor/test_storage_monitor_win.h" #include "chrome/browser/storage_monitor/test_volume_mount_watcher_win.h" #include "chrome/browser/storage_monitor/volume_mount_watcher_win.h" +#include "chrome/test/base/testing_browser_process.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -63,7 +65,7 @@ class StorageMonitorWinTest : public testing::Test { base::string16* pnp_device_id, base::string16* storage_object_id); - scoped_ptr<TestStorageMonitorWin> monitor_; + TestStorageMonitorWin* monitor_; // Weak pointer; owned by the device notifications class. TestVolumeMountWatcherWin* volume_mount_watcher_; @@ -86,9 +88,15 @@ StorageMonitorWinTest::~StorageMonitorWinTest() { void StorageMonitorWinTest::SetUp() { ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); + test::TestStorageMonitor::RemoveSingleton(); volume_mount_watcher_ = new TestVolumeMountWatcherWin; - monitor_.reset(new TestStorageMonitorWin(volume_mount_watcher_, - new TestPortableDeviceWatcherWin)); + monitor_ = new TestStorageMonitorWin(volume_mount_watcher_, + new TestPortableDeviceWatcherWin); + scoped_ptr<StorageMonitor> pass_monitor(monitor_); + TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal(); + DCHECK(browser_process); + browser_process->SetStorageMonitor(pass_monitor.Pass()); + monitor_->Init(); RunUntilIdle(); monitor_->AddObserver(&observer_); @@ -98,11 +106,16 @@ void StorageMonitorWinTest::TearDown() { RunUntilIdle(); monitor_->RemoveObserver(&observer_); volume_mount_watcher_->ShutdownWorkerPool(); - monitor_.reset(); + monitor_ = NULL; + + // Windows storage monitor must be destroyed on the same thread + // as construction. + test::TestStorageMonitor::RemoveSingleton(); } void StorageMonitorWinTest::PreAttachDevices() { - monitor_.reset(); + test::TestStorageMonitor::RemoveSingleton(); + monitor_ = NULL; volume_mount_watcher_ = new TestVolumeMountWatcherWin; volume_mount_watcher_->SetAttachedDevicesFake(); @@ -117,8 +130,13 @@ void StorageMonitorWinTest::PreAttachDevices() { expect_attach_calls++; } - monitor_.reset(new TestStorageMonitorWin(volume_mount_watcher_, - new TestPortableDeviceWatcherWin)); + monitor_ = new TestStorageMonitorWin(volume_mount_watcher_, + new TestPortableDeviceWatcherWin); + scoped_ptr<StorageMonitor> pass_monitor(monitor_); + TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal(); + DCHECK(browser_process); + browser_process->SetStorageMonitor(pass_monitor.Pass()); + monitor_->AddObserver(&observer_); monitor_->Init(); diff --git a/chrome/browser/storage_monitor/test_storage_monitor.cc b/chrome/browser/storage_monitor/test_storage_monitor.cc index e28ce2c..22c3f7d 100644 --- a/chrome/browser/storage_monitor/test_storage_monitor.cc +++ b/chrome/browser/storage_monitor/test_storage_monitor.cc @@ -4,7 +4,12 @@ #include "chrome/browser/storage_monitor/test_storage_monitor.h" +#include "base/run_loop.h" +#include "base/synchronization/waitable_event.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/browser_process_impl.h" #include "chrome/browser/storage_monitor/storage_info.h" +#include "chrome/test/base/testing_browser_process.h" #if defined(OS_LINUX) #include "chrome/browser/storage_monitor/test_media_transfer_protocol_manager_linux.h" @@ -25,10 +30,52 @@ TestStorageMonitor::TestStorageMonitor() TestStorageMonitor::~TestStorageMonitor() {} -TestStorageMonitor* -TestStorageMonitor::CreateForBrowserTests() { - StorageMonitor::RemoveSingletonForTesting(); - return new TestStorageMonitor(); +TestStorageMonitor* TestStorageMonitor::CreateAndInstall() { + RemoveSingleton(); + TestStorageMonitor* monitor = new TestStorageMonitor(); + scoped_ptr<StorageMonitor> pass_monitor(monitor); + monitor->Init(); + monitor->MarkInitialized(); + TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal(); + if (browser_process) { + browser_process->SetStorageMonitor(pass_monitor.Pass()); + return monitor; + } + return NULL; +} + +TestStorageMonitor* TestStorageMonitor::CreateForBrowserTests() { + TestStorageMonitor* return_monitor = new TestStorageMonitor(); + return_monitor->Init(); + return_monitor->MarkInitialized(); + + scoped_ptr<StorageMonitor> monitor(return_monitor); + BrowserProcessImpl* browser_process = + static_cast<BrowserProcessImpl*>(g_browser_process); + DCHECK(browser_process); + browser_process->set_storage_monitor_for_test(monitor.Pass()); + return return_monitor; +} + +void TestStorageMonitor::RemoveSingleton() { + TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal(); + if (browser_process) + browser_process->SetStorageMonitor(scoped_ptr<StorageMonitor>()); +} + +// static +void TestStorageMonitor::SyncInitialize() { + StorageMonitor* monitor = g_browser_process->storage_monitor(); + if (monitor->IsInitialized()) + return; + + base::WaitableEvent event(true, false); + monitor->EnsureInitialized(base::Bind(&base::WaitableEvent::Signal, + base::Unretained(&event))); + while (!event.IsSignaled()) { + base::RunLoop().RunUntilIdle(); + } + DCHECK(monitor->IsInitialized()); } void TestStorageMonitor::Init() { diff --git a/chrome/browser/storage_monitor/test_storage_monitor.h b/chrome/browser/storage_monitor/test_storage_monitor.h index 6408e66..26ff133 100644 --- a/chrome/browser/storage_monitor/test_storage_monitor.h +++ b/chrome/browser/storage_monitor/test_storage_monitor.h @@ -21,10 +21,21 @@ class TestStorageMonitor : public chrome::StorageMonitor { void MarkInitialized(); - // Will create a new testing implementation for browser tests, - // taking care to deal with the existing singleton correctly. + // Create and initialize a new TestStorageMonitor and install it + // in the TestingBrowserProcess. + static TestStorageMonitor* CreateAndInstall(); + + // Create and initialize a new TestStorageMonitor, and install it + // in the BrowserProcessImpl. (Browser tests use the production browser + // process implementation.) static TestStorageMonitor* CreateForBrowserTests(); + // Remove the singleton StorageMonitor from the TestingBrowserProcess. + static void RemoveSingleton(); + + // Synchronously initialize the current storage monitor. + static void SyncInitialize(); + virtual bool GetStorageInfoForPath( const base::FilePath& path, StorageInfo* device_info) const OVERRIDE; diff --git a/chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_unittest.mm b/chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_unittest.mm index 7217e04..1eb8fb2 100644 --- a/chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_unittest.mm +++ b/chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_unittest.mm @@ -6,7 +6,6 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/media_galleries/media_galleries_dialog_controller_mock.h" #include "chrome/browser/storage_monitor/storage_info.h" -#include "chrome/browser/storage_monitor/test_storage_monitor.h" #include "chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.h" #include "testing/gtest/include/gtest/gtest.h" @@ -29,8 +28,6 @@ MediaGalleryPrefInfo MakePrefInfoForTesting(MediaGalleryPrefId pref_id) { } class MediaGalleriesDialogTest : public testing::Test { - private: - test::TestStorageMonitor test_storage_monitor_; }; // Tests that checkboxes are initialized according to the contents of diff --git a/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk_unittest.cc b/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk_unittest.cc index 5490cecd..089cf89 100644 --- a/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk_unittest.cc +++ b/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk_unittest.cc @@ -6,7 +6,6 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/media_galleries/media_galleries_dialog_controller_mock.h" #include "chrome/browser/storage_monitor/storage_info.h" -#include "chrome/browser/storage_monitor/test_storage_monitor.h" #include "chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h" #include "testing/gtest/include/gtest/gtest.h" @@ -33,8 +32,6 @@ MediaGalleryPrefInfo MakePrefInfoForTesting(MediaGalleryPrefId id) { } // namespace class MediaGalleriesDialogTest : public testing::Test { - private: - test::TestStorageMonitor test_storage_monitor_; }; // Tests that checkboxes are initialized according to the contents of diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 126b736..f622d4e 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi @@ -2387,6 +2387,7 @@ 'browser/browser_commands_unittest.cc', 'browser/download/download_shelf_unittest.cc', + 'browser/storage_monitor/media_storage_util_unittest.cc', 'browser/net/gaia/gaia_oauth_fetcher_unittest.cc', 'browser/page_cycler/page_cycler_unittest.cc', 'browser/policy/async_policy_provider_unittest.cc', diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc index 224e623..5e12543 100644 --- a/chrome/test/base/testing_browser_process.cc +++ b/chrome/test/base/testing_browser_process.cc @@ -9,6 +9,7 @@ #include "build/build_config.h" #include "chrome/browser/background/background_mode_manager.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/browser_process_impl.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/bookmarks/bookmark_prompt_controller.h" #include "chrome/test/base/testing_browser_process_platform_part.h" @@ -18,7 +19,6 @@ #include "ui/message_center/message_center.h" #if !defined(OS_IOS) -#include "chrome/browser/media_galleries/media_file_system_registry.h" #include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/prerender/prerender_tracker.h" #include "chrome/browser/printing/background_printing_manager.h" @@ -27,6 +27,12 @@ #include "chrome/browser/thumbnails/render_widget_snapshot_taker.h" #endif +#if !defined(OS_IOS) && !defined(OS_ANDROID) +#include "chrome/browser/media_galleries/media_file_system_registry.h" +#include "chrome/browser/storage_monitor/storage_monitor.h" +#include "chrome/browser/storage_monitor/test_storage_monitor.h" +#endif + #if defined(ENABLE_CONFIGURATION_POLICY) #include "chrome/browser/policy/browser_policy_connector.h" #else @@ -318,9 +324,25 @@ BookmarkPromptController* TestingBrowserProcess::bookmark_prompt_controller() { #endif } +chrome::StorageMonitor* TestingBrowserProcess::storage_monitor() { +#if defined(OS_IOS) || defined(OS_ANDROID) + NOTIMPLEMENTED(); + return NULL; +#else + if (!storage_monitor_.get()) { + chrome::test::TestStorageMonitor* monitor = + new chrome::test::TestStorageMonitor(); + monitor->Init(); + monitor->MarkInitialized(); + storage_monitor_.reset(monitor); + } + return storage_monitor_.get(); +#endif +} + chrome::MediaFileSystemRegistry* TestingBrowserProcess::media_file_system_registry() { -#if defined(OS_IOS) || defined (OS_ANDROID) +#if defined(OS_IOS) || defined(OS_ANDROID) NOTIMPLEMENTED(); return NULL; #else @@ -396,3 +418,10 @@ void TestingBrowserProcess::SetSafeBrowsingService( sb_service_ = sb_service; #endif } + +void TestingBrowserProcess::SetStorageMonitor( + scoped_ptr<chrome::StorageMonitor> storage_monitor) { +#if !defined(OS_IOS) && !defined(OS_ANDROID) + storage_monitor_.reset(storage_monitor.release()); +#endif +} diff --git a/chrome/test/base/testing_browser_process.h b/chrome/test/base/testing_browser_process.h index 983d766..619ceb0 100644 --- a/chrome/test/base/testing_browser_process.h +++ b/chrome/test/base/testing_browser_process.h @@ -105,6 +105,7 @@ class TestingBrowserProcess : public BrowserProcess { virtual CRLSetFetcher* crl_set_fetcher() OVERRIDE; virtual PnaclComponentInstaller* pnacl_component_installer() OVERRIDE; virtual BookmarkPromptController* bookmark_prompt_controller() OVERRIDE; + virtual chrome::StorageMonitor* storage_monitor() OVERRIDE; virtual chrome::MediaFileSystemRegistry* media_file_system_registry() OVERRIDE; virtual bool created_local_state() const OVERRIDE; @@ -122,6 +123,7 @@ class TestingBrowserProcess : public BrowserProcess { void SetSafeBrowsingService(SafeBrowsingService* sb_service); void SetBookmarkPromptController(BookmarkPromptController* controller); void SetSystemRequestContext(net::URLRequestContextGetter* context_getter); + void SetStorageMonitor(scoped_ptr<chrome::StorageMonitor> storage_monitor); private: scoped_ptr<content::NotificationService> notification_service_; @@ -144,10 +146,12 @@ class TestingBrowserProcess : public BrowserProcess { scoped_ptr<RenderWidgetSnapshotTaker> render_widget_snapshot_taker_; scoped_refptr<SafeBrowsingService> sb_service_; scoped_ptr<BookmarkPromptController> bookmark_prompt_controller_; -#if !defined(OS_ANDROID) +#endif // !defined(OS_IOS) + +#if !defined(OS_IOS) && !defined(OS_ANDROID) + scoped_ptr<chrome::StorageMonitor> storage_monitor_; scoped_ptr<chrome::MediaFileSystemRegistry> media_file_system_registry_; #endif -#endif // !defined(OS_IOS) // The following objects are not owned by TestingBrowserProcess: PrefService* local_state_; |