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

Unified Diff: chrome/browser/search_engines/template_url_model.cc

Issue 7051003: Fix duplicate insertions of default search providers into the Web Data database. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/search_engines/template_url_model.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/search_engines/template_url_model.cc
diff --git a/chrome/browser/search_engines/template_url_model.cc b/chrome/browser/search_engines/template_url_model.cc
index e251da6c86af9be668dd75d4c0ae1e78b82a85be..6d11fe875369d7c4fd81c11a60def5e857088419 100644
--- a/chrome/browser/search_engines/template_url_model.cc
+++ b/chrome/browser/search_engines/template_url_model.cc
@@ -39,41 +39,39 @@
using base::Time;
typedef SearchHostToURLsMap::TemplateURLSet TemplateURLSet;
+namespace {
+
// String in the URL that is replaced by the search term.
-static const char kSearchTermParameter[] = "{searchTerms}";
+const char kSearchTermParameter[] = "{searchTerms}";
// String in Initializer that is replaced with kSearchTermParameter.
-static const char kTemplateParameter[] = "%s";
+const char kTemplateParameter[] = "%s";
// Term used when generating a search url. Use something obscure so that on
// the rare case the term replaces the URL it's unlikely another keyword would
// have the same url.
-static const char kReplacementTerm[] = "blah.blah.blah.blah.blah";
-
+const char kReplacementTerm[] = "blah.blah.blah.blah.blah";
-// Removes from the vector any template URL that was created because of
-// policy. These TemplateURLs are freed.
-// Sets default_search_provider to NULL if it was one of them.
-static void RemoveProvidersCreatedByPolicy(
- std::vector<TemplateURL*>* template_urls,
- const TemplateURL** default_search_provider) {
- DCHECK(template_urls);
- DCHECK(default_search_provider);
- for (std::vector<TemplateURL*>::iterator i = template_urls->begin();
- i != template_urls->end(); ) {
- TemplateURL* template_url = *i;
- if (template_url->created_by_policy()) {
- if (*default_search_provider &&
- (*default_search_provider)->id() == template_url->id())
- *default_search_provider = NULL;
- i = template_urls->erase(i);
- delete template_url;
- } else {
- ++i;
- }
- }
+bool TemplateURLsHaveSamePrefs(const TemplateURL* url1,
+ const TemplateURL* url2) {
+ if (url1 == url2)
+ return true;
+ return NULL != url1 &&
+ NULL != url2 &&
+ url1->short_name() == url2->short_name() &&
+ url1->keyword() == url2->keyword() &&
+ TemplateURLRef::SameUrlRefs(url1->url(), url2->url()) &&
+ TemplateURLRef::SameUrlRefs(url1->suggestions_url(),
+ url2->suggestions_url()) &&
+ url1->GetFaviconURL() == url2->GetFaviconURL() &&
+ url1->safe_for_autoreplace() == url2->safe_for_autoreplace() &&
+ url1->show_in_default_list() == url2->show_in_default_list() &&
+ url1->input_encodings() == url2->input_encodings();
}
+} // namespace
+
+
class TemplateURLModel::LessWithPrefix {
public:
// We want to find the set of keywords that begin with a prefix. The STL
@@ -485,28 +483,39 @@ void TemplateURLModel::OnWebDataServiceRequestDone(
bool database_specified_a_default = NULL != default_search_provider;
- // Remove entries that were created because of policy as they may have
- // changed since the database was saved.
- RemoveProvidersCreatedByPolicy(&template_urls, &default_search_provider);
-
// Check if default search provider is now managed.
scoped_ptr<TemplateURL> default_from_prefs;
LoadDefaultSearchProviderFromPrefs(&default_from_prefs,
&is_default_search_managed_);
+ // Remove entries that were created because of policy as they may have
+ // changed since the database was saved.
+ RemoveProvidersCreatedByPolicy(&template_urls,
+ &default_search_provider,
+ default_from_prefs.get());
+
if (is_default_search_managed_) {
SetTemplateURLs(template_urls);
- // Set the default. AddNoNotify will take ownership of default_from_prefs
- // so it is safe to release. If it's null, there's no ownership to worry
- // about :-)
- TemplateURL* managed_default = default_from_prefs.release();
- if (managed_default) {
- managed_default->set_created_by_policy(true);
- managed_default->set_id(0);
- AddNoNotify(managed_default);
+
+ if (TemplateURLsHaveSamePrefs(default_search_provider,
+ default_from_prefs.get())) {
+ // The value from the preferences was previously stored in the database.
+ // Reuse it.
+ } else {
+ // The value from the preferences takes over.
+ //
+ // AddNoNotify will take ownership of default_from_prefs so it is safe to
+ // release. If it's null, there's no ownership to worry about :-)
+ TemplateURL* managed_default = default_from_prefs.release();
+ if (managed_default) {
+ managed_default->set_created_by_policy(true);
+ managed_default->set_id(0);
+ AddNoNotify(managed_default);
+ default_search_provider = managed_default;
+ }
}
// Note that this saves the default search provider to prefs.
- SetDefaultSearchProviderNoNotify(managed_default);
+ SetDefaultSearchProviderNoNotify(default_search_provider);
} else {
// If we had a managed default, replace it with the first provider of
// the list.
@@ -881,24 +890,6 @@ bool TemplateURLModel::LoadDefaultSearchProviderFromPrefs(
return true;
}
-static bool TemplateURLsHaveSamePrefs(const TemplateURL* url1,
- const TemplateURL* url2) {
- if (url1 == url2)
- return true;
- return NULL != url1 &&
- NULL != url2 &&
- url1->short_name() == url2->short_name() &&
- url1->keyword() == url2->keyword() &&
- TemplateURLRef::SameUrlRefs(url1->url(), url2->url()) &&
- TemplateURLRef::SameUrlRefs(url1->suggestions_url(),
- url2->suggestions_url()) &&
- url1->GetFaviconURL() == url2->GetFaviconURL() &&
- url1->safe_for_autoreplace() == url2->safe_for_autoreplace() &&
- url1->show_in_default_list() == url2->show_in_default_list() &&
- url1->input_encodings() == url2->input_encodings();
-}
-
-
bool TemplateURLModel::CanReplaceKeywordForHost(
const std::string& host,
const TemplateURL** to_replace) {
@@ -1282,3 +1273,50 @@ void TemplateURLModel::NotifyObservers() {
FOR_EACH_OBSERVER(TemplateURLModelObserver, model_observers_,
OnTemplateURLModelChanged());
}
+
+// |template_urls| are the TemplateURLs loaded from the database.
+// |default_search_provider| points to one of them, if it was set in the db.
+// |default_from_prefs| is the default search provider from the preferences.
+// Check |is_default_search_managed_| to determine if it was set by policy.
+//
+// This function removes from the vector and the database all the TemplateURLs
+// that were set by policy, unless it is the current default search provider
+// and matches what is set by a managed preference.
+void TemplateURLModel::RemoveProvidersCreatedByPolicy(
+ std::vector<TemplateURL*>* template_urls,
+ const TemplateURL** default_search_provider,
+ const TemplateURL* default_from_prefs) {
+ DCHECK(template_urls);
+ DCHECK(default_search_provider);
+ for (std::vector<TemplateURL*>::iterator i = template_urls->begin();
+ i != template_urls->end(); ) {
+ TemplateURL* template_url = *i;
+ if (template_url->created_by_policy()) {
+ if (template_url == *default_search_provider &&
+ is_default_search_managed_ &&
+ TemplateURLsHaveSamePrefs(template_url,
+ default_from_prefs)) {
+ // If the database specified a default search provider that was set
+ // by policy, and the default search provider from the preferences
+ // is also set by policy and they are the same, keep the entry in the
+ // database and the |default_search_provider|.
+ ++i;
+ continue;
+ }
+
+ // The database loaded a managed |default_search_provider|, but it has
+ // been updated in the prefs. Remove it from the database, and update the
+ // |default_search_provider| pointer here.
+ if (*default_search_provider &&
+ (*default_search_provider)->id() == template_url->id())
+ *default_search_provider = NULL;
+
+ i = template_urls->erase(i);
+ if (service_.get())
+ service_->RemoveKeyword(*template_url);
+ delete template_url;
+ } else {
+ ++i;
+ }
+ }
+}
« no previous file with comments | « chrome/browser/search_engines/template_url_model.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698