Index: content/browser/renderer_host/render_view_host_impl.cc |
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc |
index 0b1f7c6d9c38cfc5bed0dd6d1148eb84827c7220..438431058a45399a0c7a70290aaf5761c19a8ae5 100644 |
--- a/content/browser/renderer_host/render_view_host_impl.cc |
+++ b/content/browser/renderer_host/render_view_host_impl.cc |
@@ -173,7 +173,7 @@ RenderViewHostImpl::RenderViewHostImpl( |
has_accessed_initial_document_(false), |
is_swapped_out_(swapped_out), |
is_subframe_(false), |
- main_frame_id_(-1), |
+ main_frame_routing_id_(main_frame_routing_id), |
run_modal_reply_msg_(NULL), |
run_modal_opener_id_(MSG_ROUTING_NONE), |
is_waiting_for_beforeunload_ack_(false), |
@@ -186,13 +186,6 @@ RenderViewHostImpl::RenderViewHostImpl( |
DCHECK(instance_.get()); |
CHECK(delegate_); // http://crbug.com/82827 |
- if (main_frame_routing_id == MSG_ROUTING_NONE) |
- main_frame_routing_id = GetProcess()->GetNextRoutingID(); |
- |
- main_render_frame_host_.reset( |
- new RenderFrameHostImpl(this, delegate_->GetFrameTree(), |
- main_frame_routing_id, is_swapped_out_)); |
- |
GetProcess()->EnableSendQueue(); |
if (!swapped_out) |
@@ -240,6 +233,19 @@ SiteInstance* RenderViewHostImpl::GetSiteInstance() const { |
return instance_.get(); |
} |
+void RenderViewHostImpl::RegisterFrameTreeNodeID(int64 frame_id, |
+ int64 frame_tree_node_id) { |
+ frame_id_map_[frame_id] = frame_tree_node_id; |
+} |
+ |
+bool RenderViewHostImpl::HasFrameTreeNodeID(int64 frame_id) const { |
+ return frame_id_map_.find(frame_id) != frame_id_map_.end(); |
+} |
+ |
+int64 RenderViewHostImpl::GetFrameTreeNodeID(int64 frame_id) { |
+ return frame_id_map_[frame_id]; |
+} |
+ |
bool RenderViewHostImpl::CreateRenderView( |
const string16& frame_name, |
int opener_route_id, |
@@ -272,7 +278,7 @@ bool RenderViewHostImpl::CreateRenderView( |
delegate_->GetRendererPrefs(GetProcess()->GetBrowserContext()); |
params.web_preferences = delegate_->GetWebkitPrefs(); |
params.view_id = GetRoutingID(); |
- params.main_frame_routing_id = main_render_frame_host()->routing_id(); |
+ params.main_frame_routing_id = main_frame_routing_id_; |
params.surface_id = surface_id(); |
params.session_storage_namespace_id = |
delegate_->GetSessionStorageNamespace(instance_)->id(); |
@@ -655,6 +661,25 @@ void RenderViewHostImpl::FirePageBeforeUnload(bool for_cross_site_transition) { |
} |
} |
+void RenderViewHostImpl::OnCrossSiteResponse( |
+ const GlobalRequestID& global_request_id, |
+ bool is_transfer, |
+ const std::vector<GURL>& transfer_url_chain, |
+ const Referrer& referrer, |
+ PageTransition page_transition, |
+ int64 frame_id) { |
+ FrameTreeNode* node = delegate_->GetFrameTree()->FindByID(frame_id); |
+ |
+ // TODO(creis): We should always be able to get the RFHM for a frame_id, |
+ // but today the frame_id is -1 for the main frame. |
+ RenderViewHostDelegate::RendererManagement* manager = node ? |
+ node->render_manager() : delegate_->GetRenderManager(); |
+ CHECK(manager); |
+ manager->OnCrossSiteResponse(this, global_request_id, is_transfer, |
+ transfer_url_chain, referrer, page_transition, |
+ frame_id); |
+} |
+ |
void RenderViewHostImpl::SwapOut() { |
// This will be set back to false in OnSwapOutACK, just before we replace |
// this RVH with the pending RVH. |
@@ -1244,7 +1269,8 @@ bool RenderViewHostImpl::OnMessageReceived(const IPC::Message& msg) { |
void RenderViewHostImpl::Init() { |
RenderWidgetHostImpl::Init(); |
- main_render_frame_host()->Init(); |
+ // TODO(creis): The caller of this should call Init on the RFH as well. |
+ //main_render_frame_host()->Init(); |
} |
void RenderViewHostImpl::Shutdown() { |
@@ -1354,7 +1380,7 @@ void RenderViewHostImpl::OnRenderProcessGone(int status, int exit_code) { |
static_cast<base::TerminationStatus>(status); |
// Reset state. |
- main_frame_id_ = -1; |
+ frame_id_map_.clear(); |
// Our base class RenderWidgetHost needs to reset some stuff. |
RendererExited(render_view_termination_status_, exit_code); |
@@ -1428,13 +1454,15 @@ void RenderViewHostImpl::OnNavigate(const IPC::Message& msg) { |
// Cache the main frame id, so we can use it for creating the frame tree |
// root node when needed. |
if (PageTransitionIsMainFrame(validated_params.transition)) { |
- if (main_frame_id_ == -1) { |
- main_frame_id_ = validated_params.frame_id; |
+ int frame_tree_node_id = |
+ delegate_->GetFrameTree()->root()->frame_tree_node_id(); |
+ if (!HasFrameTreeNodeID(validated_params.frame_id)) { |
+ RegisterFrameTreeNodeID(validated_params.frame_id, frame_tree_node_id); |
} else { |
// TODO(nasko): We plan to remove the usage of frame_id in navigation |
// and move to routing ids. This is in place to ensure that a |
// renderer is not misbehaving and sending us incorrect data. |
- DCHECK_EQ(main_frame_id_, validated_params.frame_id); |
+ DCHECK_EQ(frame_tree_node_id, validated_params.frame_id); |
} |
} |
RenderProcessHost* process = GetProcess(); |
@@ -1782,7 +1810,7 @@ void RenderViewHostImpl::OnShouldCloseACK( |
is_waiting_for_beforeunload_ack_ = false; |
RenderViewHostDelegate::RendererManagement* management_delegate = |
- delegate_->GetRendererManagementDelegate(); |
+ delegate_->GetRenderManager(); |
if (management_delegate) { |
base::TimeTicks before_unload_end_time; |
if (!send_should_close_start_time_.is_null() && |
@@ -2246,13 +2274,4 @@ bool RenderViewHostImpl::CanAccessFilesOfPageState( |
return true; |
} |
-void RenderViewHostImpl::AttachToFrameTree() { |
- FrameTree* frame_tree = delegate_->GetFrameTree(); |
- |
- frame_tree->SwapMainFrame(main_render_frame_host_.get()); |
- if (main_frame_id() != FrameTreeNode::kInvalidFrameId) { |
- frame_tree->OnFirstNavigationAfterSwap(main_frame_id()); |
- } |
-} |
- |
} // namespace content |