15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/default_search_manager.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <algorithm> 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <utility> 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/bind.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/bind_helpers.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/compiler_specific.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/i18n/case_conversion.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/logging.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/prefs/pref_service.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/prefs/pref_value_map.h" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/stl_util.h" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/string_number_conversions.h" 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/string_split.h" 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/string_util.h" 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/utf_string_conversions.h" 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/time/time.h" 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_engines_pref_names.h" 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/search_engines/template_url_data.h" 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_prepopulate_data.h" 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool g_fallback_search_engines_disabled = false; 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// A dictionary to hold all data related to the Default Search Engine. 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Eventually, this should replace all the data stored in the 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// default_search_provider.* prefs. 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char DefaultSearchManager::kDefaultSearchProviderDataPrefName[] = 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "default_search_provider_data.template_url_data"; 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kID[] = "id"; 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kShortName[] = "short_name"; 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kKeyword[] = "keyword"; 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kPrepopulateID[] = "prepopulate_id"; 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kSyncGUID[] = "synced_guid"; 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kURL[] = "url"; 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kSuggestionsURL[] = "suggestions_url"; 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kInstantURL[] = "instant_url"; 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kImageURL[] = "image_url"; 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kNewTabURL[] = "new_tab_url"; 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kFaviconURL[] = "favicon_url"; 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kOriginatingURL[] = "originating_url"; 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kSearchURLPostParams[] = 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "search_url_post_params"; 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kSuggestionsURLPostParams[] = 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "suggestions_url_post_params"; 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kInstantURLPostParams[] = 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "instant_url_post_params"; 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kImageURLPostParams[] = 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "image_url_post_params"; 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kSafeForAutoReplace[] = "safe_for_autoreplace"; 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kInputEncodings[] = "input_encodings"; 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kDateCreated[] = "date_created"; 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kLastModified[] = "last_modified"; 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kUsageCount[] = "usage_count"; 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kAlternateURLs[] = "alternate_urls"; 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kSearchTermsReplacementKey[] = 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "search_terms_replacement_key"; 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kCreatedByPolicy[] = "created_by_policy"; 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char DefaultSearchManager::kDisabledByPolicy[] = "disabled_by_policy"; 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DefaultSearchManager::DefaultSearchManager( 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PrefService* pref_service, 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const ObserverCallback& change_observer) 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : pref_service_(pref_service), 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) change_observer_(change_observer), 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) default_search_controlled_by_policy_(false) { 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pref_service_) { 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pref_change_registrar_.Init(pref_service_); 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pref_change_registrar_.Add( 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kDefaultSearchProviderDataPrefName, 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&DefaultSearchManager::OnDefaultSearchPrefChanged, 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(this))); 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pref_change_registrar_.Add( 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs::kSearchProviderOverrides, 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&DefaultSearchManager::OnOverridesPrefChanged, 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(this))); 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LoadPrepopulatedDefaultSearch(); 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LoadDefaultSearchEngineFromPrefs(); 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDefaultSearchManager::~DefaultSearchManager() { 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultSearchManager::RegisterProfilePrefs( 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_prefs::PrefRegistrySyncable* registry) { 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu registry->RegisterDictionaryPref( 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kDefaultSearchProviderDataPrefName, 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultSearchManager::AddPrefValueToMap(base::DictionaryValue* value, 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrefValueMap* pref_value_map) { 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pref_value_map->SetValue(kDefaultSearchProviderDataPrefName, value); 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DefaultSearchManager::SetFallbackSearchEnginesDisabledForTesting( 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool disabled) { 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) g_fallback_search_engines_disabled = disabled; 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TemplateURLData* DefaultSearchManager::GetDefaultSearchEngine( 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Source* source) const { 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (default_search_controlled_by_policy_) { 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (source) 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *source = FROM_POLICY; 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return prefs_default_search_.get(); 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (extension_default_search_) { 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (source) 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *source = FROM_EXTENSION; 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return extension_default_search_.get(); 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (prefs_default_search_) { 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (source) 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *source = FROM_USER; 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return prefs_default_search_.get(); 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (source) 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *source = FROM_FALLBACK; 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return g_fallback_search_engines_disabled ? 1410de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) NULL : fallback_default_search_.get(); 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DefaultSearchManager::Source 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DefaultSearchManager::GetDefaultSearchEngineSource() const { 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Source source; 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetDefaultSearchEngine(&source); 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return source; 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultSearchManager::SetUserSelectedDefaultSearchEngine( 1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const TemplateURLData& data) { 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!pref_service_) { 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_.reset(new TemplateURLData(data)); 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MergePrefsDataWithPrepopulated(); 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotifyObserver(); 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::DictionaryValue url_dict; 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kID, base::Int64ToString(data.id)); 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kShortName, data.short_name); 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kKeyword, data.keyword()); 1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetInteger(kPrepopulateID, data.prepopulate_id); 1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kSyncGUID, data.sync_guid); 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kURL, data.url()); 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kSuggestionsURL, data.suggestions_url); 1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kInstantURL, data.instant_url); 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kImageURL, data.image_url); 1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kNewTabURL, data.new_tab_url); 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kFaviconURL, data.favicon_url.spec()); 1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kOriginatingURL, data.originating_url.spec()); 1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kSearchURLPostParams, data.search_url_post_params); 1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kSuggestionsURLPostParams, 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu data.suggestions_url_post_params); 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kInstantURLPostParams, data.instant_url_post_params); 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kImageURLPostParams, data.image_url_post_params); 1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetBoolean(kSafeForAutoReplace, data.safe_for_autoreplace); 1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict.SetString(kDateCreated, 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Int64ToString(data.date_created.ToInternalValue())); 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict.SetString(kLastModified, 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Int64ToString(data.last_modified.ToInternalValue())); 1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetInteger(kUsageCount, data.usage_count); 1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::ListValue> alternate_urls(new base::ListValue); 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (std::vector<std::string>::const_iterator it = 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu data.alternate_urls.begin(); 1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu it != data.alternate_urls.end(); ++it) { 1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu alternate_urls->AppendString(*it); 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.Set(kAlternateURLs, alternate_urls.release()); 1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::ListValue> encodings(new base::ListValue); 1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (std::vector<std::string>::const_iterator it = 1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu data.input_encodings.begin(); 2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu it != data.input_encodings.end(); ++it) { 2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu encodings->AppendString(*it); 2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.Set(kInputEncodings, encodings.release()); 2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetString(kSearchTermsReplacementKey, 2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu data.search_terms_replacement_key); 2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_dict.SetBoolean(kCreatedByPolicy, data.created_by_policy); 2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pref_service_->Set(kDefaultSearchProviderDataPrefName, url_dict); 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const TemplateURLData& data) { 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extension_default_search_.reset(new TemplateURLData(data)); 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (GetDefaultSearchEngineSource() == FROM_EXTENSION) 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotifyObserver(); 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Source old_source = GetDefaultSearchEngineSource(); 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extension_default_search_.reset(); 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (old_source == FROM_EXTENSION) 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotifyObserver(); 2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pref_service_) { 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_.reset(); 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotifyObserver(); 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchManager::OnDefaultSearchPrefChanged() { 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Source source = GetDefaultSearchEngineSource(); 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LoadDefaultSearchEngineFromPrefs(); 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If we were/are FROM_USER or FROM_POLICY the effective DSE may have changed. 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (source != FROM_USER && source != FROM_POLICY) 242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) source = GetDefaultSearchEngineSource(); 243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (source == FROM_USER || source == FROM_POLICY) 244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotifyObserver(); 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchManager::OnOverridesPrefChanged() { 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LoadPrepopulatedDefaultSearch(); 249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TemplateURLData* effective_data = GetDefaultSearchEngine(NULL); 251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (effective_data && effective_data->prepopulate_id) { 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // A user-selected, policy-selected or fallback pre-populated engine is 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // active and may have changed with this event. 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotifyObserver(); 255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchManager::MergePrefsDataWithPrepopulated() { 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!prefs_default_search_ || !prefs_default_search_->prepopulate_id) 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t default_search_index; 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedVector<TemplateURLData> prepopulated_urls = 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service_, 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &default_search_index); 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < prepopulated_urls.size(); ++i) { 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (prepopulated_urls[i]->prepopulate_id == 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->prepopulate_id) { 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!prefs_default_search_->safe_for_autoreplace) { 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prepopulated_urls[i]->safe_for_autoreplace = false; 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prepopulated_urls[i]->SetKeyword(prefs_default_search_->keyword()); 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prepopulated_urls[i]->short_name = prefs_default_search_->short_name; 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prepopulated_urls[i]->id = prefs_default_search_->id; 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prepopulated_urls[i]->sync_guid = prefs_default_search_->sync_guid; 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prepopulated_urls[i]->date_created = prefs_default_search_->date_created; 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prepopulated_urls[i]->last_modified = 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->last_modified; 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_.reset(prepopulated_urls[i]); 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prepopulated_urls.weak_erase(prepopulated_urls.begin() + i); 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!pref_service_) 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_.reset(); 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const PrefService::Preference* pref = 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pref_service_->FindPreference(kDefaultSearchProviderDataPrefName); 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(pref); 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) default_search_controlled_by_policy_ = pref->IsManaged(); 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::DictionaryValue* url_dict = 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (url_dict->empty()) 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (default_search_controlled_by_policy_) { 303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool disabled_by_policy = false; 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) disabled_by_policy) 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string search_url; 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::string16 keyword; 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kURL, &search_url); 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kKeyword, &keyword); 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (search_url.empty() || keyword.empty()) 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_.reset(new TemplateURLData); 317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->SetKeyword(keyword); 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->SetURL(search_url); 319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string id; 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kID, &id); 322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringToInt64(id, &prefs_default_search_->id); 323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kShortName, &prefs_default_search_->short_name); 324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetInteger(kPrepopulateID, &prefs_default_search_->prepopulate_id); 325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kSyncGUID, &prefs_default_search_->sync_guid); 326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kSuggestionsURL, &prefs_default_search_->suggestions_url); 328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kInstantURL, &prefs_default_search_->instant_url); 329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kImageURL, &prefs_default_search_->image_url); 330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kNewTabURL, &prefs_default_search_->new_tab_url); 331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string favicon_url; 333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string originating_url; 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kFaviconURL, &favicon_url); 335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kOriginatingURL, &originating_url); 336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->favicon_url = GURL(favicon_url); 337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->originating_url = GURL(originating_url); 338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kSearchURLPostParams, 340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &prefs_default_search_->search_url_post_params); 341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kSuggestionsURLPostParams, 342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &prefs_default_search_->suggestions_url_post_params); 343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kInstantURLPostParams, 344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &prefs_default_search_->instant_url_post_params); 345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kImageURLPostParams, 346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &prefs_default_search_->image_url_post_params); 347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetBoolean(kSafeForAutoReplace, 349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &prefs_default_search_->safe_for_autoreplace); 350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string date_created_str; 352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string last_modified_str; 353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kDateCreated, &date_created_str); 354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kLastModified, &last_modified_str); 355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int64 date_created = 0; 357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (base::StringToInt64(date_created_str, &date_created)) { 358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->date_created = 359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Time::FromInternalValue(date_created); 360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int64 last_modified = 0; 363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (base::StringToInt64(date_created_str, &last_modified)) { 364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->last_modified = 365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Time::FromInternalValue(last_modified); 366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetInteger(kUsageCount, &prefs_default_search_->usage_count); 369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::ListValue* alternate_urls = NULL; 371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (url_dict->GetList(kAlternateURLs, &alternate_urls)) { 372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (base::ListValue::const_iterator it = alternate_urls->begin(); 373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) it != alternate_urls->end(); 374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++it) { 375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string alternate_url; 376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if ((*it)->GetAsString(&alternate_url)) 377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->alternate_urls.push_back(alternate_url); 378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::ListValue* encodings = NULL; 382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (url_dict->GetList(kInputEncodings, &encodings)) { 383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (base::ListValue::const_iterator it = encodings->begin(); 384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) it != encodings->end(); 385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++it) { 386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string encoding; 387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if ((*it)->GetAsString(&encoding)) 388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->input_encodings.push_back(encoding); 389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetString(kSearchTermsReplacementKey, 393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &prefs_default_search_->search_terms_replacement_key); 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_dict->GetBoolean(kCreatedByPolicy, 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &prefs_default_search_->created_by_policy); 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs_default_search_->show_in_default_list = true; 399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MergePrefsDataWithPrepopulated(); 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { 403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<TemplateURLData> data = 404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); 405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) fallback_default_search_ = data.Pass(); 406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MergePrefsDataWithPrepopulated(); 407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchManager::NotifyObserver() { 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!change_observer_.is_null()) { 411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Source source = FROM_FALLBACK; 412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TemplateURLData* data = GetDefaultSearchEngine(&source); 413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) change_observer_.Run(data, source); 414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 416