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 3097a542bd49760ac3a8314f52d54bf62a3ad0f3..fd59de25c324c7bebe2e9f46604ce172cc70f7e5 100644 |
--- a/content/browser/frame_host/navigator_impl.cc |
+++ b/content/browser/frame_host/navigator_impl.cc |
@@ -367,7 +367,8 @@ |
// need to care about it anymore. |
if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)) { |
- render_frame_host->frame_tree_node()->ResetNavigationRequest(true); |
+ navigation_request_map_.erase( |
+ render_frame_host->frame_tree_node()->frame_tree_node_id()); |
} |
FrameHostMsg_DidCommitProvisionalLoad_Params params(input_params); |
@@ -614,7 +615,8 @@ |
switches::kEnableBrowserSideNavigation)); |
DCHECK(frame_tree_node); |
- NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
+ NavigationRequest* navigation_request = |
+ navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); |
// The NavigationRequest may have been canceled while the renderer was |
// executing the BeforeUnload event. |
@@ -642,7 +644,7 @@ |
DCHECK(frame_tree_node); |
NavigationRequest* ongoing_navigation_request = |
- frame_tree_node->navigation_request(); |
+ navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); |
// The renderer-initiated navigation request is ignored iff a) there is an |
// ongoing request b) which is browser or user-initiated and c) the renderer |
@@ -655,13 +657,17 @@ |
} |
// In all other cases the current navigation, if any, is canceled and a new |
- // NavigationRequest is created for the node. |
+ // NavigationRequest is created and stored in the map. |
+ if (ongoing_navigation_request) |
+ CancelNavigation(frame_tree_node); |
+ |
scoped_ptr<NavigationRequest> navigation_request = |
NavigationRequest::CreateRendererInitiated( |
frame_tree_node, common_params, begin_params, body, |
controller_->GetLastCommittedEntryIndex(), |
controller_->GetEntryCount()); |
- frame_tree_node->SetNavigationRequest(navigation_request.Pass()); |
+ navigation_request_map_.set( |
+ frame_tree_node->frame_tree_node_id(), navigation_request.Pass()); |
if (frame_tree_node->IsMainFrame()) |
navigation_data_.reset(); |
@@ -676,7 +682,8 @@ |
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)); |
- NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
+ NavigationRequest* navigation_request = |
+ navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); |
DCHECK(navigation_request); |
DCHECK(response || |
!NavigationRequest::ShouldMakeNetworkRequest( |
@@ -722,7 +729,8 @@ |
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)); |
- NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
+ NavigationRequest* navigation_request = |
+ navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); |
DCHECK(navigation_request); |
// Select an appropriate renderer to show the error page. |
@@ -741,16 +749,26 @@ |
void NavigatorImpl::CancelNavigation(FrameTreeNode* frame_tree_node) { |
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)); |
- frame_tree_node->ResetNavigationRequest(false); |
+ navigation_request_map_.erase(frame_tree_node->frame_tree_node_id()); |
if (frame_tree_node->IsMainFrame()) |
navigation_data_.reset(); |
+ // TODO(carlosk): move this cleanup into the NavigationRequest destructor once |
+ // we properly cancel ongoing navigations. |
+ frame_tree_node->render_manager()->CleanUpNavigation(); |
+} |
+ |
+// PlzNavigate |
+NavigationRequest* NavigatorImpl::GetNavigationRequestForNodeForTesting( |
+ FrameTreeNode* frame_tree_node) { |
+ return navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); |
} |
bool NavigatorImpl::IsWaitingForBeforeUnloadACK( |
FrameTreeNode* frame_tree_node) { |
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)); |
- NavigationRequest* request = frame_tree_node->navigation_request(); |
+ NavigationRequest* request = |
+ navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); |
if (!request) |
return false; |
return request->state() == NavigationRequest::WAITING_FOR_RENDERER_RESPONSE; |
@@ -803,23 +821,36 @@ |
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)); |
DCHECK(frame_tree_node); |
+ int64 frame_tree_node_id = frame_tree_node->frame_tree_node_id(); |
FrameMsg_Navigate_Type::Value navigation_type = |
GetNavigationType(controller_->GetBrowserContext(), entry, reload_type); |
scoped_ptr<NavigationRequest> navigation_request = |
NavigationRequest::CreateBrowserInitiated(frame_tree_node, entry, |
navigation_type, |
navigation_start, controller_); |
- frame_tree_node->SetNavigationRequest(navigation_request.Pass()); |
+ // TODO(clamy): Check if navigations are blocked and if so store the |
+ // parameters. |
+ |
+ // If there is an ongoing request, cancel and replace it. |
+ NavigationRequest* ongoing_request = |
+ navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); |
+ if (ongoing_request) |
+ CancelNavigation(frame_tree_node); |
+ |
+ navigation_request_map_.set(frame_tree_node_id, navigation_request.Pass()); |
// 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. |
- frame_tree_node->navigation_request()->SetWaitingForRendererResponse(); |
+ NavigationRequest* request_to_send = |
+ navigation_request_map_.get(frame_tree_node_id); |
+ request_to_send->SetWaitingForRendererResponse(); |
frame_tree_node->current_frame_host()->DispatchBeforeUnload(true); |
} |
void NavigatorImpl::BeginNavigation(FrameTreeNode* frame_tree_node) { |
- NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
+ NavigationRequest* navigation_request = |
+ navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); |
// A browser-initiated navigation could have been cancelled while it was |
// waiting for the BeforeUnload event to execute. |