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

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

Issue 536143002: Do not create proxy hosts in the subtree of navigating frame. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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
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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 58
59 // Iterate over the FrameTree to reset any node affected by the loss of the 59 // Iterate over the FrameTree to reset any node affected by the loss of the
60 // given RenderViewHost's process. 60 // given RenderViewHost's process.
61 bool ResetNodesForNewProcess(RenderViewHost* render_view_host, 61 bool ResetNodesForNewProcess(RenderViewHost* render_view_host,
62 FrameTreeNode* node) { 62 FrameTreeNode* node) {
63 if (render_view_host == node->current_frame_host()->render_view_host()) 63 if (render_view_host == node->current_frame_host()->render_view_host())
64 node->ResetForNewProcess(); 64 node->ResetForNewProcess();
65 return true; 65 return true;
66 } 66 }
67 67
68 bool CreateProxyForSiteInstance(FrameTreeNode* source_node, 68 bool CreateProxyForSiteInstance(const scoped_refptr<SiteInstance>& instance,
69 const scoped_refptr<SiteInstance>& instance,
70 FrameTreeNode* node) { 69 FrameTreeNode* node) {
71 // Skip the node that initiated the creation.
72 if (source_node == node)
73 return true;
74
75 node->render_manager()->CreateRenderFrameProxy(instance.get()); 70 node->render_manager()->CreateRenderFrameProxy(instance.get());
76 return true; 71 return true;
77 } 72 }
78 73
79 } // namespace 74 } // namespace
80 75
81 FrameTree::FrameTree(Navigator* navigator, 76 FrameTree::FrameTree(Navigator* navigator,
82 RenderFrameHostDelegate* render_frame_delegate, 77 RenderFrameHostDelegate* render_frame_delegate,
83 RenderViewHostDelegate* render_view_delegate, 78 RenderViewHostDelegate* render_view_delegate,
84 RenderWidgetHostDelegate* render_widget_delegate, 79 RenderWidgetHostDelegate* render_widget_delegate,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 } 115 }
121 116
122 FrameTreeNode* FrameTree::FindByRoutingID(int routing_id, int process_id) { 117 FrameTreeNode* FrameTree::FindByRoutingID(int routing_id, int process_id) {
123 FrameTreeNode* node = NULL; 118 FrameTreeNode* node = NULL;
124 ForEach( 119 ForEach(
125 base::Bind(&FrameTreeNodeForRoutingId, routing_id, process_id, &node)); 120 base::Bind(&FrameTreeNodeForRoutingId, routing_id, process_id, &node));
126 return node; 121 return node;
127 } 122 }
128 123
129 void FrameTree::ForEach( 124 void FrameTree::ForEach(
130 const base::Callback<bool(FrameTreeNode*)>& on_node) const { 125 const base::Callback<bool(FrameTreeNode*)>& on_node) const {
awong 2014/09/03 21:58:38 Reimplement this in terms of your new function?
nasko 2014/09/03 23:50:19 Done.
131 std::queue<FrameTreeNode*> queue; 126 std::queue<FrameTreeNode*> queue;
132 queue.push(root_.get()); 127 queue.push(root_.get());
133 128
134 while (!queue.empty()) { 129 while (!queue.empty()) {
135 FrameTreeNode* node = queue.front(); 130 FrameTreeNode* node = queue.front();
136 queue.pop(); 131 queue.pop();
137 if (!on_node.Run(node)) 132 if (!on_node.Run(node))
138 break; 133 break;
139 134
140 for (size_t i = 0; i < node->child_count(); ++i) 135 for (size_t i = 0; i < node->child_count(); ++i)
141 queue.push(node->child_at(i)); 136 queue.push(node->child_at(i));
142 } 137 }
143 } 138 }
144 139
140 void FrameTree::ForEach(
141 const base::Callback<bool(FrameTreeNode*)>& on_node,
142 FrameTreeNode* skip_node) const {
143 std::queue<FrameTreeNode*> queue;
144 queue.push(root_.get());
145
146 while (!queue.empty()) {
147 FrameTreeNode* node = queue.front();
148 queue.pop();
149 if (skip_node == node)
150 continue;
151
152 if (!on_node.Run(node))
153 break;
154
155 for (size_t i = 0; i < node->child_count(); ++i)
156 queue.push(node->child_at(i));
157 }
158 }
159
145 RenderFrameHostImpl* FrameTree::AddFrame(FrameTreeNode* parent, 160 RenderFrameHostImpl* FrameTree::AddFrame(FrameTreeNode* parent,
146 int new_routing_id, 161 int new_routing_id,
147 const std::string& frame_name) { 162 const std::string& frame_name) {
148 scoped_ptr<FrameTreeNode> node(new FrameTreeNode( 163 scoped_ptr<FrameTreeNode> node(new FrameTreeNode(
149 this, parent->navigator(), render_frame_delegate_, render_view_delegate_, 164 this, parent->navigator(), render_frame_delegate_, render_view_delegate_,
150 render_widget_delegate_, manager_delegate_, frame_name)); 165 render_widget_delegate_, manager_delegate_, frame_name));
151 std::pair<FrameTreeNodeIDMap::iterator, bool> result = 166 std::pair<FrameTreeNodeIDMap::iterator, bool> result =
152 g_frame_tree_node_id_map.Get().insert( 167 g_frame_tree_node_id_map.Get().insert(
153 std::make_pair(node->frame_tree_node_id(), node.get())); 168 std::make_pair(node->frame_tree_node_id(), node.get()));
154 CHECK(result.second); 169 CHECK(result.second);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 if (!render_view_host) { 201 if (!render_view_host) {
187 root()->render_manager()->CreateRenderFrame(site_instance, 202 root()->render_manager()->CreateRenderFrame(site_instance,
188 MSG_ROUTING_NONE, 203 MSG_ROUTING_NONE,
189 true, 204 true,
190 false, 205 false,
191 true); 206 true);
192 } 207 }
193 } 208 }
194 209
195 scoped_refptr<SiteInstance> instance(site_instance); 210 scoped_refptr<SiteInstance> instance(site_instance);
196 ForEach(base::Bind(&CreateProxyForSiteInstance, source, instance)); 211
212 // When creating proxies in the FrameTree, it is in reponse to a node
awong 2014/09/03 21:58:38 "Proxies are created in the FrameTree in response
nasko 2014/09/03 23:50:19 Done.
213 // navigating to a new SiteInstance. Since that node's navigation will replace
awong 2014/09/03 21:58:38 "this nodes" -> |source|'s
nasko 2014/09/03 23:50:19 Done.
214 // the currently loaded document, the entire subtree under the node will be
awong 2014/09/03 21:58:38 the node -> |source|
nasko 2014/09/03 23:50:19 Done.
215 // removed.
216 ForEach(base::Bind(&CreateProxyForSiteInstance, instance), source);
197 } 217 }
198 218
199 void FrameTree::ResetForMainFrameSwap() { 219 void FrameTree::ResetForMainFrameSwap() {
200 root_->ResetForNewProcess(); 220 root_->ResetForNewProcess();
201 focused_frame_tree_node_id_ = -1; 221 focused_frame_tree_node_id_ = -1;
202 } 222 }
203 223
204 void FrameTree::RenderProcessGone(RenderViewHost* render_view_host) { 224 void FrameTree::RenderProcessGone(RenderViewHost* render_view_host) {
205 // Walk the full tree looking for nodes that may be affected. Once a frame 225 // Walk the full tree looking for nodes that may be affected. Once a frame
206 // crashes, all of its child FrameTreeNodes go away. 226 // crashes, all of its child FrameTreeNodes go away.
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 rvh->Shutdown(); 342 rvh->Shutdown();
323 render_view_host_pending_shutdown_map_.erase(multi_iter); 343 render_view_host_pending_shutdown_map_.erase(multi_iter);
324 } 344 }
325 break; 345 break;
326 } 346 }
327 CHECK(render_view_host_found); 347 CHECK(render_view_host_found);
328 } 348 }
329 } 349 }
330 350
331 } // namespace content 351 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698