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 |