| Index: chrome/browser/extensions/extension_prefs.cc
|
| diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc
|
| index 058ede3396ed79a0203d15138dbabcec6a140cac..3fbea883f29b88a199c8f7e7762cf0b53b9d5562 100644
|
| --- a/chrome/browser/extensions/extension_prefs.cc
|
| +++ b/chrome/browser/extensions/extension_prefs.cc
|
| @@ -14,11 +14,7 @@ using base::Time;
|
|
|
| namespace {
|
|
|
| -// Preferences keys
|
| -
|
| -// A preference that keeps track of per-extension settings. This is a dictionary
|
| -// object read from the Preferences file, keyed off of extension id's.
|
| -const char kExtensionsPref[] = "extensions.settings";
|
| +// Additional preferences keys
|
|
|
| // Where an extension was installed from. (see Extension::Location)
|
| const char kPrefLocation[] = "location";
|
| @@ -79,6 +75,10 @@ const char kPrefAllowFileAccess[] = "allowFileAccess";
|
| // purchased apps.
|
| const char kWebStoreLogin[] = "extensions.webstore_login";
|
|
|
| +// A preference set by the the NTP to persist the desired launch container type
|
| +// used for apps.
|
| +const char kPrefLaunchType[] = "launchType";
|
| +
|
| } // namespace
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -90,7 +90,8 @@ namespace {
|
| // id. We can remove this in a couple of months. (See http://crbug.com/40017
|
| // and http://crbug.com/39745 for more details).
|
| static void CleanupBadExtensionKeys(PrefService* prefs) {
|
| - DictionaryValue* dictionary = prefs->GetMutableDictionary(kExtensionsPref);
|
| + DictionaryValue* dictionary =
|
| + prefs->GetMutableDictionary(ExtensionPrefs::kExtensionsPref);
|
| std::set<std::string> bad_keys;
|
| for (DictionaryValue::key_iterator i = dictionary->begin_keys();
|
| i != dictionary->end_keys(); ++i) {
|
| @@ -121,6 +122,9 @@ ExtensionPrefs::ExtensionPrefs(PrefService* prefs, const FilePath& root_dir)
|
| MakePathsRelative();
|
| }
|
|
|
| +// static
|
| +const char ExtensionPrefs::kExtensionsPref[] = "extensions.settings";
|
| +
|
| static FilePath::StringType MakePathRelative(const FilePath& parent,
|
| const FilePath& child,
|
| bool *dirty) {
|
| @@ -164,7 +168,7 @@ void ExtensionPrefs::MakePathsRelative() {
|
| }
|
| }
|
| if (dirty)
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| void ExtensionPrefs::MakePathsAbsolute(DictionaryValue* dict) {
|
| @@ -233,6 +237,36 @@ bool ExtensionPrefs::ReadExtensionPrefBoolean(
|
| return ReadBooleanFromPref(ext, pref_key);
|
| }
|
|
|
| +bool ExtensionPrefs::ReadIntegerFromPref(
|
| + DictionaryValue* ext, const std::string& pref_key, int* out_value) {
|
| + if (!ext->HasKey(pref_key)) return false;
|
| + if (!ext->GetInteger(pref_key, out_value)) {
|
| + NOTREACHED() << "Failed to fetch " << pref_key << " flag.";
|
| + // In case we could not fetch the flag, we treat it as false.
|
| + return false;
|
| + }
|
| + return out_value != NULL;
|
| +}
|
| +
|
| +bool ExtensionPrefs::ReadExtensionPrefInteger(
|
| + const std::string& extension_id, const std::string& pref_key,
|
| + int* out_value) {
|
| + const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref);
|
| + if (!extensions)
|
| + return false;
|
| + DictionaryValue* ext = NULL;
|
| + if (!extensions->GetDictionary(extension_id, &ext)) {
|
| + // No such extension yet.
|
| + return false;
|
| + }
|
| + return ReadIntegerFromPref(ext, pref_key, out_value);
|
| +}
|
| +
|
| +void ExtensionPrefs::SavePrefsAndNotify() {
|
| + prefs_->ScheduleSavePersistentPrefs();
|
| + prefs_->pref_notifier()->OnUserPreferenceSet(kExtensionsPref);
|
| +}
|
| +
|
| bool ExtensionPrefs::IsBlacklistBitSet(DictionaryValue* ext) {
|
| return ReadBooleanFromPref(ext, kPrefBlacklist);
|
| }
|
| @@ -289,7 +323,7 @@ void ExtensionPrefs::SetDidExtensionEscalatePermissions(
|
| Extension* extension, bool did_escalate) {
|
| UpdateExtensionPref(extension->id(), kExtensionDidEscalatePermissions,
|
| Value::CreateBooleanValue(did_escalate));
|
| - prefs_->SavePersistentPrefs();
|
| + prefs_->ScheduleSavePersistentPrefs();
|
| }
|
|
|
| void ExtensionPrefs::UpdateBlacklist(
|
| @@ -343,8 +377,7 @@ void ExtensionPrefs::UpdateBlacklist(
|
| for (unsigned int i = 0; i < remove_pref_ids.size(); ++i) {
|
| DeleteExtensionPrefs(remove_pref_ids[i]);
|
| }
|
| - // Update persistent registry
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| return;
|
| }
|
|
|
| @@ -368,7 +401,7 @@ void ExtensionPrefs::SetLastPingDayImpl(const Time& time,
|
| }
|
| std::string value = base::Int64ToString(time.ToInternalValue());
|
| dictionary->SetString(kLastPingDay, value);
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| Time ExtensionPrefs::LastPingDay(const std::string& extension_id) const {
|
| @@ -399,7 +432,7 @@ void ExtensionPrefs::SetIsIncognitoEnabled(const std::string& extension_id,
|
| bool enabled) {
|
| UpdateExtensionPref(extension_id, kPrefIncognitoEnabled,
|
| Value::CreateBooleanValue(enabled));
|
| - prefs_->SavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| bool ExtensionPrefs::AllowFileAccess(const std::string& extension_id) {
|
| @@ -410,7 +443,26 @@ void ExtensionPrefs::SetAllowFileAccess(const std::string& extension_id,
|
| bool allow) {
|
| UpdateExtensionPref(extension_id, kPrefAllowFileAccess,
|
| Value::CreateBooleanValue(allow));
|
| - prefs_->SavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| +}
|
| +
|
| +ExtensionPrefs::LaunchType ExtensionPrefs::GetLaunchType(
|
| + const std::string& extension_id) {
|
| + int value;
|
| + if (ReadExtensionPrefInteger(extension_id, kPrefLaunchType, &value) && (
|
| + value == LAUNCH_PINNED ||
|
| + value == LAUNCH_REGULAR ||
|
| + value == LAUNCH_FULLSCREEN)) {
|
| + return static_cast<LaunchType>(value);
|
| + }
|
| + return LAUNCH_PINNED;
|
| +}
|
| +
|
| +void ExtensionPrefs::SetLaunchType(const std::string& extension_id,
|
| + LaunchType launch_type) {
|
| + UpdateExtensionPref(extension_id, kPrefLaunchType,
|
| + Value::CreateIntegerValue(static_cast<int>(launch_type)));
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| void ExtensionPrefs::GetKilledExtensionIds(std::set<std::string>* killed_ids) {
|
| @@ -462,7 +514,7 @@ void ExtensionPrefs::SetToolbarOrder(
|
| iter != extension_ids.end(); ++iter) {
|
| toolbar_order->Append(new StringValue(*iter));
|
| }
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| void ExtensionPrefs::OnExtensionInstalled(
|
| @@ -484,7 +536,7 @@ void ExtensionPrefs::OnExtensionInstalled(
|
| UpdateExtensionPref(id, kPrefManifest,
|
| extension->manifest_value()->DeepCopy());
|
| }
|
| - prefs_->SavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| void ExtensionPrefs::OnExtensionUninstalled(const std::string& extension_id,
|
| @@ -497,7 +549,7 @@ void ExtensionPrefs::OnExtensionUninstalled(const std::string& extension_id,
|
| if (!external_uninstall && Extension::IsExternalLocation(location)) {
|
| UpdateExtensionPref(extension_id, kPrefState,
|
| Value::CreateIntegerValue(Extension::KILLBIT));
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| } else {
|
| DeleteExtensionPrefs(extension_id);
|
| }
|
| @@ -525,7 +577,7 @@ void ExtensionPrefs::SetExtensionState(Extension* extension,
|
| Extension::State state) {
|
| UpdateExtensionPref(extension->id(), kPrefState,
|
| Value::CreateIntegerValue(state));
|
| - prefs_->SavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| std::string ExtensionPrefs::GetVersionString(const std::string& extension_id) {
|
| @@ -546,7 +598,7 @@ void ExtensionPrefs::UpdateManifest(Extension* extension) {
|
| if (extension->location() != Extension::LOAD) {
|
| UpdateExtensionPref(extension->id(), kPrefManifest,
|
| extension->manifest_value()->DeepCopy());
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
| }
|
|
|
| @@ -577,7 +629,7 @@ void ExtensionPrefs::DeleteExtensionPrefs(const std::string& extension_id) {
|
| DictionaryValue* dict = prefs_->GetMutableDictionary(kExtensionsPref);
|
| if (dict->HasKey(extension_id)) {
|
| dict->Remove(extension_id, NULL);
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
| }
|
|
|
| @@ -717,7 +769,7 @@ void ExtensionPrefs::SetIdleInstallInfo(const std::string& extension_id,
|
| info->SetString(kIdleInstallInfoFetchTime,
|
| base::Int64ToString(fetch_time.ToInternalValue()));
|
| extension_prefs->Set(kIdleInstallInfo, info);
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| bool ExtensionPrefs::RemoveIdleInstallInfo(const std::string& extension_id) {
|
| @@ -725,7 +777,7 @@ bool ExtensionPrefs::RemoveIdleInstallInfo(const std::string& extension_id) {
|
| if (!extension_prefs)
|
| return false;
|
| bool result = extension_prefs->Remove(kIdleInstallInfo, NULL);
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| return result;
|
| }
|
|
|
| @@ -807,7 +859,7 @@ bool ExtensionPrefs::GetWebStoreLogin(std::string* result) {
|
|
|
| void ExtensionPrefs::SetWebStoreLogin(const std::string& login) {
|
| prefs_->SetString(kWebStoreLogin, login);
|
| - prefs_->ScheduleSavePersistentPrefs();
|
| + SavePrefsAndNotify();
|
| }
|
|
|
| // static
|
|
|