Index: chrome/browser/extensions/extension_prefs.cc |
diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc |
index 5529194fb82e2fb993dda3e8bebce78599197e9c..57cd52acdb18f046b56a1401b59825281f716073 100644 |
--- a/chrome/browser/extensions/extension_prefs.cc |
+++ b/chrome/browser/extensions/extension_prefs.cc |
@@ -113,6 +113,9 @@ const char kPrefInstallTime[] = "install_time"; |
// A preference that contains any extension-controlled preferences. |
const char kPrefPreferences[] = "preferences"; |
+// A preference that contains any extension-controlled incognito preferences. |
+const char kPrefIncognitoPreferences[] = "incognito_preferences"; |
+ |
// A preference that contains extension-set content settings. |
const char kPrefContentSettings[] = "content_settings"; |
@@ -150,11 +153,17 @@ class ScopedExtensionPrefUpdate : public DictionaryPrefUpdate { |
// Provider of write access to a dictionary storing extension controlled prefs. |
class ScopedExtensionControlledPrefUpdate : public DictionaryPrefUpdate { |
public: |
- ScopedExtensionControlledPrefUpdate(PrefService* service, |
- const std::string& extension_id) : |
+ // |incognito_or_regular_path| indicates the sub-path where the |
+ // extension controlled preferences are stored. This has to be either |
+ // kPrefPreferences or kPrefIncognitoPreferences. |
+ ScopedExtensionControlledPrefUpdate( |
+ PrefService* service, |
+ const std::string& extension_id, |
+ const std::string& incognito_or_regular_path) : |
DictionaryPrefUpdate(service, ExtensionPrefs::kExtensionsPref), |
prefs_(service), |
- extension_id_(extension_id) {} |
+ extension_id_(extension_id), |
+ incognito_or_regular_path_(incognito_or_regular_path) {} |
virtual ~ScopedExtensionControlledPrefUpdate() { |
prefs_->ScheduleSavePersistentPrefs(); |
@@ -163,7 +172,8 @@ class ScopedExtensionControlledPrefUpdate : public DictionaryPrefUpdate { |
virtual DictionaryValue* Get() { |
DictionaryValue* dict = DictionaryPrefUpdate::Get(); |
DictionaryValue* preferences = NULL; |
- std::string key = extension_id_ + std::string(".") + kPrefPreferences; |
+ std::string key = |
+ extension_id_ + std::string(".") + incognito_or_regular_path_; |
if (!dict->GetDictionary(key, &preferences)) { |
preferences = new DictionaryValue; |
dict->Set(key, preferences); |
@@ -174,6 +184,7 @@ class ScopedExtensionControlledPrefUpdate : public DictionaryPrefUpdate { |
private: |
PrefService* prefs_; |
const std::string extension_id_; |
+ const std::string incognito_or_regular_path_; |
DISALLOW_COPY_AND_ASSIGN(ScopedExtensionControlledPrefUpdate); |
}; |
@@ -882,6 +893,7 @@ void ExtensionPrefs::OnExtensionInstalled( |
Value::CreateStringValue( |
base::Int64ToString(install_time.ToInternalValue()))); |
extension_dict->Set(kPrefPreferences, new DictionaryValue()); |
+ extension_dict->Set(kPrefIncognitoPreferences, new DictionaryValue()); |
extension_dict->Set(kPrefContentSettings, new ListValue()); |
FilePath::StringType path = MakePathRelative(install_directory_, |
@@ -1374,8 +1386,10 @@ void ExtensionPrefs::FixMissingPrefs(const ExtensionIdSet& extension_ids) { |
} |
const DictionaryValue* ExtensionPrefs::GetExtensionControlledPrefs( |
- const std::string& extension_id) const { |
- std::string key = extension_id + std::string(".") + kPrefPreferences; |
+ const std::string& extension_id, |
+ bool incognito) const { |
+ std::string key = extension_id + std::string(".") + |
+ (incognito ? kPrefIncognitoPreferences : kPrefPreferences); |
DictionaryValue* preferences = NULL; |
// First try the regular lookup. |
const DictionaryValue* source_dict = prefs_->GetDictionary(kExtensionsPref); |
@@ -1417,14 +1431,27 @@ void ExtensionPrefs::InitPrefStore() { |
GetInstallTime(*ext_id), |
GetExtensionState(*ext_id) == Extension::ENABLED); |
- const DictionaryValue* prefs = GetExtensionControlledPrefs(*ext_id); |
+ // Set regular extension controlled prefs. |
+ const DictionaryValue* prefs = GetExtensionControlledPrefs(*ext_id, false); |
+ for (DictionaryValue::key_iterator i = prefs->begin_keys(); |
+ i != prefs->end_keys(); ++i) { |
+ Value* value; |
+ if (!prefs->GetWithoutPathExpansion(*i, &value)) |
+ continue; |
+ extension_pref_value_map_->SetExtensionPref( |
+ *ext_id, *i, extension_prefs_scope::kRegular, value->DeepCopy()); |
+ } |
+ |
+ // Set incognito extension controlled prefs. |
+ prefs = GetExtensionControlledPrefs(*ext_id, true); |
for (DictionaryValue::key_iterator i = prefs->begin_keys(); |
i != prefs->end_keys(); ++i) { |
Value* value; |
if (!prefs->GetWithoutPathExpansion(*i, &value)) |
continue; |
extension_pref_value_map_->SetExtensionPref( |
- *ext_id, *i, false, value->DeepCopy()); |
+ *ext_id, *i, extension_prefs_scope::kIncognitoPersistent, |
+ value->DeepCopy()); |
} |
const DictionaryValue* extension_prefs = GetExtensionPref(*ext_id); |
@@ -1440,10 +1467,11 @@ void ExtensionPrefs::InitPrefStore() { |
} |
-void ExtensionPrefs::SetExtensionControlledPref(const std::string& extension_id, |
- const std::string& pref_key, |
- bool incognito, |
- Value* value) { |
+void ExtensionPrefs::SetExtensionControlledPref( |
+ const std::string& extension_id, |
+ const std::string& pref_key, |
+ extension_prefs_scope::Scope scope, |
+ Value* value) { |
#ifndef NDEBUG |
const PrefService::Preference* pref = |
pref_service()->FindPreference(pref_key.c_str()); |
@@ -1453,34 +1481,44 @@ void ExtensionPrefs::SetExtensionControlledPref(const std::string& extension_id, |
<< "Extension controlled preference " << pref_key << " has wrong type."; |
#endif |
- if (!incognito) { |
+ if (scope == extension_prefs_scope::kRegular) { |
// Also store in persisted Preferences file to recover after a |
// browser restart. |
- ScopedExtensionControlledPrefUpdate update(prefs_, extension_id); |
+ ScopedExtensionControlledPrefUpdate update(prefs_, extension_id, |
+ kPrefPreferences); |
+ update->SetWithoutPathExpansion(pref_key, value->DeepCopy()); |
+ } else if (scope == extension_prefs_scope::kIncognitoPersistent) { |
+ ScopedExtensionControlledPrefUpdate update(prefs_, extension_id, |
+ kPrefIncognitoPreferences); |
update->SetWithoutPathExpansion(pref_key, value->DeepCopy()); |
} |
extension_pref_value_map_->SetExtensionPref( |
- extension_id, pref_key, incognito, value); |
+ extension_id, pref_key, scope, value); |
} |
void ExtensionPrefs::RemoveExtensionControlledPref( |
const std::string& extension_id, |
const std::string& pref_key, |
- bool incognito) { |
+ extension_prefs_scope::Scope scope) { |
DCHECK(pref_service()->FindPreference(pref_key.c_str())) |
<< "Extension controlled preference key " << pref_key |
<< " not registered."; |
- if (!incognito) { |
+ if (scope == extension_prefs_scope::kRegular) { |
// Also store in persisted Preferences file to recover after a |
// browser restart. |
- ScopedExtensionControlledPrefUpdate update(prefs_, extension_id); |
+ ScopedExtensionControlledPrefUpdate update(prefs_, extension_id, |
+ kPrefPreferences); |
+ update->RemoveWithoutPathExpansion(pref_key, NULL); |
+ } else if (scope == extension_prefs_scope::kIncognitoPersistent) { |
+ ScopedExtensionControlledPrefUpdate update(prefs_, extension_id, |
+ kPrefIncognitoPreferences); |
update->RemoveWithoutPathExpansion(pref_key, NULL); |
} |
extension_pref_value_map_->RemoveExtensionPref( |
- extension_id, pref_key, incognito); |
+ extension_id, pref_key, scope); |
} |
bool ExtensionPrefs::CanExtensionControlPref(const std::string& extension_id, |