| 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;
|
| + }
|
| + }
|
| +}
|
|
|