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; |