diff options
author | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-06 13:32:50 +0000 |
---|---|---|
committer | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-06 13:32:50 +0000 |
commit | c81f22b04bbdae30eb47b0563b79b811682541a7 (patch) | |
tree | 7c0c0a24ee1baa29c9bbb21dbf70685c753bd1b2 /chrome | |
parent | 9dc8cf77eac81836255d0fbc60964c65eeaa491b (diff) | |
download | chromium_src-c81f22b04bbdae30eb47b0563b79b811682541a7.zip chromium_src-c81f22b04bbdae30eb47b0563b79b811682541a7.tar.gz chromium_src-c81f22b04bbdae30eb47b0563b79b811682541a7.tar.bz2 |
Be more robust when getting content settings for uninstalled extensions.
BUG=92459
TEST=see bug
Review URL: http://codereview.chromium.org/7617004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@99729 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
4 files changed, 40 insertions, 22 deletions
diff --git a/chrome/browser/extensions/extension_content_settings_store.cc b/chrome/browser/extensions/extension_content_settings_store.cc index 779baf9..6136b37 100644 --- a/chrome/browser/extensions/extension_content_settings_store.cc +++ b/chrome/browser/extensions/extension_content_settings_store.cc @@ -165,16 +165,16 @@ ExtensionContentSettingsStore::ContentSettingSpecList* const std::string& ext_id, ExtensionPrefsScope scope) { ExtensionEntryMap::const_iterator i = entries_.find(ext_id); - DCHECK(i != entries_.end()); - switch (scope) { - case kExtensionPrefsScopeRegular: - return &(i->second->settings); - case kExtensionPrefsScopeIncognitoPersistent: - return &(i->second->incognito_persistent_settings); - case kExtensionPrefsScopeIncognitoSessionOnly: - return &(i->second->incognito_session_only_settings); + if (i != entries_.end()) { + switch (scope) { + case kExtensionPrefsScopeRegular: + return &(i->second->settings); + case kExtensionPrefsScopeIncognitoPersistent: + return &(i->second->incognito_persistent_settings); + case kExtensionPrefsScopeIncognitoSessionOnly: + return &(i->second->incognito_session_only_settings); + } } - NOTREACHED(); return NULL; } @@ -183,16 +183,16 @@ const ExtensionContentSettingsStore::ContentSettingSpecList* const std::string& ext_id, ExtensionPrefsScope scope) const { ExtensionEntryMap::const_iterator i = entries_.find(ext_id); - DCHECK(i != entries_.end()); - switch (scope) { - case kExtensionPrefsScopeRegular: - return &(i->second->settings); - case kExtensionPrefsScopeIncognitoPersistent: - return &(i->second->incognito_persistent_settings); - case kExtensionPrefsScopeIncognitoSessionOnly: - return &(i->second->incognito_session_only_settings); + if (i != entries_.end()) { + switch (scope) { + case kExtensionPrefsScopeRegular: + return &(i->second->settings); + case kExtensionPrefsScopeIncognitoPersistent: + return &(i->second->incognito_persistent_settings); + case kExtensionPrefsScopeIncognitoSessionOnly: + return &(i->second->incognito_session_only_settings); + } } - NOTREACHED(); return NULL; } @@ -339,9 +339,11 @@ ListValue* ExtensionContentSettingsStore::GetSettingsForExtension( const std::string& extension_id, ExtensionPrefsScope scope) const { base::AutoLock lock(lock_); - ListValue* settings = new ListValue(); const ContentSettingSpecList* setting_spec_list = GetContentSettingSpecList(extension_id, scope); + if (!setting_spec_list) + return NULL; + ListValue* settings = new ListValue(); ContentSettingSpecList::const_iterator it; for (it = setting_spec_list->begin(); it != setting_spec_list->end(); ++it) { DictionaryValue* setting_dict = new DictionaryValue(); diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc index 816b5ce..94af184 100644 --- a/chrome/browser/extensions/extension_prefs.cc +++ b/chrome/browser/extensions/extension_prefs.cc @@ -1100,18 +1100,21 @@ void ExtensionPrefs::UpdateExtensionPref(const std::string& extension_id, return; } ScopedExtensionPrefUpdate update(prefs_, extension_id); - update->Set(key, data_value); + if (data_value) + update->Set(key, data_value); + else + update->Remove(key, NULL); } void ExtensionPrefs::DeleteExtensionPrefs(const std::string& extension_id) { + extension_pref_value_map_->UnregisterExtension(extension_id); + content_settings_store_->UnregisterExtension(extension_id); DictionaryPrefUpdate update(prefs_, kExtensionsPref); DictionaryValue* dict = update.Get(); if (dict->HasKey(extension_id)) { dict->Remove(extension_id, NULL); SavePrefs(); } - extension_pref_value_map_->UnregisterExtension(extension_id); - content_settings_store_->UnregisterExtension(extension_id); } const DictionaryValue* ExtensionPrefs::GetExtensionPref( diff --git a/chrome/browser/extensions/extension_prefs.h b/chrome/browser/extensions/extension_prefs.h index e17f739..fe759ac 100644 --- a/chrome/browser/extensions/extension_prefs.h +++ b/chrome/browser/extensions/extension_prefs.h @@ -367,6 +367,8 @@ class ExtensionPrefs : public ExtensionContentSettingsStore::Observer { virtual base::Time GetCurrentTime() const; private: + friend class ExtensionPrefsUninstallExtension; // Unit test. + // ExtensionContentSettingsStore::Observer methods: virtual void OnContentSettingChanged( const std::string& extension_id, diff --git a/chrome/browser/extensions/extension_prefs_unittest.cc b/chrome/browser/extensions/extension_prefs_unittest.cc index f9a552a..b536410 100644 --- a/chrome/browser/extensions/extension_prefs_unittest.cc +++ b/chrome/browser/extensions/extension_prefs_unittest.cc @@ -932,10 +932,21 @@ class ExtensionPrefsUninstallExtension virtual void Initialize() { InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val2")); + ExtensionContentSettingsStore* store = prefs()->content_settings_store(); + ContentSettingsPattern pattern = + ContentSettingsPattern::FromString("http://[*.]example.com"); + store->SetExtensionContentSetting(ext1_->id(), + pattern, pattern, + CONTENT_SETTINGS_TYPE_IMAGES, + std::string(), + CONTENT_SETTING_BLOCK, + kExtensionPrefsScopeRegular); UninstallExtension(ext1_->id()); } virtual void Verify() { + EXPECT_EQ(NULL, prefs()->GetExtensionPref(ext1_->id())); + std::string actual; actual = prefs()->pref_service()->GetString(kPref1); EXPECT_EQ(kDefaultPref1, actual); |