Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc

Issue 2479113002: Make extensions DSE persistent in browser prefs (Closed)
Patch Set: Tests updated(rewritten) after review Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 if (url_service_->loaded()) {
211 RegisterSearchProvider(extension); 194 RegisterSearchProvider(extension);
212 } else { 195 } else {
213 if (!template_url_sub_) { 196 if (!template_url_sub_) {
214 template_url_sub_ = url_service_->RegisterOnLoadedCallback( 197 template_url_sub_ = url_service_->RegisterOnLoadedCallback(
215 base::Bind(&SettingsOverridesAPI::OnTemplateURLsLoaded, 198 base::Bind(&SettingsOverridesAPI::OnTemplateURLsLoaded,
(...skipping 13 matching lines...) Expand all
229 if (settings) { 212 if (settings) {
230 if (settings->homepage) { 213 if (settings->homepage) {
231 UnsetPref(extension->id(), prefs::kHomePage); 214 UnsetPref(extension->id(), prefs::kHomePage);
232 UnsetPref(extension->id(), prefs::kHomePageIsNewTabPage); 215 UnsetPref(extension->id(), prefs::kHomePageIsNewTabPage);
233 } 216 }
234 if (!settings->startup_pages.empty()) { 217 if (!settings->startup_pages.empty()) {
235 UnsetPref(extension->id(), prefs::kRestoreOnStartup); 218 UnsetPref(extension->id(), prefs::kRestoreOnStartup);
236 UnsetPref(extension->id(), prefs::kURLsToRestoreOnStartup); 219 UnsetPref(extension->id(), prefs::kURLsToRestoreOnStartup);
237 } 220 }
238 if (settings->search_engine) { 221 if (settings->search_engine) {
222 if (settings->search_engine->is_default) {
223 // Current extension can be overriding DSE.
224 UnsetPref(extension->id(),
225 DefaultSearchManager::kDefaultSearchProviderDataPrefName);
226 }
239 DCHECK(url_service_); 227 DCHECK(url_service_);
240 if (url_service_->loaded()) { 228 if (url_service_->loaded()) {
241 url_service_->RemoveExtensionControlledTURL( 229 url_service_->RemoveExtensionControlledTURL(
242 extension->id(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); 230 extension->id(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION);
243 } else { 231 } else {
244 pending_extensions_.erase(extension); 232 pending_extensions_.erase(extension);
245 } 233 }
246 } 234 }
247 } 235 }
248 } 236 }
(...skipping 17 matching lines...) Expand all
266 DCHECK(url_service_); 254 DCHECK(url_service_);
267 DCHECK(extension); 255 DCHECK(extension);
268 const SettingsOverrides* settings = SettingsOverrides::Get(extension); 256 const SettingsOverrides* settings = SettingsOverrides::Get(extension);
269 DCHECK(settings); 257 DCHECK(settings);
270 DCHECK(settings->search_engine); 258 DCHECK(settings->search_engine);
271 auto info = 259 auto info =
272 base::MakeUnique<TemplateURL::AssociatedExtensionInfo>(extension->id()); 260 base::MakeUnique<TemplateURL::AssociatedExtensionInfo>(extension->id());
273 info->wants_to_be_default_engine = settings->search_engine->is_default; 261 info->wants_to_be_default_engine = settings->search_engine->is_default;
274 262
275 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); 263 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_);
276 info->install_time = prefs->GetInstallTime(extension->id());
277 std::string install_parameter = prefs->GetInstallParam(extension->id()); 264 std::string install_parameter = prefs->GetInstallParam(extension->id());
278 std::unique_ptr<TemplateURLData> data = ConvertSearchProvider( 265 std::unique_ptr<TemplateURLData> data = ConvertSearchProvider(
279 profile_->GetPrefs(), *settings->search_engine, install_parameter); 266 profile_->GetPrefs(), *settings->search_engine, install_parameter);
280 auto turl = base::MakeUnique<TemplateURL>( 267 auto turl = base::MakeUnique<TemplateURL>(
281 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); 268 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION);
282 269
283 url_service_->AddExtensionControlledTURL(std::move(turl), std::move(info)); 270 url_service_->AddExtensionControlledTURL(std::move(turl), std::move(info));
271
272 if (settings->search_engine->is_default) {
273 // Override current DSE pref to have extension overriden value.
274 SetPref(extension->id(),
275 DefaultSearchManager::kDefaultSearchProviderDataPrefName,
276 TemplateURLDataToDictionary(*data));
277 }
284 } 278 }
285 279
286 template <> 280 template <>
287 void BrowserContextKeyedAPIFactory< 281 void BrowserContextKeyedAPIFactory<
288 SettingsOverridesAPI>::DeclareFactoryDependencies() { 282 SettingsOverridesAPI>::DeclareFactoryDependencies() {
289 DependsOn(ExtensionPrefsFactory::GetInstance()); 283 DependsOn(ExtensionPrefsFactory::GetInstance());
290 DependsOn(PreferenceAPI::GetFactoryInstance()); 284 DependsOn(PreferenceAPI::GetFactoryInstance());
291 DependsOn(TemplateURLServiceFactory::GetInstance()); 285 DependsOn(TemplateURLServiceFactory::GetInstance());
292 } 286 }
293 287
294 } // namespace extensions 288 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698