| Index: chrome/browser/search_engines/template_url_service.cc
|
| diff --git a/chrome/browser/search_engines/template_url_service.cc b/chrome/browser/search_engines/template_url_service.cc
|
| index 8c78bd35cec08e1f8ca0ab5783925db194f6ebbd..7588369d0d5adf4e55c48abfeec904ce243bef70 100644
|
| --- a/chrome/browser/search_engines/template_url_service.cc
|
| +++ b/chrome/browser/search_engines/template_url_service.cc
|
| @@ -671,6 +671,53 @@ TemplateURL* TemplateURLService::FindNewDefaultSearchProvider() {
|
| return FirstPotentialDefaultEngine(template_urls_);
|
| }
|
|
|
| +void TemplateURLService::ResetNonExtensionURLs() {
|
| + // Can't clean DB if it hasn't been loaded.
|
| + DCHECK(loaded());
|
| + ClearDefaultProviderFromPrefs();
|
| +
|
| + TemplateURLVector entries_to_process;
|
| + for (TemplateURLVector::const_iterator i = template_urls_.begin();
|
| + i != template_urls_.end(); ++i) {
|
| + if (!(*i)->IsExtensionKeyword())
|
| + entries_to_process.push_back(*i);
|
| + }
|
| + // Clear default provider to be able to delete it.
|
| + default_search_provider_ = NULL;
|
| + // Remove non-extension keywords.
|
| + for (TemplateURLVector::const_iterator i = entries_to_process.begin();
|
| + i != entries_to_process.end(); ++i)
|
| + RemoveNoNotify(*i);
|
| +
|
| + // Store the remaining engines in entries_to_process and merge them with
|
| + // prepopulated ones.
|
| + entries_to_process.clear();
|
| + entries_to_process.swap(template_urls_);
|
| + provider_map_.reset(new SearchHostToURLsMap);
|
| + UIThreadSearchTermsData search_terms_data(profile_);
|
| + provider_map_->Init(TemplateURLVector(), search_terms_data);
|
| +
|
| + TemplateURL* default_search_provider = NULL;
|
| + // Force GetSearchProvidersUsingLoadedEngines() to include the prepopulated
|
| + // engines in the list by claiming we are currently on version 0, ensuring
|
| + // that the prepopulate data version will be newer.
|
| + int new_resource_keyword_version = 0;
|
| + GetSearchProvidersUsingLoadedEngines(service_.get(), profile_,
|
| + &entries_to_process,
|
| + &default_search_provider,
|
| + &new_resource_keyword_version,
|
| + &pre_sync_deletes_);
|
| + // Setup search engines and a default one.
|
| + AddTemplateURLsAndSetupDefaultEngine(&entries_to_process,
|
| + default_search_provider);
|
| +
|
| + if (new_resource_keyword_version)
|
| + service_->SetBuiltinKeywordVersion(new_resource_keyword_version);
|
| +
|
| + EnsureDefaultSearchProviderExists();
|
| + NotifyObservers();
|
| +}
|
| +
|
| void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) {
|
| model_observers_.AddObserver(observer);
|
| }
|
| @@ -714,7 +761,6 @@ void TemplateURLService::OnWebDataServiceRequestDone(
|
| // initial_default_search_provider_ is only needed before we've finished
|
| // loading. Now that we've loaded we can nuke it.
|
| initial_default_search_provider_.reset();
|
| - is_default_search_managed_ = false;
|
|
|
| TemplateURLVector template_urls;
|
| TemplateURL* default_search_provider = NULL;
|
| @@ -723,81 +769,7 @@ void TemplateURLService::OnWebDataServiceRequestDone(
|
| &template_urls, &default_search_provider, &new_resource_keyword_version,
|
| &pre_sync_deletes_);
|
|
|
| - bool database_specified_a_default = (default_search_provider != NULL);
|
| -
|
| - // 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());
|
| -
|
| - PatchMissingSyncGUIDs(&template_urls);
|
| -
|
| - if (is_default_search_managed_) {
|
| - SetTemplateURLs(template_urls);
|
| -
|
| - 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.
|
| - default_search_provider = NULL;
|
| - if (default_from_prefs.get()) {
|
| - TemplateURLData data(default_from_prefs->data());
|
| - data.created_by_policy = true;
|
| - data.id = kInvalidTemplateURLID;
|
| - default_search_provider = new TemplateURL(profile_, data);
|
| - if (!AddNoNotify(default_search_provider, true))
|
| - default_search_provider = NULL;
|
| - }
|
| - }
|
| - // Note that this saves the default search provider to prefs.
|
| - if (!default_search_provider ||
|
| - (!default_search_provider->IsExtensionKeyword() &&
|
| - default_search_provider->SupportsReplacement())) {
|
| - bool success = SetDefaultSearchProviderNoNotify(default_search_provider);
|
| - DCHECK(success);
|
| - }
|
| - } else {
|
| - // If we had a managed default, replace it with the synced default if
|
| - // applicable, or the first provider of the list.
|
| - TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider();
|
| - if (synced_default) {
|
| - default_search_provider = synced_default;
|
| - pending_synced_default_search_ = false;
|
| - } else if (database_specified_a_default &&
|
| - default_search_provider == NULL) {
|
| - UMA_HISTOGRAM_ENUMERATION(kFirstPotentialEngineHistogramName,
|
| - FIRST_POTENTIAL_CALLSITE_ON_LOAD, FIRST_POTENTIAL_CALLSITE_MAX);
|
| - default_search_provider = FirstPotentialDefaultEngine(template_urls);
|
| - }
|
| -
|
| - // If the default search provider existed previously, then just
|
| - // set the member variable. Otherwise, we'll set it using the method
|
| - // to ensure that it is saved properly after its id is set.
|
| - if (default_search_provider &&
|
| - (default_search_provider->id() != kInvalidTemplateURLID)) {
|
| - default_search_provider_ = default_search_provider;
|
| - default_search_provider = NULL;
|
| - }
|
| - SetTemplateURLs(template_urls);
|
| -
|
| - if (default_search_provider) {
|
| - // Note that this saves the default search provider to prefs.
|
| - SetDefaultSearchProvider(default_search_provider);
|
| - } else {
|
| - // Always save the default search provider to prefs. That way we don't
|
| - // have to worry about it being out of sync.
|
| - if (default_search_provider_)
|
| - SaveDefaultSearchProviderToPrefs(default_search_provider_);
|
| - }
|
| - }
|
| + AddTemplateURLsAndSetupDefaultEngine(&template_urls, default_search_provider);
|
|
|
| // This initializes provider_map_ which should be done before
|
| // calling UpdateKeywordSearchTermsForURL.
|
| @@ -811,26 +783,7 @@ void TemplateURLService::OnWebDataServiceRequestDone(
|
| if (new_resource_keyword_version)
|
| service_->SetBuiltinKeywordVersion(new_resource_keyword_version);
|
|
|
| - if (!is_default_search_managed_) {
|
| - bool has_default_search_provider = default_search_provider_ != NULL &&
|
| - default_search_provider_->SupportsReplacement();
|
| - UMA_HISTOGRAM_BOOLEAN(kHasDSPHistogramName,
|
| - has_default_search_provider);
|
| - // Ensure that default search provider exists. See http://crbug.com/116952.
|
| - if (!has_default_search_provider) {
|
| - bool success =
|
| - SetDefaultSearchProviderNoNotify(FindNewDefaultSearchProvider());
|
| - DCHECK(success);
|
| - }
|
| - // Don't log anything if the user has a NULL default search provider. A
|
| - // logged value of 0 indicates a custom default search provider.
|
| - if (default_search_provider_) {
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - kDSPHistogramName,
|
| - default_search_provider_->prepopulate_id(),
|
| - TemplateURLPrepopulateData::kMaxPrepopulatedEngineID);
|
| - }
|
| - }
|
| + EnsureDefaultSearchProviderExists();
|
|
|
| NotifyObservers();
|
| NotifyLoaded();
|
| @@ -1721,6 +1674,16 @@ bool TemplateURLService::LoadDefaultSearchProviderFromPrefs(
|
| return true;
|
| }
|
|
|
| +void TemplateURLService::ClearDefaultProviderFromPrefs() {
|
| + // We overwrite user preferences. If the default search engine is managed,
|
| + // there is no effect.
|
| + SaveDefaultSearchProviderToPrefs(NULL);
|
| + // Default value for kDefaultSearchProviderEnabled is true.
|
| + PrefService* prefs = GetPrefs();
|
| + if (prefs)
|
| + prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, true);
|
| +}
|
| +
|
| bool TemplateURLService::CanReplaceKeywordForHost(
|
| const std::string& host,
|
| TemplateURL** to_replace) {
|
| @@ -2497,3 +2460,109 @@ void TemplateURLService::PatchMissingSyncGUIDs(
|
| }
|
| }
|
| }
|
| +
|
| +void TemplateURLService::AddTemplateURLsAndSetupDefaultEngine(
|
| + TemplateURLVector* template_urls,
|
| + TemplateURL* default_search_provider) {
|
| + DCHECK(template_urls);
|
| + is_default_search_managed_ = false;
|
| + bool database_specified_a_default = (default_search_provider != NULL);
|
| +
|
| + // 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());
|
| +
|
| + PatchMissingSyncGUIDs(template_urls);
|
| +
|
| + if (is_default_search_managed_) {
|
| + SetTemplateURLs(*template_urls);
|
| +
|
| + 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.
|
| + default_search_provider = NULL;
|
| + if (default_from_prefs.get()) {
|
| + TemplateURLData data(default_from_prefs->data());
|
| + data.created_by_policy = true;
|
| + data.id = kInvalidTemplateURLID;
|
| + default_search_provider = new TemplateURL(profile_, data);
|
| + if (!AddNoNotify(default_search_provider, true))
|
| + default_search_provider = NULL;
|
| + }
|
| + }
|
| + // Note that this saves the default search provider to prefs.
|
| + if (!default_search_provider ||
|
| + (!default_search_provider->IsExtensionKeyword() &&
|
| + default_search_provider->SupportsReplacement())) {
|
| + bool success = SetDefaultSearchProviderNoNotify(default_search_provider);
|
| + DCHECK(success);
|
| + }
|
| + } else {
|
| + // If we had a managed default, replace it with the synced default if
|
| + // applicable, or the first provider of the list.
|
| + TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider();
|
| + if (synced_default) {
|
| + default_search_provider = synced_default;
|
| + pending_synced_default_search_ = false;
|
| + } else if (database_specified_a_default &&
|
| + default_search_provider == NULL) {
|
| + UMA_HISTOGRAM_ENUMERATION(kFirstPotentialEngineHistogramName,
|
| + FIRST_POTENTIAL_CALLSITE_ON_LOAD,
|
| + FIRST_POTENTIAL_CALLSITE_MAX);
|
| + default_search_provider = FirstPotentialDefaultEngine(*template_urls);
|
| + }
|
| +
|
| + // If the default search provider existed previously, then just
|
| + // set the member variable. Otherwise, we'll set it using the method
|
| + // to ensure that it is saved properly after its id is set.
|
| + if (default_search_provider &&
|
| + (default_search_provider->id() != kInvalidTemplateURLID)) {
|
| + default_search_provider_ = default_search_provider;
|
| + default_search_provider = NULL;
|
| + }
|
| + SetTemplateURLs(*template_urls);
|
| +
|
| + if (default_search_provider) {
|
| + // Note that this saves the default search provider to prefs.
|
| + SetDefaultSearchProvider(default_search_provider);
|
| + } else {
|
| + // Always save the default search provider to prefs. That way we don't
|
| + // have to worry about it being out of sync.
|
| + if (default_search_provider_)
|
| + SaveDefaultSearchProviderToPrefs(default_search_provider_);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void TemplateURLService::EnsureDefaultSearchProviderExists() {
|
| + if (!is_default_search_managed_) {
|
| + bool has_default_search_provider = default_search_provider_ &&
|
| + default_search_provider_->SupportsReplacement();
|
| + UMA_HISTOGRAM_BOOLEAN(kHasDSPHistogramName,
|
| + has_default_search_provider);
|
| + // Ensure that default search provider exists. See http://crbug.com/116952.
|
| + if (!has_default_search_provider) {
|
| + bool success =
|
| + SetDefaultSearchProviderNoNotify(FindNewDefaultSearchProvider());
|
| + DCHECK(success);
|
| + }
|
| + // Don't log anything if the user has a NULL default search provider. A
|
| + // logged value of 0 indicates a custom default search provider.
|
| + if (default_search_provider_) {
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + kDSPHistogramName,
|
| + default_search_provider_->prepopulate_id(),
|
| + TemplateURLPrepopulateData::kMaxPrepopulatedEngineID);
|
| + }
|
| + }
|
| +}
|
|
|