diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-14 22:06:50 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-14 22:06:50 +0000 |
commit | c5b8ab44beaad44a5da2c4f74a38b786905bee62 (patch) | |
tree | 848a646753933608a5519031e2d1e17e968e85e3 /chrome/browser/extensions/extension_dom_ui.cc | |
parent | f03d68f40e35ec351618a6ba722a74463ac77067 (diff) | |
download | chromium_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.cc | 30 |
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. |