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 bc44c0207813b8c465ddf306f65d08640da25647..7f5cb26d21ddf800203f69964e5f827a96194578 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); |
@@ -1670,10 +1675,16 @@ void TemplateURLService::ChangeToLoadedState() { |
provider_map_->Init(template_urls_, search_terms_data); |
loaded_ = true; |
- // This will cause a call to NotifyObservers(). |
- ApplyDefaultSearchChange(initial_default_search_provider_ ? |
- &initial_default_search_provider_->data() : NULL, |
- default_search_provider_source_); |
+ { |
+ base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
+ &dsp_change_origin_, DSP_CHANGE_INITIAL_LOAD); |
Peter Kasting
2014/05/21 19:38:41
Can't we just move the |loaded_| assignment statem
erikwright (departed)
2014/05/21 20:38:48
ApplyDefaultSearchChange behaves differently befor
Peter Kasting
2014/05/21 20:45:13
My primary concern is really that you're adding a
erikwright (departed)
2014/05/21 21:18:01
I agree with deprecating the old values (in a sepa
|
+ // This will cause a call to NotifyObservers(). |
+ ApplyDefaultSearchChange( |
+ initial_default_search_provider_ ? |
+ &initial_default_search_provider_->data() : NULL, |
+ default_search_provider_source_); |
+ } |
+ |
initial_default_search_provider_.reset(); |
on_loaded_callbacks_.Notify(); |
} |
@@ -1954,8 +1965,8 @@ void TemplateURLService::ApplyDefaultSearchChange( |
TemplateURL::MatchesData(default_search_provider_, data)) |
return; |
- UMA_HISTOGRAM_ENUMERATION("Search.DefaultSearchChangeOrigin", |
- dsp_change_origin_, DSP_CHANGE_MAX); |
+ // Use void* to prevent a potential UAF - this is only for pointer comparison. |
+ void* previous_default_search_engine = default_search_provider_; |
Peter Kasting
2014/05/21 19:38:41
If you're only doing a pointer comparison, you sho
erikwright (departed)
2014/05/21 20:38:48
This pointer could be invalidated in a variety of
Peter Kasting
2014/05/21 20:45:13
Right, I understand that.
|
WebDataService::KeywordBatchModeScoper keyword_scoper(service_.get()); |
if (default_search_provider_source_ == DefaultSearchManager::FROM_POLICY || |
@@ -1969,17 +1980,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_) { |
@@ -2005,8 +2009,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_ = |
@@ -2047,7 +2050,14 @@ void TemplateURLService::ApplyDefaultSearchChange( |
#endif |
} |
- NotifyObservers(); |
+ if (default_search_provider_ != previous_default_search_engine) { |
+ if (dsp_change_origin_ != DSP_CHANGE_INITIAL_LOAD) { |
+ UMA_HISTOGRAM_ENUMERATION("Search.DefaultSearchChangeOrigin", |
+ dsp_change_origin_, |
+ DSP_CHANGE_MAX); |
+ } |
+ NotifyObservers(); |
+ } |
} |
bool TemplateURLService::AddNoNotify(TemplateURL* template_url, |