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

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

Issue 106963004: Make RenderFrameHostManager swap RenderFrameHosts, not RenderViewHosts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test failures Created 7 years 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"
11 #include "content/browser/frame_host/frame_tree_node.h" 11 #include "content/browser/frame_host/frame_tree_node.h"
12 #include "content/browser/frame_host/navigator.h" 12 #include "content/browser/frame_host/navigator.h"
13 #include "content/browser/frame_host/render_frame_host_factory.h" 13 #include "content/browser/frame_host/render_frame_host_factory.h"
14 #include "content/browser/frame_host/render_frame_host_impl.h" 14 #include "content/browser/frame_host/render_frame_host_impl.h"
15 #include "content/browser/renderer_host/render_view_host_factory.h"
16 #include "content/browser/renderer_host/render_view_host_impl.h"
15 17
16 namespace content { 18 namespace content {
17 19
18 namespace { 20 namespace {
19 // Used with FrameTree::ForEach() to search for the FrameTreeNode 21 // Used with FrameTree::ForEach() to search for the FrameTreeNode
20 // corresponding to |frame_tree_node_id|. 22 // corresponding to |frame_tree_node_id|.
21 bool FrameTreeNodeForId(int64 frame_tree_node_id, 23 bool FrameTreeNodeForId(int64 frame_tree_node_id,
22 FrameTreeNode** out_node, 24 FrameTreeNode** out_node,
23 FrameTreeNode* node) { 25 FrameTreeNode* node) {
24 if (node->frame_tree_node_id() == frame_tree_node_id) { 26 if (node->frame_tree_node_id() == frame_tree_node_id) {
(...skipping 20 matching lines...) Expand all
45 47
46 FrameTree::FrameTree(Navigator* navigator, 48 FrameTree::FrameTree(Navigator* navigator,
47 RenderFrameHostDelegate* render_frame_delegate, 49 RenderFrameHostDelegate* render_frame_delegate,
48 RenderViewHostDelegate* render_view_delegate, 50 RenderViewHostDelegate* render_view_delegate,
49 RenderWidgetHostDelegate* render_widget_delegate, 51 RenderWidgetHostDelegate* render_widget_delegate,
50 RenderFrameHostManager::Delegate* manager_delegate) 52 RenderFrameHostManager::Delegate* manager_delegate)
51 : render_frame_delegate_(render_frame_delegate), 53 : render_frame_delegate_(render_frame_delegate),
52 render_view_delegate_(render_view_delegate), 54 render_view_delegate_(render_view_delegate),
53 render_widget_delegate_(render_widget_delegate), 55 render_widget_delegate_(render_widget_delegate),
54 manager_delegate_(manager_delegate), 56 manager_delegate_(manager_delegate),
55 root_(new FrameTreeNode(navigator, 57 root_(new FrameTreeNode(this,
58 navigator,
56 render_frame_delegate, 59 render_frame_delegate,
57 render_view_delegate, 60 render_view_delegate,
58 render_widget_delegate, 61 render_widget_delegate,
59 manager_delegate, 62 manager_delegate,
60 FrameTreeNode::kInvalidFrameId, 63 FrameTreeNode::kInvalidFrameId,
61 std::string())) { 64 std::string())) {
62 } 65 }
63 66
64 FrameTree::~FrameTree() { 67 FrameTree::~FrameTree() {
65 } 68 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 int64 parent_frame_id, 101 int64 parent_frame_id,
99 int64 frame_id, 102 int64 frame_id,
100 const std::string& frame_name) { 103 const std::string& frame_name) {
101 FrameTreeNode* parent = FindByFrameID(parent_frame_id); 104 FrameTreeNode* parent = FindByFrameID(parent_frame_id);
102 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 105 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
103 // shutdown that might make this case possible? 106 // shutdown that might make this case possible?
104 if (!parent) 107 if (!parent)
105 return NULL; 108 return NULL;
106 109
107 scoped_ptr<FrameTreeNode> node(CreateNode( 110 scoped_ptr<FrameTreeNode> node(CreateNode(
108 frame_id, frame_name, render_frame_host_id, parent)); 111 frame_id, frame_name, parent->navigator()));
109 RenderFrameHostImpl* render_frame = node->render_frame_host(); 112 RenderFrameHostImpl* render_frame = node->current_render_frame_host();
110 parent->AddChild(node.Pass()); 113 parent->AddChild(node.Pass(), render_frame_host_id);
nasko 2013/12/13 22:20:11 nit: Let's rename this to frame_routing_id, so it
Charlie Reis 2013/12/16 16:13:55 Done.
111 return render_frame; 114 return render_frame;
112 } 115 }
113 116
114 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host, 117 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host,
115 int64 parent_frame_id, 118 int64 parent_frame_id,
116 int64 frame_id) { 119 int64 frame_id) {
117 // If switches::kSitePerProcess is not specified, then the FrameTree only 120 // If switches::kSitePerProcess is not specified, then the FrameTree only
118 // contains a node for the root element. However, even in this case 121 // contains a node for the root element. However, even in this case
119 // frame detachments need to be broadcast outwards. 122 // frame detachments need to be broadcast outwards.
120 // 123 //
(...skipping 19 matching lines...) Expand all
140 FrameTreeNode* node = FindByFrameID(frame_id); 143 FrameTreeNode* node = FindByFrameID(frame_id);
141 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 144 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
142 // shutdown that might make this case possible? 145 // shutdown that might make this case possible?
143 if (!node) 146 if (!node)
144 return; 147 return;
145 148
146 if (node) 149 if (node)
147 node->set_current_url(url); 150 node->set_current_url(url);
148 } 151 }
149 152
150 void FrameTree::SwapMainFrame(RenderFrameHostImpl* render_frame_host) { 153 void FrameTree::ResetForMainFrameSwap() {
151 return root_->ResetForMainFrame(render_frame_host); 154 return root_->ResetForMainFrameSwap();
152 } 155 }
153 156
154 RenderFrameHostImpl* FrameTree::GetMainFrame() const { 157 RenderFrameHostImpl* FrameTree::GetMainFrame() const {
155 return root_->render_frame_host(); 158 return root_->current_render_frame_host();
156 } 159 }
157 160
158 void FrameTree::SetFrameRemoveListener( 161 void FrameTree::SetFrameRemoveListener(
159 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) { 162 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) {
160 on_frame_removed_ = on_frame_removed; 163 on_frame_removed_ = on_frame_removed;
161 } 164 }
162 165
166 RenderViewHostImpl* FrameTree::CreateRenderViewHostForMainFrame(
167 SiteInstance* site_instance,
168 int routing_id,
169 int main_frame_routing_id,
170 bool swapped_out,
171 bool hidden) {
172 DCHECK(main_frame_routing_id != MSG_ROUTING_NONE);
173 RenderViewHostMap::iterator iter =
174 render_view_host_map_.find(site_instance->GetId());
175 CHECK(iter == render_view_host_map_.end());
176 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
177 RenderViewHostFactory::Create(site_instance,
178 render_view_delegate_,
179 render_widget_delegate_,
180 routing_id,
181 main_frame_routing_id,
182 swapped_out,
183 hidden));
184
185 render_view_host_map_[site_instance->GetId()] =
186 RenderViewHostRefCount(rvh, 0);
187 return rvh;
188 }
189
190 RenderViewHostImpl* FrameTree::GetRenderViewHostForSubFrame(
191 SiteInstance* site_instance) {
192 RenderViewHostMap::iterator iter =
193 render_view_host_map_.find(site_instance->GetId());
194 CHECK(iter != render_view_host_map_.end());
195 RenderViewHostRefCount rvh_refcount = iter->second;
196 return rvh_refcount.first;
197 }
198
199 void FrameTree::RegisterRenderFrameHost(
200 RenderFrameHostImpl* render_frame_host) {
201 SiteInstance* site_instance =
202 render_frame_host->render_view_host()->GetSiteInstance();
203 RenderViewHostMap::iterator iter =
204 render_view_host_map_.find(site_instance->GetId());
205 CHECK(iter != render_view_host_map_.end());
206
207 // Increment the refcount.
208 CHECK_GE(iter->second.second, 0);
209 iter->second.second++;
210 }
211
212 void FrameTree::UnregisterRenderFrameHost(
213 RenderFrameHostImpl* render_frame_host) {
214 SiteInstance* site_instance =
215 render_frame_host->render_view_host()->GetSiteInstance();
216 RenderViewHostMap::iterator iter =
217 render_view_host_map_.find(site_instance->GetId());
218 CHECK(iter != render_view_host_map_.end());
219
220 // Decrement the refcount and shutdown the RenderViewHost if no one else is
221 // using it.
222 CHECK_GT(iter->second.second, 0);
223 iter->second.second--;
224 if (iter->second.second == 0) {
225 iter->second.first->Shutdown();
226 render_view_host_map_.erase(iter);
227 }
228 }
229
163 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { 230 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) {
164 FrameTreeNode* node = NULL; 231 FrameTreeNode* node = NULL;
165 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); 232 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node));
166 return node; 233 return node;
167 } 234 }
168 235
169 scoped_ptr<FrameTreeNode> FrameTree::CreateNode( 236 scoped_ptr<FrameTreeNode> FrameTree::CreateNode(
nasko 2013/12/13 22:20:11 It seems we only call this from one place and it o
Charlie Reis 2013/12/16 16:13:55 Good point! Done.
170 int64 frame_id, 237 int64 frame_id,
171 const std::string& frame_name, 238 const std::string& frame_name,
172 int render_frame_host_id, 239 Navigator* navigator) {
173 FrameTreeNode* parent_node) {
174 scoped_ptr<FrameTreeNode> frame_tree_node(new FrameTreeNode( 240 scoped_ptr<FrameTreeNode> frame_tree_node(new FrameTreeNode(
175 parent_node->navigator(), render_frame_delegate_, render_view_delegate_, 241 this, navigator, render_frame_delegate_, render_view_delegate_,
176 render_widget_delegate_, manager_delegate_, frame_id, frame_name)); 242 render_widget_delegate_, manager_delegate_, frame_id, frame_name));
177
178 scoped_ptr<RenderFrameHostImpl> render_frame_host(
179 RenderFrameHostFactory::Create(
180 parent_node->render_frame_host()->render_view_host(),
181 parent_node->render_frame_host()->delegate(),
182 this,
183 frame_tree_node.get(),
184 render_frame_host_id,
185 false));
186
187 frame_tree_node->set_render_frame_host(render_frame_host.release(), true);
188 return frame_tree_node.Pass(); 243 return frame_tree_node.Pass();
189 } 244 }
190 245
191 } // namespace content 246 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698