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

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: Rebase 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 int64 parent_frame_id, 100 int64 parent_frame_id,
99 int64 frame_id, 101 int64 frame_id,
100 const std::string& frame_name) { 102 const std::string& frame_name) {
101 FrameTreeNode* parent = FindByFrameID(parent_frame_id); 103 FrameTreeNode* parent = FindByFrameID(parent_frame_id);
102 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 104 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
103 // shutdown that might make this case possible? 105 // shutdown that might make this case possible?
104 if (!parent) 106 if (!parent)
105 return NULL; 107 return NULL;
106 108
107 scoped_ptr<FrameTreeNode> node(CreateNode( 109 scoped_ptr<FrameTreeNode> node(CreateNode(
108 frame_id, frame_name, render_frame_host_id, parent)); 110 frame_id, frame_name, parent->navigator()));
109 RenderFrameHostImpl* render_frame = node->render_frame_host(); 111 RenderFrameHostImpl* render_frame = node->current_render_frame_host();
110 parent->AddChild(node.Pass()); 112 parent->AddChild(node.Pass(), render_frame_host_id);
111 return render_frame; 113 return render_frame;
112 } 114 }
113 115
114 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host, 116 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host,
115 int64 parent_frame_id, 117 int64 parent_frame_id,
116 int64 frame_id) { 118 int64 frame_id) {
117 // If switches::kSitePerProcess is not specified, then the FrameTree only 119 // If switches::kSitePerProcess is not specified, then the FrameTree only
118 // contains a node for the root element. However, even in this case 120 // contains a node for the root element. However, even in this case
119 // frame detachments need to be broadcast outwards. 121 // frame detachments need to be broadcast outwards.
120 // 122 //
(...skipping 19 matching lines...) Expand all
140 FrameTreeNode* node = FindByFrameID(frame_id); 142 FrameTreeNode* node = FindByFrameID(frame_id);
141 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 143 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
142 // shutdown that might make this case possible? 144 // shutdown that might make this case possible?
143 if (!node) 145 if (!node)
144 return; 146 return;
145 147
146 if (node) 148 if (node)
147 node->set_current_url(url); 149 node->set_current_url(url);
148 } 150 }
149 151
150 void FrameTree::SwapMainFrame(RenderFrameHostImpl* render_frame_host) { 152 void FrameTree::ResetForMainFrameSwap() {
151 return root_->ResetForMainFrame(render_frame_host); 153 return root_->ResetForMainFrameSwap();
152 } 154 }
153 155
154 RenderFrameHostImpl* FrameTree::GetMainFrame() const { 156 RenderFrameHostImpl* FrameTree::GetMainFrame() const {
155 return root_->render_frame_host(); 157 return root_->current_render_frame_host();
156 } 158 }
157 159
158 void FrameTree::SetFrameRemoveListener( 160 void FrameTree::SetFrameRemoveListener(
159 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) { 161 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) {
160 on_frame_removed_ = on_frame_removed; 162 on_frame_removed_ = on_frame_removed;
161 } 163 }
162 164
165 RenderViewHostImpl* FrameTree::GetRenderViewHostForNewFrame(
166 SiteInstance* site_instance,
167 int routing_id,
168 int main_frame_routing_id,
169 bool swapped_out,
170 bool hidden) {
171 RenderViewHostMap::iterator iter =
172 render_view_host_map_.find(site_instance->GetId());
173 RenderViewHostImpl* rvh = NULL;
174 if (iter != render_view_host_map_.end()) {
175 RenderViewHostRefCount rvh_refcount = iter->second;
176 rvh = rvh_refcount.first;
177 } else {
178 rvh = static_cast<RenderViewHostImpl*>(
179 RenderViewHostFactory::Create(site_instance,
180 render_view_delegate_,
181 render_widget_delegate_,
182 routing_id,
183 main_frame_routing_id,
184 swapped_out,
185 hidden));
186
187 render_view_host_map_[site_instance->GetId()] =
188 RenderViewHostRefCount(rvh, 0);
189 }
190 return rvh;
191 }
192
193 void FrameTree::RegisterRenderFrameHost(
194 RenderFrameHostImpl* render_frame_host) {
195 SiteInstance* site_instance =
196 render_frame_host->render_view_host()->GetSiteInstance();
197 RenderViewHostMap::iterator iter =
198 render_view_host_map_.find(site_instance->GetId());
199 CHECK(iter != render_view_host_map_.end());
200
201 // Increment the refcount.
202 CHECK_GE(iter->second.second, 0);
203 iter->second.second++;
204 }
205
206 void FrameTree::UnregisterRenderFrameHost(
207 RenderFrameHostImpl* render_frame_host) {
208 SiteInstance* site_instance =
209 render_frame_host->render_view_host()->GetSiteInstance();
210 RenderViewHostMap::iterator iter =
211 render_view_host_map_.find(site_instance->GetId());
212 CHECK(iter != render_view_host_map_.end());
213
214 // Decrement the refcount and shutdown the RenderViewHost if no one else is
215 // using it.
216 CHECK_GT(iter->second.second, 0);
217 iter->second.second--;
218 if (iter->second.second == 0) {
219 iter->second.first->Shutdown();
220 render_view_host_map_.erase(iter);
221 }
222 }
223
163 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { 224 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) {
164 FrameTreeNode* node = NULL; 225 FrameTreeNode* node = NULL;
165 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); 226 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node));
166 return node; 227 return node;
167 } 228 }
168 229
169 scoped_ptr<FrameTreeNode> FrameTree::CreateNode( 230 scoped_ptr<FrameTreeNode> FrameTree::CreateNode(
170 int64 frame_id, 231 int64 frame_id,
171 const std::string& frame_name, 232 const std::string& frame_name,
172 int render_frame_host_id, 233 Navigator* navigator) {
173 FrameTreeNode* parent_node) {
174 scoped_ptr<FrameTreeNode> frame_tree_node(new FrameTreeNode( 234 scoped_ptr<FrameTreeNode> frame_tree_node(new FrameTreeNode(
175 parent_node->navigator(), render_frame_delegate_, render_view_delegate_, 235 navigator, render_frame_delegate_, render_view_delegate_,
176 render_widget_delegate_, manager_delegate_, frame_id, frame_name)); 236 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(); 237 return frame_tree_node.Pass();
189 } 238 }
190 239
191 } // namespace content 240 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698