Index: content/browser/frame_host/navigation_request.cc |
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc |
index 55eb1ee156e9d58516b5d4eafbb640d93c2d3119..786a0b5907588c28d7899ab7b9f2c232913f340e 100644 |
--- a/content/browser/frame_host/navigation_request.cc |
+++ b/content/browser/frame_host/navigation_request.cc |
@@ -634,18 +634,23 @@ void NavigationRequest::OnRequestFailed(bool has_stale_copy_in_cache, |
return; |
} |
- // There are two types of error pages that need to be handled differently. |
- // * Error pages resulting from blocking the request, because the original |
- // document wasn't even allowed to make the request. In such case, |
- // the error pages should be committed in the process of the original |
- // document, to avoid creating a process for the destination. |
- // * Error pages resulting from either network outage (no network, DNS |
- // error, etc) or similar cases, where the user can reasonably expect that |
- // a reload at a later point in time can be successful. Such error pages |
- // do belong to the process that will host the destination URL, as a |
- // reload will end up committing in that process anyway. |
+ // Decide whether to leave the error page in the original process. |
+ // * If this was a renderer-initiated navigation, and the request is blocked |
+ // because the initiating document wasn't allowed to make the request, |
+ // commit the error in the existing process. This is a strategy to to avoid |
+ // creating a process for the destination, which may belong to an origin |
+ // with a higher privilege level. |
+ // * Error pages resulting from errors like network outage, no network, or DNS |
+ // error can reasonably expect that a reload at a later point in time would |
+ // work. These should be allowed to transfer away from the current process: |
+ // they do belong to whichever process that will host the destination URL, |
+ // as a reload will end up committing in that process anyway. |
+ // * Error pages that arise during browser-initiated navigations to blocked |
+ // URLs should be allowed to transfer away from the current process, which |
+ // didn't request the navigation and may have a higher privilege level than |
+ // the blocked destination. |
RenderFrameHostImpl* render_frame_host = nullptr; |
- if (net_error == net::ERR_BLOCKED_BY_CLIENT) { |
+ if (net_error == net::ERR_BLOCKED_BY_CLIENT && !browser_initiated()) { |
render_frame_host = frame_tree_node_->current_frame_host(); |
} else { |
render_frame_host = |