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 7577b59faa4e3ac31484e737f3c78d517c6b0634..24ebd296908ec4c6ee93a45395047b3b5bd2fe81 100644 |
--- a/content/browser/renderer_host/render_view_host_impl.cc |
+++ b/content/browser/renderer_host/render_view_host_impl.cc |
@@ -198,7 +198,6 @@ 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), |
@@ -225,6 +224,9 @@ RenderViewHostImpl::RenderViewHostImpl( |
base::Unretained(ResourceDispatcherHostImpl::Get()), |
GetProcess()->GetID(), GetRoutingID())); |
} |
+ LOG(INFO) << "NEW RVH: process " << GetProcess()->GetID() << |
+ ", route " << GetRoutingID() << ", SID " << |
+ instance_->GetId() << ", site " << instance_->GetSiteURL(); |
#if defined(OS_ANDROID) |
media_player_manager_.reset(BrowserMediaPlayerManager::Create(this)); |
@@ -232,6 +234,8 @@ RenderViewHostImpl::RenderViewHostImpl( |
} |
RenderViewHostImpl::~RenderViewHostImpl() { |
+ LOG(INFO) << "DELETE RVH: process " << GetProcess()->GetID() << |
+ ", route " << GetRoutingID() << ", SID " << instance_->GetId(); |
if (ResourceDispatcherHostImpl::Get()) { |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
@@ -260,6 +264,34 @@ SiteInstance* RenderViewHostImpl::GetSiteInstance() const { |
return instance_.get(); |
} |
+void RenderViewHostImpl::RegisterFrameID(int64 frame_id, |
+ int64 frame_tree_node_id) { |
+ frame_id_map_[frame_id] = frame_tree_node_id; |
+} |
+ |
+void RenderViewHostImpl::UnregisterFrameID(int64 frame_id) { |
+ CHECK(HasFrameID(frame_id)); |
+ frame_id_map_.erase(frame_id); |
+} |
+ |
+bool RenderViewHostImpl::HasFrameID(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]; |
+} |
+ |
+int64 RenderViewHostImpl::GetFrameIDForTesting(int64 frame_tree_node_id) const { |
+ for (FrameIDMap::const_iterator iter = frame_id_map_.begin(); |
+ iter != frame_id_map_.end(); |
+ iter++) { |
+ if (iter->second == frame_tree_node_id) |
+ return iter->first; |
+ } |
+ return -1; |
+} |
+ |
bool RenderViewHostImpl::CreateRenderView( |
const base::string16& frame_name, |
int opener_route_id, |
@@ -702,8 +734,18 @@ void RenderViewHostImpl::OnCrossSiteResponse( |
PageTransition page_transition, |
int64 frame_id, |
bool should_replace_current_entry) { |
- RenderViewHostDelegate::RendererManagement* manager = |
- delegate_->GetRendererManagementDelegate(); |
+ FrameTreeNode* node = NULL; |
+ if (frame_id != -1) { |
+ CHECK(HasFrameID(frame_id)); |
+ int64 frame_tree_node_id = GetFrameTreeNodeID(frame_id); |
+ node = delegate_->GetFrameTree()->FindByID(frame_tree_node_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_->GetRendererManagementDelegate(); |
+ CHECK(manager); |
if (manager) { |
manager->OnCrossSiteResponse(this, global_request_id, is_transfer, |
transfer_url_chain, referrer, page_transition, |
@@ -1415,8 +1457,8 @@ void RenderViewHostImpl::OnRenderProcessGone(int status, int exit_code) { |
// Reset frame tree state. |
// TODO(creis): Once subframes can be in different processes, we'll need to |
// clear just the FrameTreeNodes affected by the crash (and their subtrees). |
- main_frame_id_ = -1; |
delegate_->GetFrameTree()->ResetForMainFrameSwap(); |
+ frame_id_map_.clear(); |
// Our base class RenderWidgetHost needs to reset some stuff. |
RendererExited(render_view_termination_status_, exit_code); |
@@ -1489,13 +1531,16 @@ 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 (!HasFrameID(validated_params.frame_id)) { |
+ RegisterFrameID(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, |
+ GetFrameTreeNodeID(validated_params.frame_id)); |
} |
} |
RenderProcessHost* process = GetProcess(); |
@@ -2320,11 +2365,7 @@ bool RenderViewHostImpl::CanAccessFilesOfPageState( |
void RenderViewHostImpl::AttachToFrameTree() { |
FrameTree* frame_tree = delegate_->GetFrameTree(); |
- |
frame_tree->ResetForMainFrameSwap(); |
- if (main_frame_id() != FrameTreeNode::kInvalidFrameId) { |
- frame_tree->OnFirstNavigationAfterSwap(main_frame_id()); |
- } |
} |
} // namespace content |