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..d065bba08d575c21b2a6b4e3ce67f69e4ded3622 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."; |
| + 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)) { |
| + GURL frame_url = frame->document().url(); |
| + GURL page_url = frame->top()->document().url(); |
|
abarth-chromium
2012/04/13 17:11:24
It looks like the page_url variable is unused. Pe
Peng
2012/04/17 13:52:05
Done.
|
| + 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; |