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