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