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