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 b9b7799499050374caff5d9e3ed4105e0c8675e4..320db377df1c6727af94376878550b5a56da8ad8 100644 |
--- a/chrome/browser/search_engines/template_url_service.cc |
+++ b/chrome/browser/search_engines/template_url_service.cc |
@@ -875,6 +875,11 @@ void TemplateURLService::RepairPrepopulatedSearchEngines() { |
default_search_manager_.ClearUserSelectedDefaultSearchEngine(); |
if (!default_search_provider_) { |
+ // If the default search provider came from a user pref we would have been |
+ // notified of the new (fallback-provided) value in |
+ // ClearUserSelectedDefaultSearchEngine() above. Since we are here, the |
+ // value was presumably originally a fallback value (which may have been |
+ // repaired). |
DefaultSearchManager::Source source; |
const TemplateURLData* new_dse = |
default_search_manager_.GetDefaultSearchEngine(&source); |
@@ -1677,9 +1682,10 @@ void TemplateURLService::ChangeToLoadedState() { |
loaded_ = true; |
// This will cause a call to NotifyObservers(). |
- ApplyDefaultSearchChange(initial_default_search_provider_ ? |
- &initial_default_search_provider_->data() : NULL, |
- default_search_provider_source_); |
+ ApplyDefaultSearchChangeNoMetrics( |
+ initial_default_search_provider_ ? |
+ &initial_default_search_provider_->data() : NULL, |
+ default_search_provider_source_); |
initial_default_search_provider_.reset(); |
on_loaded_callbacks_.Notify(); |
} |
@@ -1941,15 +1947,35 @@ void TemplateURLService::OnDefaultSearchChange( |
void TemplateURLService::ApplyDefaultSearchChange( |
const TemplateURLData* data, |
DefaultSearchManager::Source source) { |
+ if (!ApplyDefaultSearchChangeNoMetrics(data, source)) |
+ return; |
+ |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "Search.DefaultSearchChangeOrigin", dsp_change_origin_, DSP_CHANGE_MAX); |
+ |
+ if (GetDefaultSearchProvider() && |
+ GetDefaultSearchProvider()->HasGoogleBaseURLs()) { |
+#if defined(ENABLE_RLZ) |
+ RLZTracker::RecordProductEvent( |
+ rlz_lib::CHROME, RLZTracker::ChromeOmnibox(), rlz_lib::SET_TO_GOOGLE); |
+#endif |
+ } |
+} |
+ |
+bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
+ const TemplateURLData* data, |
+ DefaultSearchManager::Source source) { |
if (!loaded_) { |
// Set |initial_default_search_provider_| from the preferences. This is |
// mainly so we can hold ownership until we get to the point where the list |
// of keywords from Web Data is the owner of everything including the |
// default. |
+ bool changed = |
+ TemplateURL::MatchesData(initial_default_search_provider_.get(), data); |
initial_default_search_provider_.reset( |
data ? new TemplateURL(profile_, *data) : NULL); |
default_search_provider_source_ = source; |
- return; |
+ return changed; |
} |
// Prevent recursion if we update the value stored in default_search_manager_. |
@@ -1958,10 +1984,11 @@ void TemplateURLService::ApplyDefaultSearchChange( |
// NULL due to policy. We'll never actually get recursion with data == NULL. |
if (source == default_search_provider_source_ && data != NULL && |
TemplateURL::MatchesData(default_search_provider_, data)) |
- return; |
+ return false; |
- UMA_HISTOGRAM_ENUMERATION("Search.DefaultSearchChangeOrigin", |
- dsp_change_origin_, DSP_CHANGE_MAX); |
+ // This may be deleted later. Use exclusively for pointer comparison to detect |
+ // a change. |
+ TemplateURL* previous_default_search_engine = default_search_provider_; |
WebDataService::KeywordBatchModeScoper keyword_scoper(service_.get()); |
if (default_search_provider_source_ == DefaultSearchManager::FROM_POLICY || |
@@ -1975,17 +2002,10 @@ void TemplateURLService::ApplyDefaultSearchChange( |
if (!data) { |
default_search_provider_ = NULL; |
- default_search_provider_source_ = source; |
- NotifyObservers(); |
- return; |
- } |
- |
- if (source == DefaultSearchManager::FROM_EXTENSION) { |
+ } else if (source == DefaultSearchManager::FROM_EXTENSION) { |
default_search_provider_ = FindMatchingExtensionTemplateURL( |
*data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
- } |
- |
- if (source == DefaultSearchManager::FROM_FALLBACK) { |
+ } else if (source == DefaultSearchManager::FROM_FALLBACK) { |
default_search_provider_ = |
FindPrepopulatedTemplateURL(data->prepopulate_id); |
if (default_search_provider_) { |
@@ -2011,8 +2031,7 @@ void TemplateURLService::ApplyDefaultSearchChange( |
if (AddNoNotify(new_dse, true)) |
default_search_provider_ = new_dse; |
} |
- } |
- if (source == DefaultSearchManager::FROM_USER) { |
+ } else if (source == DefaultSearchManager::FROM_USER) { |
default_search_provider_ = GetTemplateURLForGUID(data->sync_guid); |
if (!default_search_provider_ && data->prepopulate_id) { |
default_search_provider_ = |
@@ -2042,18 +2061,15 @@ void TemplateURLService::ApplyDefaultSearchChange( |
default_search_provider_source_ = source; |
- if (default_search_provider_ && |
- default_search_provider_->HasGoogleBaseURLs()) { |
- if (profile_) |
- GoogleURLTracker::RequestServerCheck(profile_, false); |
-#if defined(ENABLE_RLZ) |
- RLZTracker::RecordProductEvent(rlz_lib::CHROME, |
- RLZTracker::ChromeOmnibox(), |
- rlz_lib::SET_TO_GOOGLE); |
-#endif |
- } |
+ bool changed = default_search_provider_ != previous_default_search_engine; |
+ |
+ if (profile_ && changed && default_search_provider_ && |
+ default_search_provider_->HasGoogleBaseURLs()) |
+ GoogleURLTracker::RequestServerCheck(profile_, false); |
NotifyObservers(); |
+ |
+ return changed; |
} |
bool TemplateURLService::AddNoNotify(TemplateURL* template_url, |