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

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

Issue 2623833005: Revert of Make extensions DSE persistent in browser prefs (Closed)
Patch Set: Created 3 years, 11 months 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>
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698