summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_dom_ui.cc
diff options
context:
space:
mode:
authoraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-14 22:06:50 +0000
committeraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-14 22:06:50 +0000
commitc5b8ab44beaad44a5da2c4f74a38b786905bee62 (patch)
tree848a646753933608a5519031e2d1e17e968e85e3 /chrome/browser/extensions/extension_dom_ui.cc
parentf03d68f40e35ec351618a6ba722a74463ac77067 (diff)
downloadchromium_src-c5b8ab44beaad44a5da2c4f74a38b786905bee62.zip
chromium_src-c5b8ab44beaad44a5da2c4f74a38b786905bee62.tar.gz
chromium_src-c5b8ab44beaad44a5da2c4f74a38b786905bee62.tar.bz2
Fix bug that caused us to have many duplicate registrations
recorded in extension prefs for override pages. BUG=41442 Review URL: http://codereview.chromium.org/1518028 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44551 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_dom_ui.cc')
-rw-r--r--chrome/browser/extensions/extension_dom_ui.cc30
1 files changed, 27 insertions, 3 deletions
diff --git a/chrome/browser/extensions/extension_dom_ui.cc b/chrome/browser/extensions/extension_dom_ui.cc
index 40f11f1..5314078 100644
--- a/chrome/browser/extensions/extension_dom_ui.cc
+++ b/chrome/browser/extensions/extension_dom_ui.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/extensions/extension_dom_ui.h"
+#include <set>
+
#include "base/file_path.h"
#include "base/file_util.h"
#include "net/base/file_stream.h"
@@ -23,8 +25,6 @@
#include "chrome/common/url_constants.h"
namespace {
-const wchar_t kExtensionURLOverrides[] = L"extensions.chrome_url_overrides";
-
// Returns a piece of memory with the contents of the file |path|.
RefCountedMemory* ReadFileData(const FilePath& path) {
// TODO(arv): We currently read this on the UI thread since extension objects
@@ -45,8 +45,30 @@ RefCountedMemory* ReadFileData(const FilePath& path) {
return result;
}
+// De-dupes the items in |list|. Assumes the values are strings.
+void CleanUpDuplicates(ListValue* list) {
+ std::set<std::string> seen_values;
+
+ // Loop backwards as we may be removing items.
+ for (size_t i = list->GetSize() - 1; (i + 1) > 0; --i) {
+ std::string value;
+ if (!list->GetString(i, &value)) {
+ NOTREACHED();
+ continue;
+ }
+
+ if (seen_values.find(value) == seen_values.end())
+ seen_values.insert(value);
+ else
+ list->Remove(i, NULL);
+ }
+}
+
} // namespace
+const wchar_t ExtensionDOMUI::kExtensionURLOverrides[] =
+ L"extensions.chrome_url_overrides";
+
ExtensionDOMUI::ExtensionDOMUI(TabContents* tab_contents)
: DOMUI(tab_contents) {
should_hide_url_ = true;
@@ -222,6 +244,8 @@ void ExtensionDOMUI::RegisterChromeURLOverrides(
page_overrides = new ListValue();
all_overrides->Set(key, page_overrides);
} else {
+ CleanUpDuplicates(page_overrides);
+
// Verify that the override isn't already in the list.
ListValue::iterator i = page_overrides->begin();
for (; i != page_overrides->end(); ++i) {
@@ -230,7 +254,7 @@ void ExtensionDOMUI::RegisterChromeURLOverrides(
NOTREACHED();
continue;
}
- if (override_val == (*iter).first)
+ if (override_val == (*iter).second.spec())
break;
}
// This value is already in the list, leave it alone.