| 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 a1b6e73d4acca45a20cb1aa7a0b678bd3e0a695a..6ba54ceff8dbae7e6297620e53ec0825cca1fb4d 100644
|
| --- a/content/browser/frame_host/navigation_request.cc
|
| +++ b/content/browser/frame_host/navigation_request.cc
|
| @@ -583,9 +583,23 @@ void NavigationRequest::OnRequestFailed(bool has_stale_copy_in_cache,
|
| return;
|
| }
|
|
|
| - // Select an appropriate renderer to show the error page.
|
| - RenderFrameHostImpl* render_frame_host =
|
| - frame_tree_node_->render_manager()->GetFrameHostForNavigation(*this);
|
| + // 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.
|
| + RenderFrameHostImpl* render_frame_host = nullptr;
|
| + if (net_error == net::ERR_BLOCKED_BY_CLIENT) {
|
| + render_frame_host = frame_tree_node_->current_frame_host();
|
| + } else {
|
| + render_frame_host =
|
| + frame_tree_node_->render_manager()->GetFrameHostForNavigation(*this);
|
| + }
|
|
|
| // Don't ask the renderer to commit an URL if the browser will kill it when
|
| // it does.
|
|
|