| 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 "base/containers/hash_tables.h" |
| 12 #include "base/lazy_instance.h" |
| 11 #include "content/browser/frame_host/frame_tree_node.h" | 13 #include "content/browser/frame_host/frame_tree_node.h" |
| 12 #include "content/browser/frame_host/navigator.h" | 14 #include "content/browser/frame_host/navigator.h" |
| 13 #include "content/browser/frame_host/render_frame_host_factory.h" | 15 #include "content/browser/frame_host/render_frame_host_factory.h" |
| 14 #include "content/browser/frame_host/render_frame_host_impl.h" | 16 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 15 #include "content/browser/renderer_host/render_view_host_factory.h" | 17 #include "content/browser/renderer_host/render_view_host_factory.h" |
| 16 #include "content/browser/renderer_host/render_view_host_impl.h" | 18 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 19 #include "content/public/browser/browser_thread.h" |
| 17 | 20 |
| 18 namespace content { | 21 namespace content { |
| 19 | 22 |
| 20 namespace { | 23 namespace { |
| 24 |
| 25 // This is a global map between frame_tree_node_ids and pointer to |
| 26 // FrameTreeNodes. |
| 27 typedef base::hash_map<int64, FrameTreeNode*> FrameTreeNodeIDMap; |
| 28 |
| 29 base::LazyInstance<FrameTreeNodeIDMap> g_frame_tree_node_id_map = |
| 30 LAZY_INSTANCE_INITIALIZER; |
| 31 |
| 21 // Used with FrameTree::ForEach() to search for the FrameTreeNode | 32 // Used with FrameTree::ForEach() to search for the FrameTreeNode |
| 22 // corresponding to |frame_tree_node_id|. | 33 // corresponding to |frame_tree_node_id| whithin a specific FrameTree. |
| 23 bool FrameTreeNodeForId(int64 frame_tree_node_id, | 34 bool FrameTreeNodeForId(int64 frame_tree_node_id, |
| 24 FrameTreeNode** out_node, | 35 FrameTreeNode** out_node, |
| 25 FrameTreeNode* node) { | 36 FrameTreeNode* node) { |
| 26 if (node->frame_tree_node_id() == frame_tree_node_id) { | 37 if (node->frame_tree_node_id() == frame_tree_node_id) { |
| 27 *out_node = node; | 38 *out_node = node; |
| 28 // Terminate iteration once the node has been found. | 39 // Terminate iteration once the node has been found. |
| 29 return false; | 40 return false; |
| 30 } | 41 } |
| 31 return true; | 42 return true; |
| 32 } | 43 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 render_widget_delegate_(render_widget_delegate), | 88 render_widget_delegate_(render_widget_delegate), |
| 78 manager_delegate_(manager_delegate), | 89 manager_delegate_(manager_delegate), |
| 79 root_(new FrameTreeNode(this, | 90 root_(new FrameTreeNode(this, |
| 80 navigator, | 91 navigator, |
| 81 render_frame_delegate, | 92 render_frame_delegate, |
| 82 render_view_delegate, | 93 render_view_delegate, |
| 83 render_widget_delegate, | 94 render_widget_delegate, |
| 84 manager_delegate, | 95 manager_delegate, |
| 85 std::string())), | 96 std::string())), |
| 86 focused_frame_tree_node_id_(-1) { | 97 focused_frame_tree_node_id_(-1) { |
| 98 std::pair<FrameTreeNodeIDMap::iterator, bool> result = |
| 99 g_frame_tree_node_id_map.Get().insert( |
| 100 std::make_pair(root_->frame_tree_node_id(), root_.get())); |
| 101 CHECK(result.second); |
| 87 } | 102 } |
| 88 | 103 |
| 89 FrameTree::~FrameTree() { | 104 FrameTree::~FrameTree() { |
| 105 g_frame_tree_node_id_map.Get().erase(root_->frame_tree_node_id()); |
| 106 } |
| 107 |
| 108 // static |
| 109 FrameTreeNode* FrameTree::GloballyFindByID(int64 frame_tree_node_id) { |
| 110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 111 FrameTreeNodeIDMap* nodes = g_frame_tree_node_id_map.Pointer(); |
| 112 FrameTreeNodeIDMap::iterator it = nodes->find(frame_tree_node_id); |
| 113 return it == nodes->end() ? NULL : it->second; |
| 90 } | 114 } |
| 91 | 115 |
| 92 FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) { | 116 FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) { |
| 93 FrameTreeNode* node = NULL; | 117 FrameTreeNode* node = NULL; |
| 94 ForEach(base::Bind(&FrameTreeNodeForId, frame_tree_node_id, &node)); | 118 ForEach(base::Bind(&FrameTreeNodeForId, frame_tree_node_id, &node)); |
| 95 return node; | 119 return node; |
| 96 } | 120 } |
| 97 | 121 |
| 98 FrameTreeNode* FrameTree::FindByRoutingID(int routing_id, int process_id) { | 122 FrameTreeNode* FrameTree::FindByRoutingID(int routing_id, int process_id) { |
| 99 FrameTreeNode* node = NULL; | 123 FrameTreeNode* node = NULL; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 117 queue.push(node->child_at(i)); | 141 queue.push(node->child_at(i)); |
| 118 } | 142 } |
| 119 } | 143 } |
| 120 | 144 |
| 121 RenderFrameHostImpl* FrameTree::AddFrame(FrameTreeNode* parent, | 145 RenderFrameHostImpl* FrameTree::AddFrame(FrameTreeNode* parent, |
| 122 int new_routing_id, | 146 int new_routing_id, |
| 123 const std::string& frame_name) { | 147 const std::string& frame_name) { |
| 124 scoped_ptr<FrameTreeNode> node(new FrameTreeNode( | 148 scoped_ptr<FrameTreeNode> node(new FrameTreeNode( |
| 125 this, parent->navigator(), render_frame_delegate_, render_view_delegate_, | 149 this, parent->navigator(), render_frame_delegate_, render_view_delegate_, |
| 126 render_widget_delegate_, manager_delegate_, frame_name)); | 150 render_widget_delegate_, manager_delegate_, frame_name)); |
| 151 std::pair<FrameTreeNodeIDMap::iterator, bool> result = |
| 152 g_frame_tree_node_id_map.Get().insert( |
| 153 std::make_pair(node->frame_tree_node_id(), node.get())); |
| 154 CHECK(result.second); |
| 127 FrameTreeNode* node_ptr = node.get(); | 155 FrameTreeNode* node_ptr = node.get(); |
| 128 // AddChild is what creates the RenderFrameHost. | 156 // AddChild is what creates the RenderFrameHost. |
| 129 parent->AddChild(node.Pass(), new_routing_id); | 157 parent->AddChild(node.Pass(), new_routing_id); |
| 130 return node_ptr->current_frame_host(); | 158 return node_ptr->current_frame_host(); |
| 131 } | 159 } |
| 132 | 160 |
| 133 void FrameTree::RemoveFrame(FrameTreeNode* child) { | 161 void FrameTree::RemoveFrame(FrameTreeNode* child) { |
| 134 FrameTreeNode* parent = child->parent(); | 162 FrameTreeNode* parent = child->parent(); |
| 135 if (!parent) { | 163 if (!parent) { |
| 136 NOTREACHED() << "Unexpected RemoveFrame call for main frame."; | 164 NOTREACHED() << "Unexpected RemoveFrame call for main frame."; |
| 137 return; | 165 return; |
| 138 } | 166 } |
| 139 | 167 |
| 140 // Notify observers of the frame removal. | 168 // Notify observers of the frame removal. |
| 141 RenderFrameHostImpl* render_frame_host = child->current_frame_host(); | 169 RenderFrameHostImpl* render_frame_host = child->current_frame_host(); |
| 142 if (!on_frame_removed_.is_null()) { | 170 if (!on_frame_removed_.is_null()) { |
| 143 on_frame_removed_.Run(render_frame_host); | 171 on_frame_removed_.Run(render_frame_host); |
| 144 } | 172 } |
| 145 | 173 g_frame_tree_node_id_map.Get().erase(child->frame_tree_node_id()); |
| 146 parent->RemoveChild(child); | 174 parent->RemoveChild(child); |
| 147 } | 175 } |
| 148 | 176 |
| 149 void FrameTree::CreateProxiesForSiteInstance( | 177 void FrameTree::CreateProxiesForSiteInstance( |
| 150 FrameTreeNode* source, | 178 FrameTreeNode* source, |
| 151 SiteInstance* site_instance) { | 179 SiteInstance* site_instance) { |
| 152 // Create the swapped out RVH for the new SiteInstance. This will create | 180 // Create the swapped out RVH for the new SiteInstance. This will create |
| 153 // a top-level swapped out RFH as well, which will then be wrapped by a | 181 // a top-level swapped out RFH as well, which will then be wrapped by a |
| 154 // RenderFrameProxyHost. | 182 // RenderFrameProxyHost. |
| 155 if (!source->IsMainFrame()) { | 183 if (!source->IsMainFrame()) { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 rvh->Shutdown(); | 322 rvh->Shutdown(); |
| 295 render_view_host_pending_shutdown_map_.erase(multi_iter); | 323 render_view_host_pending_shutdown_map_.erase(multi_iter); |
| 296 } | 324 } |
| 297 break; | 325 break; |
| 298 } | 326 } |
| 299 CHECK(render_view_host_found); | 327 CHECK(render_view_host_found); |
| 300 } | 328 } |
| 301 } | 329 } |
| 302 | 330 |
| 303 } // namespace content | 331 } // namespace content |
| OLD | NEW |