| Index: chrome/browser/extensions/extension_protocols.cc
|
| diff --git a/chrome/browser/extensions/extension_protocols.cc b/chrome/browser/extensions/extension_protocols.cc
|
| index 7caa1708349d763d2c2093e5aeba5428cacb78c7..d88e04560771c821e3394955cd611deeee92794e 100644
|
| --- a/chrome/browser/extensions/extension_protocols.cc
|
| +++ b/chrome/browser/extensions/extension_protocols.cc
|
| @@ -77,13 +77,22 @@ static URLRequestJob* CreateExtensionURLRequestJob(URLRequest* request,
|
| const ResourceDispatcherHostRequestInfo* info =
|
| ResourceDispatcherHost::InfoForRequest(request);
|
|
|
| - // Don't allow extension resources to be loaded from origins which are not
|
| - // present in the extension's effective host permissions with the exception
|
| - // of empty origins and extension schemes.
|
| - if (!info->frame_origin().empty() &&
|
| - !GURL(info->frame_origin()).SchemeIs(chrome::kExtensionScheme)) {
|
| + // Extension resources should only be loadable from web pages which the
|
| + // extension has host permissions to (and therefore could be running script
|
| + // in, which might need access to the extension resources).
|
| + //
|
| + // chrome:// pages are exempt. We allow them to load any extension resource.
|
| + // This is used for, eg, the app launcher in the NTP.
|
| + //
|
| + // chrome-extension:// pages are also exempt, mostly for legacy reasons. Some
|
| + // extensions did this to integrate with each other before we added this code.
|
| + GURL origin_url(info->frame_origin());
|
| + if (!origin_url.is_empty() &&
|
| + !origin_url.SchemeIs(chrome::kChromeUIScheme) &&
|
| + !origin_url.SchemeIs(chrome::kExtensionScheme)) {
|
| ExtensionExtent host_permissions =
|
| - context->GetEffectiveHostPermissionsForExtension(request->url().host());
|
| + context->GetEffectiveHostPermissionsForExtension(
|
| + request->url().host());
|
| if (!host_permissions.ContainsURL(GURL(info->frame_origin())))
|
| return new URLRequestErrorJob(request, net::ERR_ADDRESS_UNREACHABLE);
|
| }
|
|
|