| 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" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |