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

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

Issue 105523006: Revert 241151 "Make RenderFrameHostManager swap RenderFrameHosts..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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"
17 15
18 namespace content { 16 namespace content {
19 17
20 namespace { 18 namespace {
21 // Used with FrameTree::ForEach() to search for the FrameTreeNode 19 // Used with FrameTree::ForEach() to search for the FrameTreeNode
22 // corresponding to |frame_tree_node_id|. 20 // corresponding to |frame_tree_node_id|.
23 bool FrameTreeNodeForId(int64 frame_tree_node_id, 21 bool FrameTreeNodeForId(int64 frame_tree_node_id,
24 FrameTreeNode** out_node, 22 FrameTreeNode** out_node,
25 FrameTreeNode* node) { 23 FrameTreeNode* node) {
26 if (node->frame_tree_node_id() == frame_tree_node_id) { 24 if (node->frame_tree_node_id() == frame_tree_node_id) {
(...skipping 20 matching lines...) Expand all
47 45
48 FrameTree::FrameTree(Navigator* navigator, 46 FrameTree::FrameTree(Navigator* navigator,
49 RenderFrameHostDelegate* render_frame_delegate, 47 RenderFrameHostDelegate* render_frame_delegate,
50 RenderViewHostDelegate* render_view_delegate, 48 RenderViewHostDelegate* render_view_delegate,
51 RenderWidgetHostDelegate* render_widget_delegate, 49 RenderWidgetHostDelegate* render_widget_delegate,
52 RenderFrameHostManager::Delegate* manager_delegate) 50 RenderFrameHostManager::Delegate* manager_delegate)
53 : render_frame_delegate_(render_frame_delegate), 51 : render_frame_delegate_(render_frame_delegate),
54 render_view_delegate_(render_view_delegate), 52 render_view_delegate_(render_view_delegate),
55 render_widget_delegate_(render_widget_delegate), 53 render_widget_delegate_(render_widget_delegate),
56 manager_delegate_(manager_delegate), 54 manager_delegate_(manager_delegate),
57 root_(new FrameTreeNode(this, 55 root_(new FrameTreeNode(navigator,
58 navigator,
59 render_frame_delegate, 56 render_frame_delegate,
60 render_view_delegate, 57 render_view_delegate,
61 render_widget_delegate, 58 render_widget_delegate,
62 manager_delegate, 59 manager_delegate,
63 FrameTreeNode::kInvalidFrameId, 60 FrameTreeNode::kInvalidFrameId,
64 std::string())) { 61 std::string())) {
65 } 62 }
66 63
67 FrameTree::~FrameTree() { 64 FrameTree::~FrameTree() {
68 } 65 }
(...skipping 21 matching lines...) Expand all
90 } 87 }
91 88
92 bool FrameTree::IsFirstNavigationAfterSwap() const { 89 bool FrameTree::IsFirstNavigationAfterSwap() const {
93 return root_->frame_id() == FrameTreeNode::kInvalidFrameId; 90 return root_->frame_id() == FrameTreeNode::kInvalidFrameId;
94 } 91 }
95 92
96 void FrameTree::OnFirstNavigationAfterSwap(int main_frame_id) { 93 void FrameTree::OnFirstNavigationAfterSwap(int main_frame_id) {
97 root_->set_frame_id(main_frame_id); 94 root_->set_frame_id(main_frame_id);
98 } 95 }
99 96
100 RenderFrameHostImpl* FrameTree::AddFrame(int frame_routing_id, 97 RenderFrameHostImpl* FrameTree::AddFrame(int render_frame_host_id,
101 int64 parent_frame_id, 98 int64 parent_frame_id,
102 int64 frame_id, 99 int64 frame_id,
103 const std::string& frame_name) { 100 const std::string& frame_name) {
104 FrameTreeNode* parent = FindByFrameID(parent_frame_id); 101 FrameTreeNode* parent = FindByFrameID(parent_frame_id);
105 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 102 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
106 // shutdown that might make this case possible? 103 // shutdown that might make this case possible?
107 if (!parent) 104 if (!parent)
108 return NULL; 105 return NULL;
109 106
110 scoped_ptr<FrameTreeNode> node(new FrameTreeNode( 107 scoped_ptr<FrameTreeNode> node(CreateNode(
111 this, parent->navigator(), render_frame_delegate_, render_view_delegate_, 108 frame_id, frame_name, render_frame_host_id, parent));
112 render_widget_delegate_, manager_delegate_, frame_id, frame_name)); 109 RenderFrameHostImpl* render_frame = node->render_frame_host();
113 RenderFrameHostImpl* render_frame = node->current_frame_host(); 110 parent->AddChild(node.Pass());
114 parent->AddChild(node.Pass(), frame_routing_id);
115 return render_frame; 111 return render_frame;
116 } 112 }
117 113
118 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host, 114 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host,
119 int64 parent_frame_id, 115 int64 parent_frame_id,
120 int64 frame_id) { 116 int64 frame_id) {
121 // If switches::kSitePerProcess is not specified, then the FrameTree only 117 // If switches::kSitePerProcess is not specified, then the FrameTree only
122 // contains a node for the root element. However, even in this case 118 // contains a node for the root element. However, even in this case
123 // frame detachments need to be broadcast outwards. 119 // frame detachments need to be broadcast outwards.
124 // 120 //
(...skipping 19 matching lines...) Expand all
144 FrameTreeNode* node = FindByFrameID(frame_id); 140 FrameTreeNode* node = FindByFrameID(frame_id);
145 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 141 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
146 // shutdown that might make this case possible? 142 // shutdown that might make this case possible?
147 if (!node) 143 if (!node)
148 return; 144 return;
149 145
150 if (node) 146 if (node)
151 node->set_current_url(url); 147 node->set_current_url(url);
152 } 148 }
153 149
154 void FrameTree::ResetForMainFrameSwap() { 150 void FrameTree::SwapMainFrame(RenderFrameHostImpl* render_frame_host) {
155 return root_->ResetForMainFrameSwap(); 151 return root_->ResetForMainFrame(render_frame_host);
156 } 152 }
157 153
158 RenderFrameHostImpl* FrameTree::GetMainFrame() const { 154 RenderFrameHostImpl* FrameTree::GetMainFrame() const {
159 return root_->current_frame_host(); 155 return root_->render_frame_host();
160 } 156 }
161 157
162 void FrameTree::SetFrameRemoveListener( 158 void FrameTree::SetFrameRemoveListener(
163 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) { 159 const base::Callback<void(RenderViewHostImpl*, int64)>& on_frame_removed) {
164 on_frame_removed_ = on_frame_removed; 160 on_frame_removed_ = on_frame_removed;
165 } 161 }
166 162
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
235 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { 163 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) {
236 FrameTreeNode* node = NULL; 164 FrameTreeNode* node = NULL;
237 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); 165 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node));
238 return node; 166 return node;
239 } 167 }
240 168
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
241 } // namespace content 191 } // namespace content
OLDNEW
« no previous file with comments | « trunk/src/content/browser/frame_host/frame_tree.h ('k') | trunk/src/content/browser/frame_host/frame_tree_node.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698