diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-14 22:32:39 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-14 22:32:39 +0000 |
commit | 0c6da50c299be943b4c04a3953e0931734af7eaf (patch) | |
tree | b5fa120b75591c1fa56a07232cf685ac1b2a8eb8 /chrome/browser/extensions/extension_prefs.cc | |
parent | a7918784c2ac95844ae775be2fef06cd3efb092c (diff) | |
download | chromium_src-0c6da50c299be943b4c04a3953e0931734af7eaf.zip chromium_src-0c6da50c299be943b4c04a3953e0931734af7eaf.tar.gz chromium_src-0c6da50c299be943b4c04a3953e0931734af7eaf.tar.bz2 |
Disable an extension when it is upgraded to a version that requires more
permissions then before, and prompt the user to re-enable.
Incidentally, this required adding support for disabling extensions.
BUG=12140
TEST=covered by unit tests
Review URL: http://codereview.chromium.org/165414
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23480 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_prefs.cc')
-rw-r--r-- | chrome/browser/extensions/extension_prefs.cc | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc index bc88831..84ee99d 100644 --- a/chrome/browser/extensions/extension_prefs.cc +++ b/chrome/browser/extensions/extension_prefs.cc @@ -299,7 +299,7 @@ void ExtensionPrefs::SetShelfToolstripOrder(const URLList& urls) { } void ExtensionPrefs::OnExtensionInstalled(Extension* extension) { - std::string id = extension->id(); + const std::string& id = extension->id(); UpdateExtensionPref(id, kPrefState, Value::CreateIntegerValue(Extension::ENABLED)); UpdateExtensionPref(id, kPrefLocation, @@ -326,12 +326,37 @@ void ExtensionPrefs::OnExtensionUninstalled(const Extension* extension, } } +Extension::State ExtensionPrefs::GetExtensionState( + const std::string& extension_id) { + DictionaryValue* extension = GetExtensionPref(extension_id); + + // If the extension doesn't have a pref, it's a --load-extension. + if (!extension) + return Extension::ENABLED; + + int state = -1; + if (!extension->GetInteger(kPrefState, &state) || + state < 0 || state >= Extension::NUM_STATES) { + LOG(ERROR) << "Bad or missing pref 'state' for extension '" + << extension_id << "'"; + return Extension::ENABLED; + } + return static_cast<Extension::State>(state); +} + +void ExtensionPrefs::SetExtensionState(Extension* extension, + Extension::State state) { + UpdateExtensionPref(extension->id(), kPrefState, + Value::CreateIntegerValue(state)); + prefs_->SavePersistentPrefs(); +} + bool ExtensionPrefs::UpdateExtensionPref(const std::string& extension_id, const std::wstring& key, Value* data_value) { DictionaryValue* extension = GetOrCreateExtensionPref(extension_id); if (!extension->Set(key, data_value)) { - NOTREACHED() << L"Cannot modify key: '" << key.c_str() + NOTREACHED() << "Cannot modify key: '" << key.c_str() << "' for extension: '" << extension_id.c_str() << "'"; return false; } @@ -359,3 +384,12 @@ DictionaryValue* ExtensionPrefs::GetOrCreateExtensionPref( } return extension; } + +DictionaryValue* ExtensionPrefs::GetExtensionPref( + const std::string& extension_id) { + const DictionaryValue* dict = prefs_->GetDictionary(kExtensionsPref); + DictionaryValue* extension = NULL; + std::wstring id = ASCIIToWide(extension_id); + dict->GetDictionary(id, &extension); + return extension; +} |