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

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

Issue 117693002: Make RenderFrameHostManager swap RenderFrameHosts, not RenderViewHosts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix merge conflicts 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
« no previous file with comments | « content/browser/frame_host/frame_tree.h ('k') | content/browser/frame_host/frame_tree_node.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 21 matching lines...) Expand all
87 } 90 }
88 91
89 bool FrameTree::IsFirstNavigationAfterSwap() const { 92 bool FrameTree::IsFirstNavigationAfterSwap() const {
90 return root_->frame_id() == FrameTreeNode::kInvalidFrameId; 93 return root_->frame_id() == FrameTreeNode::kInvalidFrameId;
91 } 94 }
92 95
93 void FrameTree::OnFirstNavigationAfterSwap(int main_frame_id) { 96 void FrameTree::OnFirstNavigationAfterSwap(int main_frame_id) {
94 root_->set_frame_id(main_frame_id); 97 root_->set_frame_id(main_frame_id);
95 } 98 }
96 99
97 RenderFrameHostImpl* FrameTree::AddFrame(int render_frame_host_id, 100 RenderFrameHostImpl* FrameTree::AddFrame(int frame_routing_id,
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(new FrameTreeNode(
108 frame_id, frame_name, render_frame_host_id, parent)); 111 this, parent->navigator(), render_frame_delegate_, render_view_delegate_,
109 RenderFrameHostImpl* render_frame = node->render_frame_host(); 112 render_widget_delegate_, manager_delegate_, frame_id, frame_name));
110 parent->AddChild(node.Pass()); 113 RenderFrameHostImpl* render_frame = node->current_frame_host();
114 parent->AddChild(node.Pass(), frame_routing_id);
111 return render_frame; 115 return render_frame;
112 } 116 }
113 117
114 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host, 118 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host,
115 int64 parent_frame_id, 119 int64 parent_frame_id,
116 int64 frame_id) { 120 int64 frame_id) {
117 // If switches::kSitePerProcess is not specified, then the FrameTree only 121 // If switches::kSitePerProcess is not specified, then the FrameTree only
118 // contains a node for the root element. However, even in this case 122 // contains a node for the root element. However, even in this case
119 // frame detachments need to be broadcast outwards. 123 // frame detachments need to be broadcast outwards.
120 // 124 //
(...skipping 19 matching lines...) Expand all
140 FrameTreeNode* node = FindByFrameID(frame_id); 144 FrameTreeNode* node = FindByFrameID(frame_id);
141 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 145 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
142 // shutdown that might make this case possible? 146 // shutdown that might make this case possible?
143 if (!node) 147 if (!node)
144 return; 148 return;
145 149
146 if (node) 150 if (node)
147 node->set_current_url(url); 151 node->set_current_url(url);
148 } 152 }
149 153
150 void FrameTree::SwapMainFrame(RenderFrameHostImpl* render_frame_host) { 154 void FrameTree::ResetForMainFrameSwap() {
151 return root_->ResetForMainFrame(render_frame_host); 155 return root_->ResetForMainFrameSwap();
152 } 156 }
153 157
154 RenderFrameHostImpl* FrameTree::GetMainFrame() const { 158 RenderFrameHostImpl* FrameTree::GetMainFrame() const {
155 return root_->render_frame_host(); 159 return root_->current_frame_host();
156 } 160 }
157 161
158 void FrameTree::SetFrameRemoveListener( 162 void FrameTree::SetFrameRemoveListener(
159 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) { 163 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) {
160 on_frame_removed_ = on_frame_removed; 164 on_frame_removed_ = on_frame_removed;
161 } 165 }
162 166
167 void FrameTree::ClearFrameRemoveListenerForTesting() {
168 on_frame_removed_.Reset();
169 }
170
171 RenderViewHostImpl* FrameTree::CreateRenderViewHostForMainFrame(
172 SiteInstance* site_instance,
173 int routing_id,
174 int main_frame_routing_id,
175 bool swapped_out,
176 bool hidden) {
177 DCHECK(main_frame_routing_id != MSG_ROUTING_NONE);
178 RenderViewHostMap::iterator iter =
179 render_view_host_map_.find(site_instance->GetId());
180 CHECK(iter == render_view_host_map_.end());
181 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
182 RenderViewHostFactory::Create(site_instance,
183 render_view_delegate_,
184 render_widget_delegate_,
185 routing_id,
186 main_frame_routing_id,
187 swapped_out,
188 hidden));
189
190 render_view_host_map_[site_instance->GetId()] =
191 RenderViewHostRefCount(rvh, 0);
192 return rvh;
193 }
194
195 RenderViewHostImpl* FrameTree::GetRenderViewHostForSubFrame(
196 SiteInstance* site_instance) {
197 RenderViewHostMap::iterator iter =
198 render_view_host_map_.find(site_instance->GetId());
199 CHECK(iter != render_view_host_map_.end());
200 RenderViewHostRefCount rvh_refcount = iter->second;
201 return rvh_refcount.first;
202 }
203
204 void FrameTree::RegisterRenderFrameHost(
205 RenderFrameHostImpl* render_frame_host) {
206 SiteInstance* site_instance =
207 render_frame_host->render_view_host()->GetSiteInstance();
208 RenderViewHostMap::iterator iter =
209 render_view_host_map_.find(site_instance->GetId());
210 CHECK(iter != render_view_host_map_.end());
211
212 // Increment the refcount.
213 CHECK_GE(iter->second.second, 0);
214 iter->second.second++;
215 }
216
217 void FrameTree::UnregisterRenderFrameHost(
218 RenderFrameHostImpl* render_frame_host) {
219 SiteInstance* site_instance =
220 render_frame_host->render_view_host()->GetSiteInstance();
221 RenderViewHostMap::iterator iter =
222 render_view_host_map_.find(site_instance->GetId());
223 CHECK(iter != render_view_host_map_.end());
224
225 // Decrement the refcount and shutdown the RenderViewHost if no one else is
226 // using it.
227 CHECK_GT(iter->second.second, 0);
228 iter->second.second--;
229 if (iter->second.second == 0) {
230 iter->second.first->Shutdown();
231 render_view_host_map_.erase(iter);
232 }
233 }
234
163 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { 235 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) {
164 FrameTreeNode* node = NULL; 236 FrameTreeNode* node = NULL;
165 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); 237 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node));
166 return node; 238 return node;
167 } 239 }
168 240
169 scoped_ptr<FrameTreeNode> FrameTree::CreateNode(
170 int64 frame_id,
171 const std::string& frame_name,
172 int render_frame_host_id,
173 FrameTreeNode* parent_node) {
174 scoped_ptr<FrameTreeNode> frame_tree_node(new FrameTreeNode(
175 parent_node->navigator(), render_frame_delegate_, render_view_delegate_,
176 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();
189 }
190
191 } // namespace content 241 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/frame_tree.h ('k') | content/browser/frame_host/frame_tree_node.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698