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

Unified Diff: chrome/browser/extensions/extension_prefs.cc

Issue 6677147: Handle changes in extension ID generation logic better. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review feedback. Created 9 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/extensions/extension_prefs_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/extension_prefs.cc
diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc
index c727e37913865ac10370f4a61008e69af6f36f54..38d001544c4a485c7117c2bd8a2d033bd250556c 100644
--- a/chrome/browser/extensions/extension_prefs.cc
+++ b/chrome/browser/extensions/extension_prefs.cc
@@ -119,29 +119,66 @@ const char kPrefPreferences[] = "preferences";
namespace {
-// TODO(asargent) - This is cleanup code for a key that was introduced into
-// the extensions.settings sub-dictionary which wasn't a valid extension
-// 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) {
+// TODO(mihaip): This is cleanup code for keys for unpacked extensions (which
+// are derived from paths). As part of the wstring removal, we changed the way
+// we hash paths, so we need to move prefs from their old synthesized IDs to
+// their new ones. We can remove this by July 2011. (See http://crbug.com/75945
+// for more details).
+static void CleanupBadExtensionKeys(const FilePath& root_dir,
+ PrefService* prefs) {
DictionaryValue* dictionary =
prefs->GetMutableDictionary(ExtensionPrefs::kExtensionsPref);
- std::set<std::string> bad_keys;
+ std::map<std::string, std::string> remapped_keys;
for (DictionaryValue::key_iterator i = dictionary->begin_keys();
i != dictionary->end_keys(); ++i) {
- const std::string& key_name(*i);
- if (!Extension::IdIsValid(key_name)) {
- bad_keys.insert(key_name);
+ DictionaryValue* ext;
+ if (!dictionary->GetDictionaryWithoutPathExpansion(*i, &ext))
+ continue;
+
+ int location;
+ FilePath::StringType path_str;
+ if (!ext->GetInteger(kPrefLocation, &location) ||
+ !ext->GetString(kPrefPath, &path_str)) {
+ continue;
+ }
+
+ // Only unpacked extensions have generated IDs.
+ if (location != Extension::LOAD)
+ continue;
+
+ const std::string& prefs_id(*i);
+ FilePath path(path_str);
+ // The persisted path can be relative to the root dir (see
+ // MakePath(s)Relative), but the ID is generated before that, using the
+ // absolute path, so we need to undo that.
+ if (!path.IsAbsolute()) {
+ path = root_dir.Append(path);
+ }
+ std::string computed_id = Extension::GenerateIdForPath(path);
+
+ if (prefs_id != computed_id) {
+ remapped_keys[prefs_id] = computed_id;
}
}
- bool dirty = false;
- for (std::set<std::string>::iterator i = bad_keys.begin();
- i != bad_keys.end(); ++i) {
- dirty = true;
- dictionary->Remove(*i, NULL);
- }
- if (dirty)
+
+ if (!remapped_keys.empty()) {
+ for (std::map<std::string, std::string>::const_iterator i =
+ remapped_keys.begin();
+ i != remapped_keys.end();
+ ++i) {
+ // Don't clobber prefs under the correct ID if they already exist.
+ if (dictionary->HasKey(i->second)) {
+ CHECK(dictionary->RemoveWithoutPathExpansion(i->first, NULL));
+ continue;
+ }
+ Value* extension_prefs = NULL;
+ CHECK(dictionary->RemoveWithoutPathExpansion(
+ i->first, &extension_prefs));
+ dictionary->SetWithoutPathExpansion(i->second, extension_prefs);
+ }
+
prefs->ScheduleSavePersistentPrefs();
+ }
}
static void ExtentToStringSet(const ExtensionExtent& host_extent,
@@ -162,9 +199,8 @@ ExtensionPrefs::ExtensionPrefs(
: prefs_(prefs),
install_directory_(root_dir),
extension_pref_value_map_(extension_pref_value_map) {
- // TODO(asargent) - Remove this in a couple of months. (See comment above
- // CleanupBadExtensionKeys).
- CleanupBadExtensionKeys(prefs_);
+ // TODO(mihaip): Remove this by July 2011 (see comment above).
+ CleanupBadExtensionKeys(root_dir, prefs_);
MakePathsRelative();
« no previous file with comments | « no previous file | chrome/browser/extensions/extension_prefs_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698