Index: extensions/browser/url_request_util.cc |
diff --git a/extensions/browser/url_request_util.cc b/extensions/browser/url_request_util.cc |
index 1e44115bcb7c545ff28353e4785ae75006b309c7..126f69422e2c25e90c1ee590ce7fadb9f9afb7d4 100644 |
--- a/extensions/browser/url_request_util.cc |
+++ b/extensions/browser/url_request_util.cc |
@@ -7,6 +7,7 @@ |
#include <string> |
#include "content/public/browser/resource_request_info.h" |
+#include "content/public/common/browser_side_navigation_policy.h" |
#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" |
#include "extensions/browser/info_map.h" |
#include "extensions/common/extension.h" |
@@ -25,34 +26,31 @@ bool AllowCrossRendererResourceLoad(net::URLRequest* request, |
bool* allowed) { |
const content::ResourceRequestInfo* info = |
content::ResourceRequestInfo::ForRequest(request); |
- |
- // Extensions with webview: allow loading certain resources by guest renderers |
- // with privileged partition IDs as specified in owner's extension the |
- // manifest file. |
- std::string owner_extension_id; |
- int owner_process_id; |
- WebViewRendererState::GetInstance()->GetOwnerInfo( |
- info->GetChildID(), &owner_process_id, &owner_extension_id); |
- const Extension* owner_extension = |
- extension_info_map->extensions().GetByID(owner_extension_id); |
- std::string partition_id; |
- bool is_guest = WebViewRendererState::GetInstance()->GetPartitionID( |
- info->GetChildID(), &partition_id); |
std::string resource_path = request->url().path(); |
- // |owner_extension == extension| needs to be checked because extension |
- // resources should only be accessible to WebViews owned by that extension. |
- if (is_guest && owner_extension == extension && |
- WebviewInfo::IsResourceWebviewAccessible(extension, partition_id, |
- resource_path)) { |
- *allowed = true; |
- return true; |
- } |
- |
- if (is_guest && |
- !ui::PageTransitionIsWebTriggerable(info->GetPageTransition())) { |
- *allowed = false; |
- return true; |
+ // PlzNavigate: this logic is performed for main frame requests in |
+ // ExtensionNavigationThrottle::WillStartRequest. |
+ if (info->GetChildID() != -1 || |
+ info->GetResourceType() != content::RESOURCE_TYPE_MAIN_FRAME || |
+ !content::IsBrowserSideNavigationEnabled()) { |
+ // Extensions with webview: allow loading certain resources by guest |
+ // renderers with privileged partition IDs as specified in owner's extension |
+ // the manifest file. |
+ std::string owner_extension_id; |
+ int owner_process_id; |
+ WebViewRendererState::GetInstance()->GetOwnerInfo( |
+ info->GetChildID(), &owner_process_id, &owner_extension_id); |
+ const Extension* owner_extension = |
+ extension_info_map->extensions().GetByID(owner_extension_id); |
+ std::string partition_id; |
+ bool is_guest = WebViewRendererState::GetInstance()->GetPartitionID( |
+ info->GetChildID(), &partition_id); |
+ |
+ if (AllowCrossRendererResourceLoadHelper( |
+ is_guest, extension, owner_extension, partition_id, resource_path, |
+ info->GetPageTransition(), allowed)) { |
+ return true; |
+ } |
} |
// The following checks require that we have an actual extension object. If we |
@@ -137,5 +135,29 @@ bool IsWebViewRequest(const net::URLRequest* request) { |
return WebViewRendererState::GetInstance()->IsGuest(info->GetChildID()); |
} |
+bool AllowCrossRendererResourceLoadHelper(bool is_guest, |
+ const Extension* extension, |
+ const Extension* owner_extension, |
+ const std::string& partition_id, |
+ const std::string& resource_path, |
+ ui::PageTransition page_transition, |
+ bool* allowed) { |
+ // |owner_extension == extension| needs to be checked because extension |
+ // resources should only be accessible to WebViews owned by that extension. |
+ if (is_guest && owner_extension == extension && |
+ WebviewInfo::IsResourceWebviewAccessible(extension, partition_id, |
+ resource_path)) { |
+ *allowed = true; |
+ return true; |
+ } |
+ |
+ if (is_guest && !ui::PageTransitionIsWebTriggerable(page_transition)) { |
+ *allowed = false; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
} // namespace url_request_util |
} // namespace extensions |