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

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

Issue 30323002: [DRAFT] Create RenderFrameHostManager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Misc fixes 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"
(...skipping 13 matching lines...) Expand all
24 FrameTreeNode** out_node, 24 FrameTreeNode** out_node,
25 FrameTreeNode* node) { 25 FrameTreeNode* node) {
26 if (node->frame_tree_node_id() == frame_tree_node_id) { 26 if (node->frame_tree_node_id() == frame_tree_node_id) {
27 *out_node = node; 27 *out_node = node;
28 // Terminate iteration once the node has been found. 28 // Terminate iteration once the node has been found.
29 return false; 29 return false;
30 } 30 }
31 return true; 31 return true;
32 } 32 }
33 33
34 // TODO(creis): Remove this version along with FrameTreeNode::frame_id().
35 bool FrameTreeNodeForFrameId(int64 frame_id,
36 FrameTreeNode** out_node,
37 FrameTreeNode* node) {
38 if (node->frame_id() == frame_id) {
39 *out_node = node;
40 // Terminate iteration once the node has been found.
41 return false;
42 }
43 return true;
44 }
45
46 } // namespace 34 } // namespace
47 35
48 FrameTree::FrameTree(Navigator* navigator, 36 FrameTree::FrameTree(Navigator* navigator,
49 RenderFrameHostDelegate* render_frame_delegate, 37 RenderFrameHostDelegate* render_frame_delegate,
50 RenderViewHostDelegate* render_view_delegate, 38 RenderViewHostDelegate* render_view_delegate,
51 RenderWidgetHostDelegate* render_widget_delegate, 39 RenderWidgetHostDelegate* render_widget_delegate,
52 RenderFrameHostManager::Delegate* manager_delegate) 40 RenderFrameHostManager::Delegate* manager_delegate)
53 : render_frame_delegate_(render_frame_delegate), 41 : render_frame_delegate_(render_frame_delegate),
54 render_view_delegate_(render_view_delegate), 42 render_view_delegate_(render_view_delegate),
55 render_widget_delegate_(render_widget_delegate), 43 render_widget_delegate_(render_widget_delegate),
56 manager_delegate_(manager_delegate), 44 manager_delegate_(manager_delegate),
57 root_(new FrameTreeNode(this, 45 root_(new FrameTreeNode(this,
58 navigator, 46 navigator,
59 render_frame_delegate, 47 render_frame_delegate,
60 render_view_delegate, 48 render_view_delegate,
61 render_widget_delegate, 49 render_widget_delegate,
62 manager_delegate, 50 manager_delegate,
63 FrameTreeNode::kInvalidFrameId,
64 std::string())) { 51 std::string())) {
65 } 52 }
66 53
67 FrameTree::~FrameTree() { 54 FrameTree::~FrameTree() {
68 } 55 }
69 56
70 FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) { 57 FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) {
71 FrameTreeNode* node = NULL; 58 FrameTreeNode* node = NULL;
72 ForEach(base::Bind(&FrameTreeNodeForId, frame_tree_node_id, &node)); 59 ForEach(base::Bind(&FrameTreeNodeForId, frame_tree_node_id, &node));
73 return node; 60 return node;
74 } 61 }
75 62
76 void FrameTree::ForEach( 63 void FrameTree::ForEach(
77 const base::Callback<bool(FrameTreeNode*)>& on_node) const { 64 const base::Callback<bool(FrameTreeNode*)>& on_node) const {
78 std::queue<FrameTreeNode*> queue; 65 std::queue<FrameTreeNode*> queue;
79 queue.push(root_.get()); 66 queue.push(root_.get());
80 67
81 while (!queue.empty()) { 68 while (!queue.empty()) {
82 FrameTreeNode* node = queue.front(); 69 FrameTreeNode* node = queue.front();
83 queue.pop(); 70 queue.pop();
84 if (!on_node.Run(node)) 71 if (!on_node.Run(node))
85 break; 72 break;
86 73
87 for (size_t i = 0; i < node->child_count(); ++i) 74 for (size_t i = 0; i < node->child_count(); ++i)
88 queue.push(node->child_at(i)); 75 queue.push(node->child_at(i));
89 } 76 }
90 } 77 }
91 78
92 bool FrameTree::IsFirstNavigationAfterSwap() const { 79 RenderFrameHostImpl* FrameTree::AddFrame(
93 return root_->frame_id() == FrameTreeNode::kInvalidFrameId; 80 RenderViewHostImpl* parent_render_view_host,
94 } 81 int frame_routing_id,
95 82 int64 parent_frame_id,
96 void FrameTree::OnFirstNavigationAfterSwap(int main_frame_id) { 83 int64 frame_id,
97 root_->set_frame_id(main_frame_id); 84 const std::string& frame_name) {
98 } 85 int64 parent_frame_tree_node_id =
99 86 parent_render_view_host->GetFrameTreeNodeID(parent_frame_id);
100 RenderFrameHostImpl* FrameTree::AddFrame(int frame_routing_id, 87 FrameTreeNode* parent = FindByID(parent_frame_tree_node_id);
101 int64 parent_frame_id,
102 int64 frame_id,
103 const std::string& frame_name) {
104 FrameTreeNode* parent = FindByFrameID(parent_frame_id);
105 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 88 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
106 // shutdown that might make this case possible? 89 // shutdown that might make this case possible?
107 if (!parent) 90 if (!parent)
108 return NULL; 91 return NULL;
109 92
110 scoped_ptr<FrameTreeNode> node(new FrameTreeNode( 93 scoped_ptr<FrameTreeNode> node(new FrameTreeNode(
111 this, parent->navigator(), render_frame_delegate_, render_view_delegate_, 94 this, parent->navigator(), render_frame_delegate_, render_view_delegate_,
112 render_widget_delegate_, manager_delegate_, frame_id, frame_name)); 95 render_widget_delegate_, manager_delegate_, frame_name));
113 RenderFrameHostImpl* render_frame = node->current_frame_host(); 96 RenderFrameHostImpl* render_frame = node->current_frame_host();
97 parent_render_view_host->RegisterFrameID(frame_id,
98 node->frame_tree_node_id());
114 parent->AddChild(node.Pass(), frame_routing_id); 99 parent->AddChild(node.Pass(), frame_routing_id);
115 return render_frame; 100 return render_frame;
116 } 101 }
117 102
118 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host, 103 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host,
119 int64 parent_frame_id, 104 int64 parent_frame_tree_node_id,
105 int64 frame_tree_node_id,
120 int64 frame_id) { 106 int64 frame_id) {
121 // If switches::kSitePerProcess is not specified, then the FrameTree only 107 // If switches::kSitePerProcess is not specified, then the FrameTree only
122 // contains a node for the root element. However, even in this case 108 // contains a node for the root element. However, even in this case
123 // frame detachments need to be broadcast outwards. 109 // frame detachments need to be broadcast outwards.
124 // 110 //
125 // TODO(ajwong): Move this below the |parent| check after the FrameTree is 111 // TODO(ajwong): Move this below the |parent| check after the FrameTree is
126 // guaranteed to be correctly populated even without the 112 // guaranteed to be correctly populated even without the
127 // switches::kSitePerProcess flag. 113 // switches::kSitePerProcess flag.
128 FrameTreeNode* parent = FindByFrameID(parent_frame_id); 114 FrameTreeNode* parent = FindByID(parent_frame_tree_node_id);
129 FrameTreeNode* child = FindByFrameID(frame_id); 115 FrameTreeNode* child = FindByID(frame_tree_node_id);
130 if (!on_frame_removed_.is_null()) { 116 if (!on_frame_removed_.is_null()) {
131 on_frame_removed_.Run( 117 on_frame_removed_.Run(
132 render_frame_host->render_view_host(), frame_id); 118 render_frame_host->render_view_host(), frame_id);
133 } 119 }
134 120
135 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 121 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
136 // shutdown that might make this case possible? 122 // shutdown that might make this case possible?
137 if (!parent || !child) 123 if (!parent || !child)
138 return; 124 return;
139 125
140 parent->RemoveChild(child); 126 parent->RemoveChild(child);
141 } 127 }
142 128
143 void FrameTree::SetFrameUrl(int64 frame_id, const GURL& url) { 129 void FrameTree::SetFrameUrl(int64 frame_tree_node_id, const GURL& url) {
144 FrameTreeNode* node = FindByFrameID(frame_id); 130 FrameTreeNode* node = FindByID(frame_tree_node_id);
145 // TODO(ajwong): Should the renderer be killed here? Would there be a race on 131 // TODO(ajwong): Should the renderer be killed here? Would there be a race on
146 // shutdown that might make this case possible? 132 // shutdown that might make this case possible?
147 if (!node) 133 if (!node)
148 return; 134 return;
149 135
150 if (node) 136 if (node)
151 node->set_current_url(url); 137 node->set_current_url(url);
152 } 138 }
153 139
154 void FrameTree::ResetForMainFrameSwap() { 140 void FrameTree::ResetForMainFrameSwap() {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 175
190 render_view_host_map_[site_instance->GetId()] = 176 render_view_host_map_[site_instance->GetId()] =
191 RenderViewHostRefCount(rvh, 0); 177 RenderViewHostRefCount(rvh, 0);
192 return rvh; 178 return rvh;
193 } 179 }
194 180
195 RenderViewHostImpl* FrameTree::GetRenderViewHostForSubFrame( 181 RenderViewHostImpl* FrameTree::GetRenderViewHostForSubFrame(
196 SiteInstance* site_instance) { 182 SiteInstance* site_instance) {
197 RenderViewHostMap::iterator iter = 183 RenderViewHostMap::iterator iter =
198 render_view_host_map_.find(site_instance->GetId()); 184 render_view_host_map_.find(site_instance->GetId());
199 CHECK(iter != render_view_host_map_.end()); 185 // TODO(creis): Mirror the frame tree so this check can't fail.
186 if (iter == render_view_host_map_.end())
187 return NULL;
200 RenderViewHostRefCount rvh_refcount = iter->second; 188 RenderViewHostRefCount rvh_refcount = iter->second;
201 return rvh_refcount.first; 189 return rvh_refcount.first;
202 } 190 }
203 191
204 void FrameTree::RegisterRenderFrameHost( 192 void FrameTree::RegisterRenderFrameHost(
205 RenderFrameHostImpl* render_frame_host) { 193 RenderFrameHostImpl* render_frame_host) {
206 SiteInstance* site_instance = 194 SiteInstance* site_instance =
207 render_frame_host->render_view_host()->GetSiteInstance(); 195 render_frame_host->render_view_host()->GetSiteInstance();
208 RenderViewHostMap::iterator iter = 196 RenderViewHostMap::iterator iter =
209 render_view_host_map_.find(site_instance->GetId()); 197 render_view_host_map_.find(site_instance->GetId());
(...skipping 15 matching lines...) Expand all
225 // Decrement the refcount and shutdown the RenderViewHost if no one else is 213 // Decrement the refcount and shutdown the RenderViewHost if no one else is
226 // using it. 214 // using it.
227 CHECK_GT(iter->second.second, 0); 215 CHECK_GT(iter->second.second, 0);
228 iter->second.second--; 216 iter->second.second--;
229 if (iter->second.second == 0) { 217 if (iter->second.second == 0) {
230 iter->second.first->Shutdown(); 218 iter->second.first->Shutdown();
231 render_view_host_map_.erase(iter); 219 render_view_host_map_.erase(iter);
232 } 220 }
233 } 221 }
234 222
235 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) {
236 FrameTreeNode* node = NULL;
237 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node));
238 return node;
239 }
240
241 } // namespace content 223 } // 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