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

Side by Side Diff: chrome/browser/extensions/extension_util.cc

Issue 874683005: [Extensions] Enable the scripts-require-action feature based on all-urls pref (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 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/extension_util.h" 5 #include "chrome/browser/extensions/extension_util.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "chrome/browser/extensions/extension_service.h" 10 #include "chrome/browser/extensions/extension_service.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 // When we reload the extension the ID may be invalidated if we've passed it 63 // When we reload the extension the ID may be invalidated if we've passed it
64 // by const ref everywhere. Make a copy to be safe. http://crbug.com/103762 64 // by const ref everywhere. Make a copy to be safe. http://crbug.com/103762
65 std::string id = extension_id; 65 std::string id = extension_id;
66 ExtensionService* service = 66 ExtensionService* service =
67 ExtensionSystem::Get(context)->extension_service(); 67 ExtensionSystem::Get(context)->extension_service();
68 CHECK(service); 68 CHECK(service);
69 service->ReloadExtension(id); 69 service->ReloadExtension(id);
70 return id; 70 return id;
71 } 71 }
72 72
73 // Sets the preference for scripting on all urls to |allowed|, optionally
74 // updating the extension's active permissions (based on |update_permissions|).
75 void SetAllowedScriptingOnAllUrlsHelper(
76 content::BrowserContext* context,
77 const std::string& extension_id,
78 bool allowed,
79 bool update_permissions) {
80 ExtensionPrefs::Get(context)->UpdateExtensionPref(
81 extension_id,
82 kExtensionAllowedOnAllUrlsPrefName,
83 new base::FundamentalValue(allowed));
not at google - send to devlin 2015/02/06 00:26:55 So that the prefs delete the value if false, use (
Devlin 2015/02/06 18:58:43 As discussed offline, we actually need this pref t
84
85 if (update_permissions) {
86 const Extension* extension =
87 ExtensionRegistry::Get(context)->enabled_extensions().GetByID(
88 extension_id);
89 if (extension) {
90 PermissionsUpdater updater(context);
91 if (allowed)
92 updater.GrantWithheldImpliedAllHosts(extension);
93 else
94 updater.WithholdImpliedAllHosts(extension);
95 }
96 }
97 }
98
73 } // namespace 99 } // namespace
74 100
75 bool IsIncognitoEnabled(const std::string& extension_id, 101 bool IsIncognitoEnabled(const std::string& extension_id,
76 content::BrowserContext* context) { 102 content::BrowserContext* context) {
77 const Extension* extension = ExtensionRegistry::Get(context)-> 103 const Extension* extension = ExtensionRegistry::Get(context)->
78 GetExtensionById(extension_id, ExtensionRegistry::ENABLED); 104 GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
79 if (extension) { 105 if (extension) {
80 if (!extension->can_be_incognito_enabled()) 106 if (!extension->can_be_incognito_enabled())
81 return false; 107 return false;
82 // If this is an existing component extension we always allow it to 108 // If this is an existing component extension we always allow it to
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 return; 195 return;
170 196
171 ExtensionPrefs::Get(context)->SetAllowFileAccess(extension_id, allow); 197 ExtensionPrefs::Get(context)->SetAllowFileAccess(extension_id, allow);
172 198
173 ReloadExtensionIfEnabled(extension_id, context); 199 ReloadExtensionIfEnabled(extension_id, context);
174 } 200 }
175 201
176 bool AllowedScriptingOnAllUrls(const std::string& extension_id, 202 bool AllowedScriptingOnAllUrls(const std::string& extension_id,
177 content::BrowserContext* context) { 203 content::BrowserContext* context) {
178 bool allowed = false; 204 bool allowed = false;
179 return ExtensionPrefs::Get(context)->ReadPrefAsBoolean( 205 ExtensionPrefs* prefs = ExtensionPrefs::Get(context);
180 extension_id, 206 if (!prefs->ReadPrefAsBoolean(extension_id,
181 kExtensionAllowedOnAllUrlsPrefName, 207 kExtensionAllowedOnAllUrlsPrefName,
182 &allowed) && 208 &allowed)) {
183 allowed; 209 // If there is no value present, we make one, defaulting it to the value of
210 // the 'scripts require action' flag. If the flag is on, then the extension
211 // does not have permission to script on all urls by default.
212 bool default_value = DefaultAllowedScriptingOnAllUrls();
not at google - send to devlin 2015/02/06 00:26:55 sorry I'm in a nit mood. Just assign to |allowed|.
Devlin 2015/02/06 18:58:43 Done.
213 SetAllowedScriptingOnAllUrlsHelper(
214 context, extension_id, default_value, false);
215 allowed = default_value;
216 }
217 return allowed;
184 } 218 }
185 219
186 void SetAllowedScriptingOnAllUrls(const std::string& extension_id, 220 void SetAllowedScriptingOnAllUrls(const std::string& extension_id,
187 content::BrowserContext* context, 221 content::BrowserContext* context,
188 bool allowed) { 222 bool allowed) {
189 if (allowed == AllowedScriptingOnAllUrls(extension_id, context)) 223 if (allowed == AllowedScriptingOnAllUrls(extension_id, context))
190 return; // Nothing to do here. 224 return; // Nothing to do here.
191 225
192 ExtensionPrefs::Get(context)->UpdateExtensionPref( 226 SetAllowedScriptingOnAllUrlsHelper(context, extension_id, allowed, true);
not at google - send to devlin 2015/02/06 00:26:55 now that you have this helper, it would be nice to
Devlin 2015/02/06 18:58:43 Thanks for the catch - I usually cringe at those u
193 extension_id,
194 kExtensionAllowedOnAllUrlsPrefName,
195 allowed ? new base::FundamentalValue(true) : NULL);
196
197 const Extension* extension =
198 ExtensionRegistry::Get(context)->enabled_extensions().GetByID(
199 extension_id);
200 if (extension) {
201 PermissionsUpdater updater(context);
202 if (allowed)
203 updater.GrantWithheldImpliedAllHosts(extension);
204 else
205 updater.WithholdImpliedAllHosts(extension);
206 }
207 } 227 }
208 228
209 bool ScriptsMayRequireActionForExtension(const Extension* extension) { 229 bool DefaultAllowedScriptingOnAllUrls() {
210 // An extension requires user action to execute scripts iff the switch to do 230 return !FeatureSwitch::scripts_require_action()->IsEnabled();
211 // so is enabled, the extension shows up in chrome:extensions (so the user can 231 }
212 // grant withheld permissions), the extension is not part of chrome or 232
213 // corporate policy, and also not on the scripting whitelist. 233 bool ScriptsMayRequireActionForExtension(
214 return FeatureSwitch::scripts_require_action()->IsEnabled() && 234 const Extension* extension,
215 extension->ShouldDisplayInExtensionSettings() && 235 const scoped_refptr<const PermissionSet>& permissions) {
236 // An extension may require user action to execute scripts iff the extension
237 // shows up in chrome:extensions (so the user can grant withheld permissions),
238 // is not part of chrome or corporate policy, not on the scripting whitelist,
239 // and requires enough permissions that we should withhold them.
240 return extension->ShouldDisplayInExtensionSettings() &&
216 !Manifest::IsPolicyLocation(extension->location()) && 241 !Manifest::IsPolicyLocation(extension->location()) &&
217 !Manifest::IsComponentLocation(extension->location()) && 242 !Manifest::IsComponentLocation(extension->location()) &&
218 !PermissionsData::CanExecuteScriptEverywhere(extension); 243 !PermissionsData::CanExecuteScriptEverywhere(extension) &&
244 permissions->ShouldWarnAllHosts();
219 } 245 }
220 246
221 bool IsAppLaunchable(const std::string& extension_id, 247 bool IsAppLaunchable(const std::string& extension_id,
222 content::BrowserContext* context) { 248 content::BrowserContext* context) {
223 int reason = ExtensionPrefs::Get(context)->GetDisableReasons(extension_id); 249 int reason = ExtensionPrefs::Get(context)->GetDisableReasons(extension_id);
224 return !((reason & Extension::DISABLE_UNSUPPORTED_REQUIREMENT) || 250 return !((reason & Extension::DISABLE_UNSUPPORTED_REQUIREMENT) ||
225 (reason & Extension::DISABLE_CORRUPTED)); 251 (reason & Extension::DISABLE_CORRUPTED));
226 } 252 }
227 253
228 bool IsAppLaunchableWithoutEnabling(const std::string& extension_id, 254 bool IsAppLaunchableWithoutEnabling(const std::string& extension_id,
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 IDR_EXTENSION_DEFAULT_ICON); 375 IDR_EXTENSION_DEFAULT_ICON);
350 } 376 }
351 377
352 bool IsNewBookmarkAppsEnabled() { 378 bool IsNewBookmarkAppsEnabled() {
353 return base::CommandLine::ForCurrentProcess()->HasSwitch( 379 return base::CommandLine::ForCurrentProcess()->HasSwitch(
354 switches::kEnableNewBookmarkApps); 380 switches::kEnableNewBookmarkApps);
355 } 381 }
356 382
357 } // namespace util 383 } // namespace util
358 } // namespace extensions 384 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698