diff options
Diffstat (limited to 'chrome/browser/search_engines/template_url_service.cc')
-rw-r--r-- | chrome/browser/search_engines/template_url_service.cc | 261 |
1 files changed, 165 insertions, 96 deletions
diff --git a/chrome/browser/search_engines/template_url_service.cc b/chrome/browser/search_engines/template_url_service.cc index 8c78bd3..7588369 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); + } + } +} |