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..7957fd119a4ef9088e808fdc4c02c3616c6c3943 100644 |
--- a/chrome/renderer/extensions/extension_resource_request_policy.cc |
+++ b/chrome/renderer/extensions/extension_resource_request_policy.cc |
@@ -22,55 +22,76 @@ 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."; |
miket_OOO
2012/04/12 18:38:39
I don't think the wrapping << is necessary.
Peng
2012/04/12 20:13:22
Done.
|
+ 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 which are not explicitely listed |
miket_OOO
2012/04/12 18:38:39
"explicitly"
"which" should be "that"
Peng
2012/04/12 20:13:22
Done.
|
+ // 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 interop) |
miket_OOO
2012/04/12 18:38:39
"interoperate" (avoid abbreviations)
Peng
2012/04/12 20:13:22
Done.
|
+ // - 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( |
miket_OOO
2012/04/12 18:38:39
This error message should go in the strings file f
Peng
2012/04/12 20:13:22
The message will go to javascript console for deve
|
+ "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)) { |
+ GURL frame_url = frame->document().url(); |
+ GURL page_url = frame->top()->document().url(); |
+ if (!frame_url.is_empty() && |
+ !frame_url.SchemeIs(chrome::kExtensionScheme) && |
+ !frame_url.SchemeIs(chrome::kExtensionResourceScheme)) { |
+ 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; |