diff options
17 files changed, 118 insertions, 57 deletions
diff --git a/chrome/browser/extensions/extension_pref_value_map.cc b/chrome/browser/extensions/extension_pref_value_map.cc index 9d2ef06..4d9877a 100644 --- a/chrome/browser/extensions/extension_pref_value_map.cc +++ b/chrome/browser/extensions/extension_pref_value_map.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -23,15 +23,23 @@ struct ExtensionPrefValueMap::ExtensionEntry { PrefValueMap incognito_profile_preferences_session_only; }; -ExtensionPrefValueMap::ExtensionPrefValueMap() { +ExtensionPrefValueMap::ExtensionPrefValueMap() : destroyed_(false) { } ExtensionPrefValueMap::~ExtensionPrefValueMap() { - NotifyOfDestruction(); + if (!destroyed_) { + NotifyOfDestruction(); + destroyed_ = true; + } STLDeleteValues(&entries_); entries_.clear(); } +void ExtensionPrefValueMap::Shutdown() { + NotifyOfDestruction(); + destroyed_ = true; +} + void ExtensionPrefValueMap::SetExtensionPref(const std::string& ext_id, const std::string& key, ExtensionPrefsScope scope, diff --git a/chrome/browser/extensions/extension_pref_value_map.h b/chrome/browser/extensions/extension_pref_value_map.h index 54538e4..2a168ad 100644 --- a/chrome/browser/extensions/extension_pref_value_map.h +++ b/chrome/browser/extensions/extension_pref_value_map.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,8 +10,11 @@ #include <set> #include <string> +#include "base/observer_list.h" #include "base/time.h" -#include "chrome/browser/prefs/value_map_pref_store.h" +#include "base/values.h" +#include "chrome/browser/prefs/pref_value_map.h" +#include "chrome/browser/profiles/profile_keyed_service.h" #include "chrome/browser/extensions/extension_prefs_scope.h" // Non-persistent data container that is shared by ExtensionPrefStores. All @@ -43,7 +46,7 @@ // .reg = regular value // .inc = incognito value // Extension B has higher precedence than A. -class ExtensionPrefValueMap { +class ExtensionPrefValueMap : public ProfileKeyedService { public: // Observer interface for monitoring ExtensionPrefValueMap. class Observer { @@ -64,6 +67,9 @@ class ExtensionPrefValueMap { ExtensionPrefValueMap(); virtual ~ExtensionPrefValueMap(); + // ProfileKeyedService implementation. + virtual void Shutdown() OVERRIDE; + // Set an extension preference |value| for |key| of extension |ext_id|. // Takes ownership of |value|. // Note that regular extension pref values need to be reported to @@ -163,6 +169,11 @@ class ExtensionPrefValueMap { // are stored in ExtensionPrefStores. ExtensionEntryMap entries_; + // In normal Profile shutdown, Shutdown() notifies observers that we are + // being destroyed. In tests, it isn't called, so the notification must + // be done in the destructor. This bit tracks whether it has been done yet. + bool destroyed_; + ObserverList<Observer, true> observers_; DISALLOW_COPY_AND_ASSIGN(ExtensionPrefValueMap); diff --git a/chrome/browser/extensions/extension_pref_value_map_factory.cc b/chrome/browser/extensions/extension_pref_value_map_factory.cc new file mode 100644 index 0000000..195bab4 --- /dev/null +++ b/chrome/browser/extensions/extension_pref_value_map_factory.cc @@ -0,0 +1,35 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/extensions/extension_pref_value_map_factory.h" + +#include "chrome/browser/extensions/extension_pref_value_map.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_dependency_manager.h" + +ExtensionPrefValueMapFactory::ExtensionPrefValueMapFactory() + : ProfileKeyedServiceFactory( + "ExtensionPrefValueMap", + ProfileDependencyManager::GetInstance()) { +} + +ExtensionPrefValueMapFactory::~ExtensionPrefValueMapFactory() { +} + +// static +ExtensionPrefValueMap* ExtensionPrefValueMapFactory::GetForProfile( + Profile* profile) { + return static_cast<ExtensionPrefValueMap*>( + GetInstance()->GetServiceForProfile(profile, true)); +} + +// static +ExtensionPrefValueMapFactory* ExtensionPrefValueMapFactory::GetInstance() { + return Singleton<ExtensionPrefValueMapFactory>::get(); +} + +ProfileKeyedService* ExtensionPrefValueMapFactory::BuildServiceInstanceFor( + Profile* profile) const { + return new ExtensionPrefValueMap(); +} diff --git a/chrome/browser/extensions/extension_pref_value_map_factory.h b/chrome/browser/extensions/extension_pref_value_map_factory.h new file mode 100644 index 0000000..10a9058 --- /dev/null +++ b/chrome/browser/extensions/extension_pref_value_map_factory.h @@ -0,0 +1,29 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_PREF_VALUE_MAP_FACTORY_H_ +#define CHROME_BROWSER_EXTENSIONS_EXTENSION_PREF_VALUE_MAP_FACTORY_H_ + +#include "base/memory/singleton.h" +#include "chrome/browser/profiles/profile_keyed_service_factory.h" + +class ExtensionPrefValueMap; + +class ExtensionPrefValueMapFactory : public ProfileKeyedServiceFactory { + public: + static ExtensionPrefValueMap* GetForProfile(Profile* profile); + + static ExtensionPrefValueMapFactory* GetInstance(); + + private: + friend struct DefaultSingletonTraits<ExtensionPrefValueMapFactory>; + + ExtensionPrefValueMapFactory(); + virtual ~ExtensionPrefValueMapFactory(); + + virtual ProfileKeyedService* BuildServiceInstanceFor( + Profile* profile) const OVERRIDE; +}; + +#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREF_VALUE_MAP_FACTORY_H_ diff --git a/chrome/browser/extensions/extension_system.cc b/chrome/browser/extensions/extension_system.cc index c1b7c2d..848f390 100644 --- a/chrome/browser/extensions/extension_system.cc +++ b/chrome/browser/extensions/extension_system.cc @@ -20,6 +20,7 @@ #include "chrome/browser/extensions/extension_navigation_observer.h" #include "chrome/browser/extensions/extension_pref_store.h" #include "chrome/browser/extensions/extension_pref_value_map.h" +#include "chrome/browser/extensions/extension_pref_value_map_factory.h" #include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system_factory.h" @@ -70,7 +71,7 @@ void ExtensionSystemImpl::Shared::InitPrefs() { extension_prefs_.reset(new ExtensionPrefs( profile_->GetPrefs(), profile_->GetPath().AppendASCII(ExtensionService::kInstallDirectoryName), - profile_->GetExtensionPrefValueMap())); + ExtensionPrefValueMapFactory::GetForProfile(profile_))); extension_prefs_->Init(extensions_disabled); } diff --git a/chrome/browser/extensions/test_extension_system.cc b/chrome/browser/extensions/test_extension_system.cc index a15956f..f879015 100644 --- a/chrome/browser/extensions/test_extension_system.cc +++ b/chrome/browser/extensions/test_extension_system.cc @@ -9,6 +9,7 @@ #include "chrome/browser/extensions/extension_info_map.h" #include "chrome/browser/extensions/extension_message_service.h" #include "chrome/browser/extensions/extension_pref_value_map.h" +#include "chrome/browser/extensions/extension_pref_value_map_factory.h" #include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" @@ -36,21 +37,18 @@ ExtensionService* TestExtensionSystem::CreateExtensionService( const CommandLine* command_line, const FilePath& install_directory, bool autoupdate_enabled) { - // Extension pref store, created for use by |extension_prefs_|. - extension_pref_value_map_.reset(new ExtensionPrefValueMap); - bool extensions_disabled = command_line && command_line->HasSwitch(switches::kDisableExtensions); // Note that the GetPrefs() creates a TestingPrefService, therefore // the extension controlled pref values set in extension_prefs_ // are not reflected in the pref service. One would need to - // inject a new ExtensionPrefStore(extension_pref_value_map_.get(), false). + // inject a new ExtensionPrefStore(extension_pref_value_map, false). - extension_prefs_.reset( - new ExtensionPrefs(profile_->GetPrefs(), - install_directory, - extension_pref_value_map_.get())); + extension_prefs_.reset(new ExtensionPrefs( + profile_->GetPrefs(), + install_directory, + ExtensionPrefValueMapFactory::GetForProfile(profile_))); extension_prefs_->Init(extensions_disabled); extension_service_.reset(new ExtensionService(profile_, command_line, diff --git a/chrome/browser/extensions/test_extension_system.h b/chrome/browser/extensions/test_extension_system.h index 411c775..aa97176 100644 --- a/chrome/browser/extensions/test_extension_system.h +++ b/chrome/browser/extensions/test_extension_system.h @@ -50,7 +50,6 @@ class TestExtensionSystem : public ExtensionSystem { private: Profile* profile_; - scoped_ptr<ExtensionPrefValueMap> extension_pref_value_map_; // The Extension Preferences. Only created if CreateExtensionService is // invoked. scoped_ptr<ExtensionPrefs> extension_prefs_; diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc index ad58ba2..5750347 100644 --- a/chrome/browser/profiles/off_the_record_profile_impl.cc +++ b/chrome/browser/profiles/off_the_record_profile_impl.cc @@ -22,7 +22,6 @@ #include "chrome/browser/extensions/api/web_request/web_request_api.h" #include "chrome/browser/extensions/extension_info_map.h" #include "chrome/browser/extensions/extension_pref_store.h" -#include "chrome/browser/extensions/extension_pref_value_map.h" #include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_special_storage_policy.h" @@ -192,10 +191,6 @@ VisitedLinkMaster* OffTheRecordProfileImpl::GetVisitedLinkMaster() { return NULL; } -ExtensionPrefValueMap* OffTheRecordProfileImpl::GetExtensionPrefValueMap() { - return NULL; -} - ExtensionService* OffTheRecordProfileImpl::GetExtensionService() { return ExtensionSystem::Get(this)->extension_service(); } diff --git a/chrome/browser/profiles/off_the_record_profile_impl.h b/chrome/browser/profiles/off_the_record_profile_impl.h index cc58a70..36e8fc8 100644 --- a/chrome/browser/profiles/off_the_record_profile_impl.h +++ b/chrome/browser/profiles/off_the_record_profile_impl.h @@ -40,7 +40,6 @@ class OffTheRecordProfileImpl : public Profile, virtual bool HasOffTheRecordProfile() OVERRIDE; virtual Profile* GetOriginalProfile() OVERRIDE; virtual VisitedLinkMaster* GetVisitedLinkMaster() OVERRIDE; - virtual ExtensionPrefValueMap* GetExtensionPrefValueMap() OVERRIDE; virtual ExtensionService* GetExtensionService() OVERRIDE; virtual UserScriptMaster* GetUserScriptMaster() OVERRIDE; virtual ExtensionProcessManager* GetExtensionProcessManager() OVERRIDE; diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h index eca7fba..854f0d6 100644 --- a/chrome/browser/profiles/profile.h +++ b/chrome/browser/profiles/profile.h @@ -23,7 +23,6 @@ class ChromeAppCacheService; class ChromeURLDataManager; class Extension; class ExtensionEventRouter; -class ExtensionPrefValueMap; class ExtensionProcessManager; class ExtensionService; class ExtensionSpecialStoragePolicy; @@ -206,10 +205,6 @@ class Profile : public content::BrowserContext { // that this method is called. virtual VisitedLinkMaster* GetVisitedLinkMaster() = 0; - // Accessor. The instance is created upon first access. - // TODO(yoz): make this a ProfileKeyedService. - virtual ExtensionPrefValueMap* GetExtensionPrefValueMap() = 0; - // DEPRECATED. Instead, use ExtensionSystem::extension_service(). // Retrieves a pointer to the ExtensionService associated with this // profile. The ExtensionService is created at startup. diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc index b8958dd..5587743 100644 --- a/chrome/browser/profiles/profile_impl.cc +++ b/chrome/browser/profiles/profile_impl.cc @@ -31,6 +31,7 @@ #include "chrome/browser/extensions/extension_event_router.h" #include "chrome/browser/extensions/extension_pref_store.h" #include "chrome/browser/extensions/extension_pref_value_map.h" +#include "chrome/browser/extensions/extension_pref_value_map_factory.h" #include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_special_storage_policy.h" @@ -252,7 +253,8 @@ ProfileImpl::ProfileImpl(const FilePath& path, if (create_mode == CREATE_MODE_ASYNCHRONOUS) { prefs_.reset(PrefService::CreatePrefService( GetPrefFilePath(), - new ExtensionPrefStore(GetExtensionPrefValueMap(), false), + new ExtensionPrefStore( + ExtensionPrefValueMapFactory::GetForProfile(this), false), true)); // Wait for the notification that prefs has been loaded (successfully or // not). @@ -262,7 +264,8 @@ ProfileImpl::ProfileImpl(const FilePath& path, // Load prefs synchronously. prefs_.reset(PrefService::CreatePrefService( GetPrefFilePath(), - new ExtensionPrefStore(GetExtensionPrefValueMap(), false), + new ExtensionPrefStore( + ExtensionPrefValueMapFactory::GetForProfile(this), false), false)); OnPrefsLoaded(true); } else { @@ -561,7 +564,8 @@ Profile* ProfileImpl::GetOffTheRecordProfile() { void ProfileImpl::DestroyOffTheRecordProfile() { off_the_record_profile_.reset(); - extension_pref_value_map_->ClearAllIncognitoSessionOnlyPreferences(); + ExtensionPrefValueMapFactory::GetForProfile(this)-> + ClearAllIncognitoSessionOnlyPreferences(); } bool ProfileImpl::HasOffTheRecordProfile() { @@ -663,7 +667,8 @@ PrefService* ProfileImpl::GetOffTheRecordPrefs() { // The new ExtensionPrefStore is ref_counted and the new PrefService // stores a reference so that we do not leak memory here. otr_prefs_.reset(GetPrefs()->CreateIncognitoPrefService( - new ExtensionPrefStore(GetExtensionPrefValueMap(), true))); + new ExtensionPrefStore( + ExtensionPrefValueMapFactory::GetForProfile(this), true))); } return otr_prefs_.get(); } @@ -874,12 +879,6 @@ history::TopSites* ProfileImpl::GetTopSitesWithoutCreating() { return top_sites_; } -ExtensionPrefValueMap* ProfileImpl::GetExtensionPrefValueMap() { - if (!extension_pref_value_map_.get()) - extension_pref_value_map_.reset(new ExtensionPrefValueMap); - return extension_pref_value_map_.get(); -} - void ProfileImpl::MarkAsCleanShutdown() { if (prefs_.get()) { // The session cleanly exited, set kSessionExitedCleanly appropriately. diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h index 252dc61..0e3ad6b 100644 --- a/chrome/browser/profiles/profile_impl.h +++ b/chrome/browser/profiles/profile_impl.h @@ -74,7 +74,6 @@ class ProfileImpl : public Profile, virtual history::TopSites* GetTopSites() OVERRIDE; virtual history::TopSites* GetTopSitesWithoutCreating() OVERRIDE; virtual VisitedLinkMaster* GetVisitedLinkMaster() OVERRIDE; - virtual ExtensionPrefValueMap* GetExtensionPrefValueMap() OVERRIDE; virtual ExtensionService* GetExtensionService() OVERRIDE; virtual UserScriptMaster* GetUserScriptMaster() OVERRIDE; virtual ExtensionProcessManager* GetExtensionProcessManager() OVERRIDE; @@ -166,7 +165,6 @@ class ProfileImpl : public Profile, void UpdateProfileUserNameCache(); - // Updates the ProfileInfoCache with data from this profile. void UpdateProfileNameCache(); void UpdateProfileAvatarCache(); @@ -187,7 +185,6 @@ class ProfileImpl : public Profile, // that the declaration occurs AFTER things it depends on as destruction // happens in reverse order of declaration. - scoped_ptr<ExtensionPrefValueMap> extension_pref_value_map_; // Keep |prefs_| on top for destruction order because |extension_prefs_|, // |net_pref_observer_|, |web_resource_service_|, and |io_data_| store // pointers to |prefs_| and shall be destructed first. diff --git a/chrome/browser/protector/protected_prefs_watcher_unittest.cc b/chrome/browser/protector/protected_prefs_watcher_unittest.cc index 1977412..b67f8d9 100644 --- a/chrome/browser/protector/protected_prefs_watcher_unittest.cc +++ b/chrome/browser/protector/protected_prefs_watcher_unittest.cc @@ -4,8 +4,9 @@ #include "base/message_loop.h" #include "base/values.h" -#include "chrome/browser/extensions/extension_prefs.h" #include "chrome/browser/extensions/extension_pref_value_map.h" +#include "chrome/browser/extensions/extension_pref_value_map_factory.h" +#include "chrome/browser/extensions/extension_prefs.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/prefs/scoped_user_pref_update.h" @@ -105,12 +106,11 @@ TEST_F(ProtectedPrefsWatcherTest, ExtensionPrefChange) { FilePath extensions_install_dir = profile_.GetPath().AppendASCII(ExtensionService::kInstallDirectoryName); - scoped_ptr<ExtensionPrefValueMap> extension_pref_value_map_( - new ExtensionPrefValueMap); scoped_ptr<ExtensionPrefs> extension_prefs( new ExtensionPrefs(profile_.GetPrefs(), extensions_install_dir, - extension_pref_value_map_.get())); + ExtensionPrefValueMapFactory::GetForProfile( + &profile_))); std::string sample_id = extension_misc::kWebStoreAppId; extension_prefs->Init(false); // Flip a pref value of an extension (this will actually add it to the list). diff --git a/chrome/browser/ui/cocoa/extensions/extension_popup_controller_unittest.mm b/chrome/browser/ui/cocoa/extensions/extension_popup_controller_unittest.mm index ba3c432..910feee 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_popup_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_popup_controller_unittest.mm @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -6,6 +6,7 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop.h" #include "chrome/browser/extensions/extension_pref_value_map.h" +#include "chrome/browser/extensions/extension_pref_value_map_factory.h" #include "chrome/browser/extensions/extension_prefs.h" #include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" @@ -29,10 +30,10 @@ class ExtensionTestingProfile : public TestingProfile { DCHECK(!GetExtensionService()); manager_.reset(ExtensionProcessManager::Create(this)); - extension_pref_value_map_.reset(new ExtensionPrefValueMap); - extension_prefs_.reset(new ExtensionPrefs(GetPrefs(), - GetExtensionsInstallDir(), - extension_pref_value_map_.get())); + extension_prefs_.reset(new ExtensionPrefs( + GetPrefs(), + GetExtensionsInstallDir(), + ExtensionPrefValueMapFactory::GetForProfile(this))); extension_prefs_->Init(false); service_.reset(new ExtensionService(this, CommandLine::ForCurrentProcess(), @@ -64,7 +65,6 @@ class ExtensionTestingProfile : public TestingProfile { scoped_ptr<ExtensionProcessManager> manager_; scoped_ptr<ExtensionPrefs> extension_prefs_; scoped_ptr<ExtensionService> service_; - scoped_ptr<ExtensionPrefValueMap> extension_pref_value_map_; DISALLOW_COPY_AND_ASSIGN(ExtensionTestingProfile); }; diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index 8c4dfac..a9c9fcf 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi @@ -313,6 +313,8 @@ 'browser/extensions/extension_pref_store.h', 'browser/extensions/extension_pref_value_map.cc', 'browser/extensions/extension_pref_value_map.h', + 'browser/extensions/extension_pref_value_map_factory.cc', + 'browser/extensions/extension_pref_value_map_factory.h', 'browser/extensions/extension_preference_api.cc', 'browser/extensions/extension_preference_api.h', 'browser/extensions/extension_preference_api_constants.cc', diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc index 99b3d6f..a3714dd 100644 --- a/chrome/test/base/testing_profile.cc +++ b/chrome/test/base/testing_profile.cc @@ -17,7 +17,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/content_settings/host_content_settings_map.h" #include "chrome/browser/custom_handlers/protocol_handler_registry.h" -#include "chrome/browser/extensions/extension_pref_value_map.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_special_storage_policy.h" #include "chrome/browser/extensions/extension_system.h" @@ -438,10 +437,6 @@ VisitedLinkMaster* TestingProfile::GetVisitedLinkMaster() { return NULL; } -ExtensionPrefValueMap* TestingProfile::GetExtensionPrefValueMap() { - return NULL; -} - ExtensionService* TestingProfile::GetExtensionService() { return ExtensionSystem::Get(this)->extension_service(); } diff --git a/chrome/test/base/testing_profile.h b/chrome/test/base/testing_profile.h index f9ff29e..4412416 100644 --- a/chrome/test/base/testing_profile.h +++ b/chrome/test/base/testing_profile.h @@ -36,7 +36,6 @@ class AutocompleteClassifier; class BookmarkModel; class CommandLine; class ExtensionPrefs; -class ExtensionPrefValueMap; class ExtensionSpecialStoragePolicy; class FaviconService; class HistoryService; @@ -163,7 +162,6 @@ class TestingProfile : public Profile { virtual bool HasOffTheRecordProfile() OVERRIDE; virtual Profile* GetOriginalProfile() OVERRIDE; virtual VisitedLinkMaster* GetVisitedLinkMaster() OVERRIDE; - virtual ExtensionPrefValueMap* GetExtensionPrefValueMap() OVERRIDE; virtual ExtensionService* GetExtensionService() OVERRIDE; virtual UserScriptMaster* GetUserScriptMaster() OVERRIDE; virtual ExtensionProcessManager* GetExtensionProcessManager() OVERRIDE; |