Index: chrome/browser/net/chrome_extensions_network_delegate.cc |
diff --git a/chrome/browser/net/chrome_extensions_network_delegate.cc b/chrome/browser/net/chrome_extensions_network_delegate.cc |
index 502585cf85702d08e4beb93c5eae6995d59d80d6..535f6d0e74036d698efcb631ea2d6d8286155552 100644 |
--- a/chrome/browser/net/chrome_extensions_network_delegate.cc |
+++ b/chrome/browser/net/chrome_extensions_network_delegate.cc |
@@ -21,6 +21,7 @@ |
#include "extensions/browser/info_map.h" |
#include "extensions/browser/process_manager.h" |
#include "extensions/common/constants.h" |
+#include "extensions/common/permissions/api_permission.h" |
#include "net/url_request/url_request.h" |
using content::BrowserThread; |
@@ -169,10 +170,20 @@ int ChromeExtensionsNetworkDelegateImpl::OnBeforeURLRequest( |
bool is_nested_url = url.SchemeIsFileSystem() || url.SchemeIsBlob(); |
bool is_navigation = |
info && content::IsResourceTypeFrame(info->GetResourceType()); |
+ url::Origin origin(url); |
if (is_nested_url && is_navigation && info->IsMainFrame() && |
- url::Origin(url).scheme() == extensions::kExtensionScheme && |
+ origin.scheme() == extensions::kExtensionScheme && |
!extension_info_map_->process_map().Contains(info->GetChildID())) { |
- return net::ERR_ABORTED; |
+ // Relax this restriction for apps that use <webview>. See |
+ // https://crbug.com/652077. |
+ const extensions::Extension* extension = |
+ extension_info_map_->extensions().GetByID(origin.host()); |
+ bool has_webview_permission = |
+ extension && |
+ extension->permissions_data()->HasAPIPermission( |
+ extensions::APIPermission::kWebView); |
+ if (!has_webview_permission) |
+ return net::ERR_ABORTED; |
} |
return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRequest( |