Chromium Code Reviews| 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, |