Index: content/browser/frame_host/frame_tree.cc |
diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc |
index c135da80d340fb2c3a90bdb3c57d138cc2fbfd91..e890b3e2e9223fc383af8be6af4fe145d1d529f6 100644 |
--- a/content/browser/frame_host/frame_tree.cc |
+++ b/content/browser/frame_host/frame_tree.cc |
@@ -43,6 +43,16 @@ bool FrameTreeNodeForFrameId(int64 frame_id, |
return true; |
} |
+// Iterate over the FrameTree to reset any node affected by the loss of the |
+// given RenderViewHost's process. |
+bool ResetNodesForNewProcess(RenderViewHost* render_view_host, |
nasko
2014/02/11 04:49:16
Shouldn't we be passing the process that is gone?
Charlie Reis
2014/02/12 00:27:57
I've added a TODO for that. For now, that just ad
|
+ FrameTreeNode** out_node, |
awong
2014/02/11 18:24:16
Why bother with out_node at all?
Charlie Reis
2014/02/12 00:27:57
base::Bind is magic. Done.
|
+ FrameTreeNode* node) { |
+ if (render_view_host == node->current_frame_host()->render_view_host()) |
+ node->ResetForNewProcess(); |
+ return true; |
+} |
+ |
} // namespace |
FrameTree::FrameTree(Navigator* navigator, |
@@ -153,7 +163,18 @@ void FrameTree::SetFrameUrl(int64 frame_id, const GURL& url) { |
} |
void FrameTree::ResetForMainFrameSwap() { |
- return root_->ResetForMainFrameSwap(); |
+ root_->ResetForNewProcess(); |
+} |
+ |
+void FrameTree::RenderProcessGone(RenderViewHost* render_view_host) { |
nasko
2014/02/11 04:49:16
Again, it will be better with RPH parameter.
Charlie Reis
2014/02/12 00:27:57
Then we're just calling RenderViewHostImpl::GetPro
|
+ // Walk the full tree looking for nodes that may be affected. Once a frame |
+ // crashes, all of its child FrameTreeNodes go away. |
+ // Note that the helper function may call ResetForNewProcess on a node, which |
nasko
2014/02/11 04:49:16
If we are now putting explicit dependency on this
Charlie Reis
2014/02/12 00:27:57
Done.
|
+ // clears its children before we iterate over them. That's ok, because |
+ // ForEach does not add a node's children to the queue until after visiting |
+ // the node itself. |
+ FrameTreeNode* node = NULL; |
+ ForEach(base::Bind(&ResetNodesForNewProcess, render_view_host, &node)); |
} |
RenderFrameHostImpl* FrameTree::GetMainFrame() const { |