OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |