Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(444)

Side by Side Diff: content/browser/frame_host/frame_tree.cc

Issue 156303004: With --site-per-process, avoid a crash when a subframe process goes away. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Disable on GTK, add test. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/frame_tree.h" 5 #include "content/browser/frame_host/frame_tree.h"
6 6
7 #include <queue> 7 #include <queue>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 25 matching lines...) Expand all
36 FrameTreeNode** out_node, 36 FrameTreeNode** out_node,
37 FrameTreeNode* node) { 37 FrameTreeNode* node) {
38 if (node->frame_id() == frame_id) { 38 if (node->frame_id() == frame_id) {
39 *out_node = node; 39 *out_node = node;
40 // Terminate iteration once the node has been found. 40 // Terminate iteration once the node has been found.
41 return false; 41 return false;
42 } 42 }
43 return true; 43 return true;
44 } 44 }
45 45
46 // Iterate over the FrameTree to reset any node affected by the loss of the
47 // given RenderViewHost's process.
48 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
49 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.
50 FrameTreeNode* node) {
51 if (render_view_host == node->current_frame_host()->render_view_host())
52 node->ResetForNewProcess();
53 return true;
54 }
55
46 } // namespace 56 } // namespace
47 57
48 FrameTree::FrameTree(Navigator* navigator, 58 FrameTree::FrameTree(Navigator* navigator,
49 RenderFrameHostDelegate* render_frame_delegate, 59 RenderFrameHostDelegate* render_frame_delegate,
50 RenderViewHostDelegate* render_view_delegate, 60 RenderViewHostDelegate* render_view_delegate,
51 RenderWidgetHostDelegate* render_widget_delegate, 61 RenderWidgetHostDelegate* render_widget_delegate,
52 RenderFrameHostManager::Delegate* manager_delegate) 62 RenderFrameHostManager::Delegate* manager_delegate)
53 : render_frame_delegate_(render_frame_delegate), 63 : render_frame_delegate_(render_frame_delegate),
54 render_view_delegate_(render_view_delegate), 64 render_view_delegate_(render_view_delegate),
55 render_widget_delegate_(render_widget_delegate), 65 render_widget_delegate_(render_widget_delegate),
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 156 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
147 // shutdown that might make this case possible? 157 // shutdown that might make this case possible?
148 if (!node) 158 if (!node)
149 return; 159 return;
150 160
151 if (node) 161 if (node)
152 node->set_current_url(url); 162 node->set_current_url(url);
153 } 163 }
154 164
155 void FrameTree::ResetForMainFrameSwap() { 165 void FrameTree::ResetForMainFrameSwap() {
156 return root_->ResetForMainFrameSwap(); 166 root_->ResetForNewProcess();
167 }
168
169 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
170 // Walk the full tree looking for nodes that may be affected. Once a frame
171 // crashes, all of its child FrameTreeNodes go away.
172 // 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.
173 // clears its children before we iterate over them. That's ok, because
174 // ForEach does not add a node's children to the queue until after visiting
175 // the node itself.
176 FrameTreeNode* node = NULL;
177 ForEach(base::Bind(&ResetNodesForNewProcess, render_view_host, &node));
157 } 178 }
158 179
159 RenderFrameHostImpl* FrameTree::GetMainFrame() const { 180 RenderFrameHostImpl* FrameTree::GetMainFrame() const {
160 return root_->current_frame_host(); 181 return root_->current_frame_host();
161 } 182 }
162 183
163 void FrameTree::SetFrameRemoveListener( 184 void FrameTree::SetFrameRemoveListener(
164 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) { 185 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) {
165 on_frame_removed_ = on_frame_removed; 186 on_frame_removed_ = on_frame_removed;
166 } 187 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 } 289 }
269 } 290 }
270 291
271 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { 292 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) {
272 FrameTreeNode* node = NULL; 293 FrameTreeNode* node = NULL;
273 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); 294 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node));
274 return node; 295 return node;
275 } 296 }
276 297
277 } // namespace content 298 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698