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..0b3275a25ac1b7305c92fa418207391dc2fcadc0 100644 |
--- a/content/browser/frame_host/frame_tree.cc |
+++ b/content/browser/frame_host/frame_tree.cc |
@@ -43,6 +43,15 @@ 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, |
+ FrameTreeNode* node) { |
+ if (render_view_host == node->current_frame_host()->render_view_host()) |
+ node->ResetForNewProcess(); |
+ return true; |
+} |
+ |
} // namespace |
FrameTree::FrameTree(Navigator* navigator, |
@@ -153,7 +162,17 @@ void FrameTree::SetFrameUrl(int64 frame_id, const GURL& url) { |
} |
void FrameTree::ResetForMainFrameSwap() { |
- return root_->ResetForMainFrameSwap(); |
+ root_->ResetForNewProcess(); |
+} |
+ |
+void FrameTree::RenderProcessGone(RenderViewHost* render_view_host) { |
+ // 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 |
+ // 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. |
+ ForEach(base::Bind(&ResetNodesForNewProcess, render_view_host)); |
} |
RenderFrameHostImpl* FrameTree::GetMainFrame() const { |