Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(624)

Side by Side Diff: chrome/browser/extensions/extension_prefs.cc

Issue 7065033: Support persistent incognito preferences (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/extension_prefs.h" 5 #include "chrome/browser/extensions/extension_prefs.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "chrome/browser/extensions/extension_pref_store.h" 10 #include "chrome/browser/extensions/extension_pref_store.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 const char kPrefGrantedPermissionsAPI[] = "granted_permissions.api"; 106 const char kPrefGrantedPermissionsAPI[] = "granted_permissions.api";
107 const char kPrefGrantedPermissionsHost[] = "granted_permissions.host"; 107 const char kPrefGrantedPermissionsHost[] = "granted_permissions.host";
108 const char kPrefGrantedPermissionsAll[] = "granted_permissions.full"; 108 const char kPrefGrantedPermissionsAll[] = "granted_permissions.full";
109 109
110 // A preference that indicates when an extension was installed. 110 // A preference that indicates when an extension was installed.
111 const char kPrefInstallTime[] = "install_time"; 111 const char kPrefInstallTime[] = "install_time";
112 112
113 // A preference that contains any extension-controlled preferences. 113 // A preference that contains any extension-controlled preferences.
114 const char kPrefPreferences[] = "preferences"; 114 const char kPrefPreferences[] = "preferences";
115 115
116 // A preference that contains any extension-controlled incognito preferences.
117 const char kPrefIncognitoPreferences[] = "incognito_preferences";
118
116 // A preference that contains extension-set content settings. 119 // A preference that contains extension-set content settings.
117 const char kPrefContentSettings[] = "content_settings"; 120 const char kPrefContentSettings[] = "content_settings";
118 121
119 // Provider of write access to a dictionary storing extension prefs. 122 // Provider of write access to a dictionary storing extension prefs.
120 class ScopedExtensionPrefUpdate : public DictionaryPrefUpdate { 123 class ScopedExtensionPrefUpdate : public DictionaryPrefUpdate {
121 public: 124 public:
122 ScopedExtensionPrefUpdate(PrefService* service, 125 ScopedExtensionPrefUpdate(PrefService* service,
123 const std::string& extension_id) : 126 const std::string& extension_id) :
124 DictionaryPrefUpdate(service, ExtensionPrefs::kExtensionsPref), 127 DictionaryPrefUpdate(service, ExtensionPrefs::kExtensionsPref),
125 prefs_(service), 128 prefs_(service),
(...skipping 17 matching lines...) Expand all
143 private: 146 private:
144 PrefService* prefs_; 147 PrefService* prefs_;
145 const std::string extension_id_; 148 const std::string extension_id_;
146 149
147 DISALLOW_COPY_AND_ASSIGN(ScopedExtensionPrefUpdate); 150 DISALLOW_COPY_AND_ASSIGN(ScopedExtensionPrefUpdate);
148 }; 151 };
149 152
150 // Provider of write access to a dictionary storing extension controlled prefs. 153 // Provider of write access to a dictionary storing extension controlled prefs.
151 class ScopedExtensionControlledPrefUpdate : public DictionaryPrefUpdate { 154 class ScopedExtensionControlledPrefUpdate : public DictionaryPrefUpdate {
152 public: 155 public:
153 ScopedExtensionControlledPrefUpdate(PrefService* service, 156 // |incognito_or_regular_path| indicates the sub-path where the
154 const std::string& extension_id) : 157 // extension controlled preferences are stored. This has to be either
158 // kPrefPreferences or kPrefIncognitoPreferences.
159 ScopedExtensionControlledPrefUpdate(
160 PrefService* service,
161 const std::string& extension_id,
162 const std::string& incognito_or_regular_path) :
155 DictionaryPrefUpdate(service, ExtensionPrefs::kExtensionsPref), 163 DictionaryPrefUpdate(service, ExtensionPrefs::kExtensionsPref),
156 prefs_(service), 164 prefs_(service),
157 extension_id_(extension_id) {} 165 extension_id_(extension_id),
166 incognito_or_regular_path_(incognito_or_regular_path) {}
158 167
159 virtual ~ScopedExtensionControlledPrefUpdate() { 168 virtual ~ScopedExtensionControlledPrefUpdate() {
160 prefs_->ScheduleSavePersistentPrefs(); 169 prefs_->ScheduleSavePersistentPrefs();
161 } 170 }
162 171
163 virtual DictionaryValue* Get() { 172 virtual DictionaryValue* Get() {
164 DictionaryValue* dict = DictionaryPrefUpdate::Get(); 173 DictionaryValue* dict = DictionaryPrefUpdate::Get();
165 DictionaryValue* preferences = NULL; 174 DictionaryValue* preferences = NULL;
166 std::string key = extension_id_ + std::string(".") + kPrefPreferences; 175 std::string key =
176 extension_id_ + std::string(".") + incognito_or_regular_path_;
167 if (!dict->GetDictionary(key, &preferences)) { 177 if (!dict->GetDictionary(key, &preferences)) {
168 preferences = new DictionaryValue; 178 preferences = new DictionaryValue;
169 dict->Set(key, preferences); 179 dict->Set(key, preferences);
170 } 180 }
171 return preferences; 181 return preferences;
172 } 182 }
173 183
174 private: 184 private:
175 PrefService* prefs_; 185 PrefService* prefs_;
176 const std::string extension_id_; 186 const std::string extension_id_;
187 const std::string incognito_or_regular_path_;
177 188
178 DISALLOW_COPY_AND_ASSIGN(ScopedExtensionControlledPrefUpdate); 189 DISALLOW_COPY_AND_ASSIGN(ScopedExtensionControlledPrefUpdate);
179 }; 190 };
180 191
181 // TODO(mihaip): This is cleanup code for keys for unpacked extensions (which 192 // TODO(mihaip): This is cleanup code for keys for unpacked extensions (which
182 // are derived from paths). As part of the wstring removal, we changed the way 193 // are derived from paths). As part of the wstring removal, we changed the way
183 // we hash paths, so we need to move prefs from their old synthesized IDs to 194 // we hash paths, so we need to move prefs from their old synthesized IDs to
184 // their new ones. We can remove this by July 2011. (See http://crbug.com/75945 195 // their new ones. We can remove this by July 2011. (See http://crbug.com/75945
185 // for more details). 196 // for more details).
186 static void CleanupBadExtensionKeys(const FilePath& root_dir, 197 static void CleanupBadExtensionKeys(const FilePath& root_dir,
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
875 ScopedExtensionPrefUpdate update(prefs_, id); 886 ScopedExtensionPrefUpdate update(prefs_, id);
876 DictionaryValue* extension_dict = update.Get(); 887 DictionaryValue* extension_dict = update.Get();
877 const base::Time install_time = GetCurrentTime(); 888 const base::Time install_time = GetCurrentTime();
878 extension_dict->Set(kPrefState, Value::CreateIntegerValue(initial_state)); 889 extension_dict->Set(kPrefState, Value::CreateIntegerValue(initial_state));
879 extension_dict->Set(kPrefLocation, 890 extension_dict->Set(kPrefLocation,
880 Value::CreateIntegerValue(extension->location())); 891 Value::CreateIntegerValue(extension->location()));
881 extension_dict->Set(kPrefInstallTime, 892 extension_dict->Set(kPrefInstallTime,
882 Value::CreateStringValue( 893 Value::CreateStringValue(
883 base::Int64ToString(install_time.ToInternalValue()))); 894 base::Int64ToString(install_time.ToInternalValue())));
884 extension_dict->Set(kPrefPreferences, new DictionaryValue()); 895 extension_dict->Set(kPrefPreferences, new DictionaryValue());
896 extension_dict->Set(kPrefIncognitoPreferences, new DictionaryValue());
885 extension_dict->Set(kPrefContentSettings, new ListValue()); 897 extension_dict->Set(kPrefContentSettings, new ListValue());
886 898
887 FilePath::StringType path = MakePathRelative(install_directory_, 899 FilePath::StringType path = MakePathRelative(install_directory_,
888 extension->path()); 900 extension->path());
889 extension_dict->Set(kPrefPath, Value::CreateStringValue(path)); 901 extension_dict->Set(kPrefPath, Value::CreateStringValue(path));
890 // We store prefs about LOAD extensions, but don't cache their manifest 902 // We store prefs about LOAD extensions, but don't cache their manifest
891 // since it may change on disk. 903 // since it may change on disk.
892 if (extension->location() != Extension::LOAD) { 904 if (extension->location() != Extension::LOAD) {
893 extension_dict->Set(kPrefManifest, 905 extension_dict->Set(kPrefManifest,
894 extension->manifest_value()->DeepCopy()); 906 extension->manifest_value()->DeepCopy());
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
1367 << kPrefInstallTime << " was introduced. Updating " 1379 << kPrefInstallTime << " was introduced. Updating "
1368 << kPrefInstallTime << " to the current time."; 1380 << kPrefInstallTime << " to the current time.";
1369 const base::Time install_time = GetCurrentTime(); 1381 const base::Time install_time = GetCurrentTime();
1370 UpdateExtensionPref(*ext_id, kPrefInstallTime, Value::CreateStringValue( 1382 UpdateExtensionPref(*ext_id, kPrefInstallTime, Value::CreateStringValue(
1371 base::Int64ToString(install_time.ToInternalValue()))); 1383 base::Int64ToString(install_time.ToInternalValue())));
1372 } 1384 }
1373 } 1385 }
1374 } 1386 }
1375 1387
1376 const DictionaryValue* ExtensionPrefs::GetExtensionControlledPrefs( 1388 const DictionaryValue* ExtensionPrefs::GetExtensionControlledPrefs(
1377 const std::string& extension_id) const { 1389 const std::string& extension_id,
1378 std::string key = extension_id + std::string(".") + kPrefPreferences; 1390 bool incognito) const {
1391 std::string key = extension_id + std::string(".") +
1392 (incognito ? kPrefIncognitoPreferences : kPrefPreferences);
1379 DictionaryValue* preferences = NULL; 1393 DictionaryValue* preferences = NULL;
1380 // First try the regular lookup. 1394 // First try the regular lookup.
1381 const DictionaryValue* source_dict = prefs_->GetDictionary(kExtensionsPref); 1395 const DictionaryValue* source_dict = prefs_->GetDictionary(kExtensionsPref);
1382 if (!source_dict->GetDictionary(key, &preferences)) { 1396 if (!source_dict->GetDictionary(key, &preferences)) {
1383 // And then create a dictionary if it did not exist before. 1397 // And then create a dictionary if it did not exist before.
1384 DictionaryPrefUpdate update(prefs_, kExtensionsPref); 1398 DictionaryPrefUpdate update(prefs_, kExtensionsPref);
1385 preferences = new DictionaryValue; 1399 preferences = new DictionaryValue;
1386 update->Set(key, preferences); 1400 update->Set(key, preferences);
1387 } 1401 }
1388 return preferences; 1402 return preferences;
(...skipping 21 matching lines...) Expand all
1410 ext_id != extension_ids.end(); ++ext_id) { 1424 ext_id != extension_ids.end(); ++ext_id) {
1411 extension_pref_value_map_->RegisterExtension( 1425 extension_pref_value_map_->RegisterExtension(
1412 *ext_id, 1426 *ext_id,
1413 GetInstallTime(*ext_id), 1427 GetInstallTime(*ext_id),
1414 GetExtensionState(*ext_id) == Extension::ENABLED); 1428 GetExtensionState(*ext_id) == Extension::ENABLED);
1415 content_settings_store_->RegisterExtension( 1429 content_settings_store_->RegisterExtension(
1416 *ext_id, 1430 *ext_id,
1417 GetInstallTime(*ext_id), 1431 GetInstallTime(*ext_id),
1418 GetExtensionState(*ext_id) == Extension::ENABLED); 1432 GetExtensionState(*ext_id) == Extension::ENABLED);
1419 1433
1420 const DictionaryValue* prefs = GetExtensionControlledPrefs(*ext_id); 1434 // Set regular extension controlled prefs.
1435 const DictionaryValue* prefs = GetExtensionControlledPrefs(*ext_id, false);
1421 for (DictionaryValue::key_iterator i = prefs->begin_keys(); 1436 for (DictionaryValue::key_iterator i = prefs->begin_keys();
1422 i != prefs->end_keys(); ++i) { 1437 i != prefs->end_keys(); ++i) {
1423 Value* value; 1438 Value* value;
1424 if (!prefs->GetWithoutPathExpansion(*i, &value)) 1439 if (!prefs->GetWithoutPathExpansion(*i, &value))
1425 continue; 1440 continue;
1426 extension_pref_value_map_->SetExtensionPref( 1441 extension_pref_value_map_->SetExtensionPref(
1427 *ext_id, *i, false, value->DeepCopy()); 1442 *ext_id, *i, extension_prefs_scope::kRegular, value->DeepCopy());
1443 }
1444
1445 // Set incognito extension controlled prefs.
1446 prefs = GetExtensionControlledPrefs(*ext_id, true);
1447 for (DictionaryValue::key_iterator i = prefs->begin_keys();
1448 i != prefs->end_keys(); ++i) {
1449 Value* value;
1450 if (!prefs->GetWithoutPathExpansion(*i, &value))
1451 continue;
1452 extension_pref_value_map_->SetExtensionPref(
1453 *ext_id, *i, extension_prefs_scope::kIncognitoPersistent,
1454 value->DeepCopy());
1428 } 1455 }
1429 1456
1430 const DictionaryValue* extension_prefs = GetExtensionPref(*ext_id); 1457 const DictionaryValue* extension_prefs = GetExtensionPref(*ext_id);
1431 DCHECK(extension_prefs); 1458 DCHECK(extension_prefs);
1432 ListValue* content_settings = NULL; 1459 ListValue* content_settings = NULL;
1433 if (extension_prefs->GetList(kPrefContentSettings, &content_settings)) { 1460 if (extension_prefs->GetList(kPrefContentSettings, &content_settings)) {
1434 content_settings_store_->SetExtensionContentSettingsFromList( 1461 content_settings_store_->SetExtensionContentSettingsFromList(
1435 *ext_id, content_settings); 1462 *ext_id, content_settings);
1436 } 1463 }
1437 } 1464 }
1438 1465
1439 extension_pref_value_map_->NotifyInitializationCompleted(); 1466 extension_pref_value_map_->NotifyInitializationCompleted();
1440 } 1467 }
1441 1468
1442 1469
1443 void ExtensionPrefs::SetExtensionControlledPref(const std::string& extension_id, 1470 void ExtensionPrefs::SetExtensionControlledPref(
1444 const std::string& pref_key, 1471 const std::string& extension_id,
1445 bool incognito, 1472 const std::string& pref_key,
1446 Value* value) { 1473 extension_prefs_scope::Scope scope,
1474 Value* value) {
1447 #ifndef NDEBUG 1475 #ifndef NDEBUG
1448 const PrefService::Preference* pref = 1476 const PrefService::Preference* pref =
1449 pref_service()->FindPreference(pref_key.c_str()); 1477 pref_service()->FindPreference(pref_key.c_str());
1450 DCHECK(pref) << "Extension controlled preference key " << pref_key 1478 DCHECK(pref) << "Extension controlled preference key " << pref_key
1451 << " not registered."; 1479 << " not registered.";
1452 DCHECK_EQ(pref->GetType(), value->GetType()) 1480 DCHECK_EQ(pref->GetType(), value->GetType())
1453 << "Extension controlled preference " << pref_key << " has wrong type."; 1481 << "Extension controlled preference " << pref_key << " has wrong type.";
1454 #endif 1482 #endif
1455 1483
1456 if (!incognito) { 1484 if (scope == extension_prefs_scope::kRegular) {
1457 // Also store in persisted Preferences file to recover after a 1485 // Also store in persisted Preferences file to recover after a
1458 // browser restart. 1486 // browser restart.
1459 ScopedExtensionControlledPrefUpdate update(prefs_, extension_id); 1487 ScopedExtensionControlledPrefUpdate update(prefs_, extension_id,
1488 kPrefPreferences);
1489 update->SetWithoutPathExpansion(pref_key, value->DeepCopy());
1490 } else if (scope == extension_prefs_scope::kIncognitoPersistent) {
1491 ScopedExtensionControlledPrefUpdate update(prefs_, extension_id,
1492 kPrefIncognitoPreferences);
1460 update->SetWithoutPathExpansion(pref_key, value->DeepCopy()); 1493 update->SetWithoutPathExpansion(pref_key, value->DeepCopy());
1461 } 1494 }
1462 1495
1463 extension_pref_value_map_->SetExtensionPref( 1496 extension_pref_value_map_->SetExtensionPref(
1464 extension_id, pref_key, incognito, value); 1497 extension_id, pref_key, scope, value);
1465 } 1498 }
1466 1499
1467 void ExtensionPrefs::RemoveExtensionControlledPref( 1500 void ExtensionPrefs::RemoveExtensionControlledPref(
1468 const std::string& extension_id, 1501 const std::string& extension_id,
1469 const std::string& pref_key, 1502 const std::string& pref_key,
1470 bool incognito) { 1503 extension_prefs_scope::Scope scope) {
1471 DCHECK(pref_service()->FindPreference(pref_key.c_str())) 1504 DCHECK(pref_service()->FindPreference(pref_key.c_str()))
1472 << "Extension controlled preference key " << pref_key 1505 << "Extension controlled preference key " << pref_key
1473 << " not registered."; 1506 << " not registered.";
1474 1507
1475 if (!incognito) { 1508 if (scope == extension_prefs_scope::kRegular) {
1476 // Also store in persisted Preferences file to recover after a 1509 // Also store in persisted Preferences file to recover after a
1477 // browser restart. 1510 // browser restart.
1478 ScopedExtensionControlledPrefUpdate update(prefs_, extension_id); 1511 ScopedExtensionControlledPrefUpdate update(prefs_, extension_id,
1512 kPrefPreferences);
1513 update->RemoveWithoutPathExpansion(pref_key, NULL);
1514 } else if (scope == extension_prefs_scope::kIncognitoPersistent) {
1515 ScopedExtensionControlledPrefUpdate update(prefs_, extension_id,
1516 kPrefIncognitoPreferences);
1479 update->RemoveWithoutPathExpansion(pref_key, NULL); 1517 update->RemoveWithoutPathExpansion(pref_key, NULL);
1480 } 1518 }
1481 1519
1482 extension_pref_value_map_->RemoveExtensionPref( 1520 extension_pref_value_map_->RemoveExtensionPref(
1483 extension_id, pref_key, incognito); 1521 extension_id, pref_key, scope);
1484 } 1522 }
1485 1523
1486 bool ExtensionPrefs::CanExtensionControlPref(const std::string& extension_id, 1524 bool ExtensionPrefs::CanExtensionControlPref(const std::string& extension_id,
1487 const std::string& pref_key, 1525 const std::string& pref_key,
1488 bool incognito) { 1526 bool incognito) {
1489 DCHECK(pref_service()->FindPreference(pref_key.c_str())) 1527 DCHECK(pref_service()->FindPreference(pref_key.c_str()))
1490 << "Extension controlled preference key " << pref_key 1528 << "Extension controlled preference key " << pref_key
1491 << " not registered."; 1529 << " not registered.";
1492 1530
1493 return extension_pref_value_map_->CanExtensionControlPref(extension_id, 1531 return extension_pref_value_map_->CanExtensionControlPref(extension_id,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1527 prefs->RegisterListPref(prefs::kExtensionInstallAllowList, 1565 prefs->RegisterListPref(prefs::kExtensionInstallAllowList,
1528 PrefService::UNSYNCABLE_PREF); 1566 PrefService::UNSYNCABLE_PREF);
1529 prefs->RegisterListPref(prefs::kExtensionInstallDenyList, 1567 prefs->RegisterListPref(prefs::kExtensionInstallDenyList,
1530 PrefService::UNSYNCABLE_PREF); 1568 PrefService::UNSYNCABLE_PREF);
1531 prefs->RegisterListPref(prefs::kExtensionInstallForceList, 1569 prefs->RegisterListPref(prefs::kExtensionInstallForceList,
1532 PrefService::UNSYNCABLE_PREF); 1570 PrefService::UNSYNCABLE_PREF);
1533 prefs->RegisterStringPref(kWebStoreLogin, 1571 prefs->RegisterStringPref(kWebStoreLogin,
1534 std::string() /* default_value */, 1572 std::string() /* default_value */,
1535 PrefService::UNSYNCABLE_PREF); 1573 PrefService::UNSYNCABLE_PREF);
1536 } 1574 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_prefs.h ('k') | chrome/browser/extensions/extension_prefs_scope.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698