Index: content/browser/frame_host/navigator_impl.cc |
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc |
index aff92459639e88b0a6b77752b4de2b3ae1ea43d8..a65266127f44add0f69ac6c3b46a0be02a3a3219 100644 |
--- a/content/browser/frame_host/navigator_impl.cc |
+++ b/content/browser/frame_host/navigator_impl.cc |
@@ -600,8 +600,9 @@ void NavigatorImpl::OnBeforeUnloadACK(FrameTreeNode* frame_tree_node, |
DCHECK_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, |
navigation_request->state()); |
+ // If the navigation is allowed to proceed, send the request to the IO thread. |
if (proceed) |
- BeginNavigation(frame_tree_node); |
+ navigation_request->BeginNavigation(); |
else |
CancelNavigation(frame_tree_node); |
} |
@@ -655,7 +656,7 @@ void NavigatorImpl::OnBeginNavigation( |
navigation_data_.reset(); |
} |
- BeginNavigation(frame_tree_node); |
+ frame_tree_node->navigation_request()->BeginNavigation(); |
} |
// PlzNavigate |
@@ -805,40 +806,27 @@ void NavigatorImpl::RequestNavigation( |
DCHECK(frame_tree_node); |
FrameMsg_Navigate_Type::Value navigation_type = |
GetNavigationType(controller_->GetBrowserContext(), entry, reload_type); |
clamy
2015/06/09 16:01:29
Please add a comment that the value needs to be co
carlosk
2015/06/10 11:53:08
Done.
|
- scoped_ptr<NavigationRequest> navigation_request = |
+ bool should_dispatch_beforeunload = |
+ frame_tree_node->current_frame_host()->ShouldDispatchBeforeUnload(); |
+ frame_tree_node->SetNavigationRequest( |
NavigationRequest::CreateBrowserInitiated(frame_tree_node, entry, |
navigation_type, |
- navigation_start, controller_); |
- frame_tree_node->SetNavigationRequest(navigation_request.Pass()); |
- frame_tree_node->navigation_request()->SetWaitingForRendererResponse(); |
+ navigation_start, controller_)); |
+ NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
// Have the current renderer execute its beforeUnload event if needed. If it |
- // is not needed (eg. the renderer is not live), BeginNavigation should get |
- // called. If the navigation is synchronous and same-site, then it can be sent |
- // directly to the renderer (currently this is the case for navigations that |
- // do not make network requests such as data urls or Javascript urls). |
- if (NavigationRequest::ShouldMakeNetworkRequest( |
- frame_tree_node->navigation_request()->common_params().url)) { |
+ // is not needed (eg. the renderer is not live), |
+ // NavigationRequest::BeginNavigation should get called. If the navigation is |
+ // synchronous and same-site, then it can be sent directly to the current |
+ // renderer (currently this is the case for navigations that do not make |
+ // network requests such as data urls or Javascript urls). |
+ if (should_dispatch_beforeunload && |
+ NavigationRequest::ShouldMakeNetworkRequest( |
+ navigation_request->common_params().url)) { |
+ navigation_request->SetWaitingForRendererResponse(); |
frame_tree_node->current_frame_host()->DispatchBeforeUnload(true); |
} else { |
- BeginNavigation(frame_tree_node); |
- } |
-} |
- |
-void NavigatorImpl::BeginNavigation(FrameTreeNode* frame_tree_node) { |
- NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
- |
- // A browser-initiated navigation could have been cancelled while it was |
- // waiting for the BeforeUnload event to execute. |
- if (!navigation_request) |
- return; |
- |
- // Start the request. |
- if (navigation_request->BeginNavigation()) { |
- // If the request was sent to the IO thread, notify the |
- // RenderFrameHostManager so it can speculatively create a RenderFrameHost |
- // (and potentially a new renderer process) in parallel. |
- frame_tree_node->render_manager()->BeginNavigation(*navigation_request); |
+ navigation_request->BeginNavigation(); |
} |
} |