Chromium Code Reviews| 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; |