OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/api/settings_overrides/settings_overrides_ap
i.h" | 5 #include "chrome/browser/extensions/api/settings_overrides/settings_overrides_ap
i.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <memory> |
8 #include <utility> | 9 #include <utility> |
9 | 10 |
10 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
11 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
12 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
13 #include "chrome/browser/extensions/api/preference/preference_api.h" | 14 #include "chrome/browser/extensions/api/preference/preference_api.h" |
14 #include "chrome/browser/prefs/session_startup_pref.h" | 15 #include "chrome/browser/prefs/session_startup_pref.h" |
15 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
16 #include "chrome/browser/search_engines/template_url_service_factory.h" | 17 #include "chrome/browser/search_engines/template_url_service_factory.h" |
17 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.
h" | 18 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.
h" |
18 #include "chrome/common/pref_names.h" | 19 #include "chrome/common/pref_names.h" |
19 #include "components/search_engines/search_engines_pref_names.h" | 20 #include "components/search_engines/search_engines_pref_names.h" |
20 #include "components/search_engines/template_url.h" | 21 #include "components/search_engines/template_url.h" |
| 22 #include "components/search_engines/template_url_data_util.h" |
21 #include "components/search_engines/template_url_prepopulate_data.h" | 23 #include "components/search_engines/template_url_prepopulate_data.h" |
22 #include "extensions/browser/extension_prefs.h" | 24 #include "extensions/browser/extension_prefs.h" |
23 #include "extensions/browser/extension_prefs_factory.h" | 25 #include "extensions/browser/extension_prefs_factory.h" |
24 #include "extensions/browser/extension_registry.h" | 26 #include "extensions/browser/extension_registry.h" |
25 #include "extensions/common/error_utils.h" | 27 #include "extensions/common/error_utils.h" |
26 #include "extensions/common/manifest_constants.h" | 28 #include "extensions/common/manifest_constants.h" |
27 | 29 |
28 namespace extensions { | 30 namespace extensions { |
29 | 31 |
30 namespace { | 32 namespace { |
31 | 33 |
32 base::LazyInstance<BrowserContextKeyedAPIFactory<SettingsOverridesAPI> > | 34 base::LazyInstance<BrowserContextKeyedAPIFactory<SettingsOverridesAPI> > |
33 g_factory = LAZY_INSTANCE_INITIALIZER; | 35 g_factory = LAZY_INSTANCE_INITIALIZER; |
34 | 36 |
35 const char kManyStartupPagesWarning[] = "* specifies more than 1 startup URL. " | 37 const char kManyStartupPagesWarning[] = "* specifies more than 1 startup URL. " |
36 "All but the first will be ignored."; | 38 "All but the first will be ignored."; |
37 | 39 |
38 using api::manifest_types::ChromeSettingsOverrides; | 40 using api::manifest_types::ChromeSettingsOverrides; |
39 | 41 |
40 std::string SubstituteInstallParam(std::string str, | 42 std::string SubstituteInstallParam(std::string str, |
41 const std::string& install_parameter) { | 43 const std::string& install_parameter) { |
42 base::ReplaceSubstringsAfterOffset(&str, 0, "__PARAM__", install_parameter); | 44 base::ReplaceSubstringsAfterOffset(&str, 0, "__PARAM__", install_parameter); |
43 return str; | 45 return str; |
44 } | 46 } |
45 | 47 |
46 // Find the prepopulated search engine with the given id. | |
47 std::unique_ptr<TemplateURLData> GetPrepopulatedSearchProvider( | |
48 PrefService* prefs, | |
49 int prepopulated_id) { | |
50 size_t default_index; | |
51 std::vector<std::unique_ptr<TemplateURLData>> engines = | |
52 TemplateURLPrepopulateData::GetPrepopulatedEngines(prefs, &default_index); | |
53 for (auto& engine : engines) { | |
54 if (engine->prepopulate_id == prepopulated_id) | |
55 return std::move(engine); | |
56 } | |
57 return nullptr; | |
58 } | |
59 | |
60 std::unique_ptr<TemplateURLData> ConvertSearchProvider( | 48 std::unique_ptr<TemplateURLData> ConvertSearchProvider( |
61 PrefService* prefs, | 49 PrefService* prefs, |
62 const ChromeSettingsOverrides::Search_provider& search_provider, | 50 const ChromeSettingsOverrides::Search_provider& search_provider, |
63 const std::string& install_parameter) { | 51 const std::string& install_parameter) { |
64 std::unique_ptr<TemplateURLData> data; | 52 std::unique_ptr<TemplateURLData> data; |
65 if (search_provider.prepopulated_id) { | 53 if (search_provider.prepopulated_id) { |
66 data = | 54 data = TemplateURLPrepopulateData::GetPrepopulatedEngine( |
67 GetPrepopulatedSearchProvider(prefs, *search_provider.prepopulated_id); | 55 prefs, *search_provider.prepopulated_id); |
68 if (!data) { | 56 if (!data) { |
69 VLOG(1) << "Settings Overrides API can't recognize prepopulated_id=" | 57 VLOG(1) << "Settings Overrides API can't recognize prepopulated_id=" |
70 << *search_provider.prepopulated_id; | 58 << *search_provider.prepopulated_id; |
71 } | 59 } |
72 } | 60 } |
73 | 61 |
74 if (!data) | 62 if (!data) |
75 data = base::MakeUnique<TemplateURLData>(); | 63 data = base::MakeUnique<TemplateURLData>(); |
76 | 64 |
77 if (search_provider.name) | 65 if (search_provider.name) |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 SettingsOverridesAPI::~SettingsOverridesAPI() { | 124 SettingsOverridesAPI::~SettingsOverridesAPI() { |
137 } | 125 } |
138 | 126 |
139 BrowserContextKeyedAPIFactory<SettingsOverridesAPI>* | 127 BrowserContextKeyedAPIFactory<SettingsOverridesAPI>* |
140 SettingsOverridesAPI::GetFactoryInstance() { | 128 SettingsOverridesAPI::GetFactoryInstance() { |
141 return g_factory.Pointer(); | 129 return g_factory.Pointer(); |
142 } | 130 } |
143 | 131 |
144 void SettingsOverridesAPI::SetPref(const std::string& extension_id, | 132 void SettingsOverridesAPI::SetPref(const std::string& extension_id, |
145 const std::string& pref_key, | 133 const std::string& pref_key, |
146 base::Value* value) { | 134 std::unique_ptr<base::Value> value) const { |
147 PreferenceAPI* prefs = PreferenceAPI::Get(profile_); | 135 PreferenceAPI* prefs = PreferenceAPI::Get(profile_); |
148 if (!prefs) | 136 if (!prefs) |
149 return; // Expected in unit tests. | 137 return; // Expected in unit tests. |
150 prefs->SetExtensionControlledPref(extension_id, | 138 prefs->SetExtensionControlledPref( |
151 pref_key, | 139 extension_id, pref_key, kExtensionPrefsScopeRegular, value.release()); |
152 kExtensionPrefsScopeRegular, | |
153 value); | |
154 } | 140 } |
155 | 141 |
156 void SettingsOverridesAPI::UnsetPref(const std::string& extension_id, | 142 void SettingsOverridesAPI::UnsetPref(const std::string& extension_id, |
157 const std::string& pref_key) { | 143 const std::string& pref_key) const { |
158 PreferenceAPI* prefs = PreferenceAPI::Get(profile_); | 144 PreferenceAPI* prefs = PreferenceAPI::Get(profile_); |
159 if (!prefs) | 145 if (!prefs) |
160 return; // Expected in unit tests. | 146 return; // Expected in unit tests. |
161 prefs->RemoveExtensionControlledPref( | 147 prefs->RemoveExtensionControlledPref( |
162 extension_id, | 148 extension_id, |
163 pref_key, | 149 pref_key, |
164 kExtensionPrefsScopeRegular); | 150 kExtensionPrefsScopeRegular); |
165 } | 151 } |
166 | 152 |
167 void SettingsOverridesAPI::OnExtensionLoaded( | 153 void SettingsOverridesAPI::OnExtensionLoaded( |
168 content::BrowserContext* browser_context, | 154 content::BrowserContext* browser_context, |
169 const Extension* extension) { | 155 const Extension* extension) { |
170 const SettingsOverrides* settings = SettingsOverrides::Get(extension); | 156 const SettingsOverrides* settings = SettingsOverrides::Get(extension); |
171 if (settings) { | 157 if (settings) { |
172 std::string install_parameter = | 158 std::string install_parameter = |
173 ExtensionPrefs::Get(profile_)->GetInstallParam(extension->id()); | 159 ExtensionPrefs::Get(profile_)->GetInstallParam(extension->id()); |
174 if (settings->homepage) { | 160 if (settings->homepage) { |
175 SetPref(extension->id(), | 161 SetPref(extension->id(), prefs::kHomePage, |
176 prefs::kHomePage, | 162 base::MakeUnique<base::StringValue>(SubstituteInstallParam( |
177 new base::StringValue(SubstituteInstallParam( | |
178 settings->homepage->spec(), install_parameter))); | 163 settings->homepage->spec(), install_parameter))); |
179 SetPref(extension->id(), | 164 SetPref(extension->id(), prefs::kHomePageIsNewTabPage, |
180 prefs::kHomePageIsNewTabPage, | 165 base::MakeUnique<base::FundamentalValue>(false)); |
181 new base::FundamentalValue(false)); | |
182 } | 166 } |
183 if (!settings->startup_pages.empty()) { | 167 if (!settings->startup_pages.empty()) { |
184 SetPref(extension->id(), | 168 SetPref(extension->id(), prefs::kRestoreOnStartup, |
185 prefs::kRestoreOnStartup, | 169 base::MakeUnique<base::FundamentalValue>( |
186 new base::FundamentalValue(SessionStartupPref::kPrefValueURLs)); | 170 SessionStartupPref::kPrefValueURLs)); |
187 if (settings->startup_pages.size() > 1) { | 171 if (settings->startup_pages.size() > 1) { |
188 VLOG(1) << extensions::ErrorUtils::FormatErrorMessage( | 172 VLOG(1) << extensions::ErrorUtils::FormatErrorMessage( |
189 kManyStartupPagesWarning, | 173 kManyStartupPagesWarning, |
190 manifest_keys::kSettingsOverride); | 174 manifest_keys::kSettingsOverride); |
191 } | 175 } |
192 std::unique_ptr<base::ListValue> url_list(new base::ListValue); | 176 std::unique_ptr<base::ListValue> url_list(new base::ListValue); |
193 url_list->AppendString(SubstituteInstallParam( | 177 url_list->AppendString(SubstituteInstallParam( |
194 settings->startup_pages[0].spec(), install_parameter)); | 178 settings->startup_pages[0].spec(), install_parameter)); |
195 SetPref( | 179 SetPref(extension->id(), prefs::kURLsToRestoreOnStartup, |
196 extension->id(), prefs::kURLsToRestoreOnStartup, url_list.release()); | 180 std::move(url_list)); |
197 } | 181 } |
198 if (settings->search_engine) { | 182 if (settings->search_engine) { |
199 // Bring the preference to the correct state. Before this code set it | 183 // Bring the preference to the correct state. Before this code set it |
200 // to "true" for all search engines. Thus, we should overwrite it for | 184 // to "true" for all search engines. Thus, we should overwrite it for |
201 // all search engines. | 185 // all search engines. |
202 if (settings->search_engine->is_default) { | 186 if (settings->search_engine->is_default) { |
203 SetPref(extension->id(), | 187 SetPref(extension->id(), prefs::kDefaultSearchProviderEnabled, |
204 prefs::kDefaultSearchProviderEnabled, | 188 base::MakeUnique<base::FundamentalValue>(true)); |
205 new base::FundamentalValue(true)); | |
206 } else { | 189 } else { |
207 UnsetPref(extension->id(), prefs::kDefaultSearchProviderEnabled); | 190 UnsetPref(extension->id(), prefs::kDefaultSearchProviderEnabled); |
208 } | 191 } |
209 DCHECK(url_service_); | 192 DCHECK(url_service_); |
210 if (url_service_->loaded()) { | 193 RegisterSearchProvider(extension); |
211 RegisterSearchProvider(extension); | |
212 } else { | |
213 if (!template_url_sub_) { | |
214 template_url_sub_ = url_service_->RegisterOnLoadedCallback( | |
215 base::Bind(&SettingsOverridesAPI::OnTemplateURLsLoaded, | |
216 base::Unretained(this))); | |
217 } | |
218 url_service_->Load(); | |
219 pending_extensions_.insert(extension); | |
220 } | |
221 } | 194 } |
222 } | 195 } |
223 } | 196 } |
224 void SettingsOverridesAPI::OnExtensionUnloaded( | 197 void SettingsOverridesAPI::OnExtensionUnloaded( |
225 content::BrowserContext* browser_context, | 198 content::BrowserContext* browser_context, |
226 const Extension* extension, | 199 const Extension* extension, |
227 UnloadedExtensionInfo::Reason reason) { | 200 UnloadedExtensionInfo::Reason reason) { |
228 const SettingsOverrides* settings = SettingsOverrides::Get(extension); | 201 const SettingsOverrides* settings = SettingsOverrides::Get(extension); |
229 if (settings) { | 202 if (settings) { |
230 if (settings->homepage) { | 203 if (settings->homepage) { |
231 UnsetPref(extension->id(), prefs::kHomePage); | 204 UnsetPref(extension->id(), prefs::kHomePage); |
232 UnsetPref(extension->id(), prefs::kHomePageIsNewTabPage); | 205 UnsetPref(extension->id(), prefs::kHomePageIsNewTabPage); |
233 } | 206 } |
234 if (!settings->startup_pages.empty()) { | 207 if (!settings->startup_pages.empty()) { |
235 UnsetPref(extension->id(), prefs::kRestoreOnStartup); | 208 UnsetPref(extension->id(), prefs::kRestoreOnStartup); |
236 UnsetPref(extension->id(), prefs::kURLsToRestoreOnStartup); | 209 UnsetPref(extension->id(), prefs::kURLsToRestoreOnStartup); |
237 } | 210 } |
238 if (settings->search_engine) { | 211 if (settings->search_engine) { |
| 212 if (settings->search_engine->is_default) { |
| 213 // Current extension can be overriding DSE. |
| 214 UnsetPref(extension->id(), |
| 215 DefaultSearchManager::kDefaultSearchProviderDataPrefName); |
| 216 } |
239 DCHECK(url_service_); | 217 DCHECK(url_service_); |
240 if (url_service_->loaded()) { | 218 if (url_service_->loaded()) { |
241 url_service_->RemoveExtensionControlledTURL( | 219 url_service_->RemoveExtensionControlledTURL( |
242 extension->id(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); | 220 extension->id(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
243 } else { | |
244 pending_extensions_.erase(extension); | |
245 } | 221 } |
246 } | 222 } |
247 } | 223 } |
248 } | 224 } |
249 | 225 |
250 void SettingsOverridesAPI::Shutdown() { | |
251 template_url_sub_.reset(); | |
252 } | |
253 | |
254 void SettingsOverridesAPI::OnTemplateURLsLoaded() { | |
255 // Register search providers for pending extensions. | |
256 template_url_sub_.reset(); | |
257 for (PendingExtensions::const_iterator i(pending_extensions_.begin()); | |
258 i != pending_extensions_.end(); ++i) { | |
259 RegisterSearchProvider(i->get()); | |
260 } | |
261 pending_extensions_.clear(); | |
262 } | |
263 | |
264 void SettingsOverridesAPI::RegisterSearchProvider( | 226 void SettingsOverridesAPI::RegisterSearchProvider( |
265 const Extension* extension) const { | 227 const Extension* extension) const { |
266 DCHECK(url_service_); | 228 DCHECK(url_service_); |
267 DCHECK(extension); | 229 DCHECK(extension); |
268 const SettingsOverrides* settings = SettingsOverrides::Get(extension); | 230 const SettingsOverrides* settings = SettingsOverrides::Get(extension); |
269 DCHECK(settings); | 231 DCHECK(settings); |
270 DCHECK(settings->search_engine); | 232 DCHECK(settings->search_engine); |
271 auto info = | 233 auto info = |
272 base::MakeUnique<TemplateURL::AssociatedExtensionInfo>(extension->id()); | 234 base::MakeUnique<TemplateURL::AssociatedExtensionInfo>(extension->id()); |
273 info->wants_to_be_default_engine = settings->search_engine->is_default; | 235 info->wants_to_be_default_engine = settings->search_engine->is_default; |
274 | 236 |
275 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); | 237 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); |
276 info->install_time = prefs->GetInstallTime(extension->id()); | |
277 std::string install_parameter = prefs->GetInstallParam(extension->id()); | 238 std::string install_parameter = prefs->GetInstallParam(extension->id()); |
278 std::unique_ptr<TemplateURLData> data = ConvertSearchProvider( | 239 std::unique_ptr<TemplateURLData> data = ConvertSearchProvider( |
279 profile_->GetPrefs(), *settings->search_engine, install_parameter); | 240 profile_->GetPrefs(), *settings->search_engine, install_parameter); |
280 auto turl = base::MakeUnique<TemplateURL>( | 241 auto turl = base::MakeUnique<TemplateURL>( |
281 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); | 242 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
282 | 243 |
283 url_service_->AddExtensionControlledTURL(std::move(turl), std::move(info)); | 244 url_service_->AddExtensionControlledTURL(std::move(turl), std::move(info)); |
| 245 |
| 246 if (settings->search_engine->is_default) { |
| 247 // Override current DSE pref to have extension overriden value. |
| 248 SetPref(extension->id(), |
| 249 DefaultSearchManager::kDefaultSearchProviderDataPrefName, |
| 250 TemplateURLDataToDictionary(*data)); |
| 251 } |
284 } | 252 } |
285 | 253 |
286 template <> | 254 template <> |
287 void BrowserContextKeyedAPIFactory< | 255 void BrowserContextKeyedAPIFactory< |
288 SettingsOverridesAPI>::DeclareFactoryDependencies() { | 256 SettingsOverridesAPI>::DeclareFactoryDependencies() { |
289 DependsOn(ExtensionPrefsFactory::GetInstance()); | 257 DependsOn(ExtensionPrefsFactory::GetInstance()); |
290 DependsOn(PreferenceAPI::GetFactoryInstance()); | 258 DependsOn(PreferenceAPI::GetFactoryInstance()); |
291 DependsOn(TemplateURLServiceFactory::GetInstance()); | 259 DependsOn(TemplateURLServiceFactory::GetInstance()); |
292 } | 260 } |
293 | 261 |
294 } // namespace extensions | 262 } // namespace extensions |
OLD | NEW |