| 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 20 matching lines...) Expand all Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |