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

Unified Diff: chrome/renderer/extensions/extension_resource_request_policy.cc

Issue 9909019: Add schema chrome-extension-resource:// for extension resources (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Add tests Created 8 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/extensions/extension_resource_request_policy.cc
diff --git a/chrome/renderer/extensions/extension_resource_request_policy.cc b/chrome/renderer/extensions/extension_resource_request_policy.cc
index 4bee495a511e706bca009a2133a6132850dcdf74..93e8fe7f63f3844281b8deee2693cb6c18dac809 100644
--- a/chrome/renderer/extensions/extension_resource_request_policy.cc
+++ b/chrome/renderer/extensions/extension_resource_request_policy.cc
@@ -22,55 +22,75 @@ bool ExtensionResourceRequestPolicy::CanRequestResource(
const GURL& resource_url,
WebKit::WebFrame* frame,
const ExtensionSet* loaded_extensions) {
- CHECK(resource_url.SchemeIs(chrome::kExtensionScheme));
+ if (resource_url.SchemeIs(chrome::kExtensionScheme)) {
+ const Extension* extension =
+ loaded_extensions->GetExtensionOrAppByURL(
+ ExtensionURLInfo(resource_url));
+ if (!extension) {
+ // Allow the load in the case of a non-existent extension. We'll just get
+ // a 404 from the browser process.
+ return true;
+ }
- const Extension* extension =
- loaded_extensions->GetExtensionOrAppByURL(ExtensionURLInfo(resource_url));
- if (!extension) {
- // Allow the load in the case of a non-existent extension. We'll just get a
- // 404 from the browser process.
- return true;
- }
+ // Disallow loading of packaged resources for hosted apps. We don't allow
+ // hybrid hosted/packaged apps. The one exception is access to icons, since
+ // some extensions want to be able to do things like create their own
+ // launchers.
+ std::string resource_root_relative_path =
+ resource_url.path().empty() ? "" : resource_url.path().substr(1);
+ if (extension->is_hosted_app() &&
+ !extension->icons().ContainsPath(resource_root_relative_path)) {
+ LOG(ERROR) << "Denying load of " << resource_url.spec() << " from "
+ "hosted app.";
+ return false;
+ }
- // Disallow loading of packaged resources for hosted apps. We don't allow
- // hybrid hosted/packaged apps. The one exception is access to icons, since
- // some extensions want to be able to do things like create their own
- // launchers.
- std::string resource_root_relative_path =
- resource_url.path().empty() ? "" : resource_url.path().substr(1);
- if (extension->is_hosted_app() &&
- !extension->icons().ContainsPath(resource_root_relative_path)) {
- LOG(ERROR) << "Denying load of " << resource_url.spec() << " from "
- << "hosted app.";
- return false;
- }
+ // Disallow loading of extension resources that are not explicitely listed
+ // as web accessible if the manifest version is 2 or greater.
- // Disallow loading of extension resources which are not explicitely listed
- // as web accessible if the manifest version is 2 or greater.
+ GURL frame_url = frame->document().url();
+ GURL page_url = frame->top()->document().url();
+ // Exceptions are:
+ // - empty origin (needed for some edge cases when we have empty origins)
+ // - chrome-extension:// (for legacy reasons - some extensions interoperate)
+ // - devtools (chrome-extension:// URLs are loaded into frames of devtools
+ // to support the devtools extension APIs)
+ if (!CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDisableExtensionsResourceWhitelist) &&
+ !frame_url.is_empty() &&
+ !frame_url.SchemeIs(chrome::kExtensionScheme) &&
+ !(page_url.SchemeIs(chrome::kChromeDevToolsScheme) &&
+ !extension->devtools_url().is_empty()) &&
+ !extension->IsResourceWebAccessible(resource_url.path())) {
+ std::string message = base::StringPrintf(
+ "Denying load of %s. Resources must be listed in the "
+ "web_accessible_resources manifest key in order to be loaded by web "
+ "pages.",
+ resource_url.spec().c_str());
+ frame->addMessageToConsole(
+ WebKit::WebConsoleMessage(WebKit::WebConsoleMessage::LevelError,
+ WebKit::WebString::fromUTF8(message)));
+ return false;
+ }
- GURL frame_url = frame->document().url();
- GURL page_url = frame->top()->document().url();
- // Exceptions are:
- // - empty origin (needed for some edge cases when we have empty origins)
- // - chrome-extension:// (for legacy reasons -- some extensions interop)
- // - devtools (chrome-extension:// URLs are loaded into frames of devtools
- // to support the devtools extension APIs)
- if (!CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableExtensionsResourceWhitelist) &&
- !frame_url.is_empty() &&
- !frame_url.SchemeIs(chrome::kExtensionScheme) &&
- !(page_url.SchemeIs(chrome::kChromeDevToolsScheme) &&
- !extension->devtools_url().is_empty()) &&
- !extension->IsResourceWebAccessible(resource_url.path())) {
- std::string message = base::StringPrintf(
- "Denying load of %s. Resources must be listed in the "
- "web_accessible_resources manifest key in order to be loaded by web "
- "pages.",
+ return true;
+ }
+
+ if (resource_url.SchemeIs(chrome::kExtensionResourceScheme)) {
Aaron Boodman 2012/04/16 18:54:36 Split these two cases into two separate helper fun
Peng 2012/04/17 13:52:05 Done.
+ GURL frame_url = frame->document().url();
+ if (!frame_url.is_empty() &&
+ !frame_url.SchemeIs(chrome::kExtensionScheme) &&
+ !frame_url.SchemeIs(chrome::kExtensionResourceScheme)) {
Aaron Boodman 2012/04/16 18:54:36 Currently I don't think there are any cases where
Peng 2012/04/17 13:52:05 Done.
+ std::string message = base::StringPrintf(
+ "Denying load of %s. chrome-extension-resources:// can only be "
+ "loaded from extensions.",
resource_url.spec().c_str());
- frame->addMessageToConsole(
- WebKit::WebConsoleMessage(WebKit::WebConsoleMessage::LevelError,
- WebKit::WebString::fromUTF8(message)));
- return false;
+ frame->addMessageToConsole(
+ WebKit::WebConsoleMessage(WebKit::WebConsoleMessage::LevelError,
+ WebKit::WebString::fromUTF8(message)));
+ return false;
+ }
+ return true;
}
return true;

Powered by Google App Engine
This is Rietveld 408576698