Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: content/browser/frame_host/frame_tree.cc

Issue 429603002: PlzNavigate: Add a static CommitNavigation method in FrameTreeNode (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Nasko's comments Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/frame_host/frame_tree.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
14 #include "content/browser/frame_host/navigation_before_commit_info.h"
12 #include "content/browser/frame_host/navigator.h" 15 #include "content/browser/frame_host/navigator.h"
13 #include "content/browser/frame_host/render_frame_host_factory.h" 16 #include "content/browser/frame_host/render_frame_host_factory.h"
14 #include "content/browser/frame_host/render_frame_host_impl.h" 17 #include "content/browser/frame_host/render_frame_host_impl.h"
15 #include "content/browser/renderer_host/render_view_host_factory.h" 18 #include "content/browser/renderer_host/render_view_host_factory.h"
16 #include "content/browser/renderer_host/render_view_host_impl.h" 19 #include "content/browser/renderer_host/render_view_host_impl.h"
20 #include "content/public/browser/browser_thread.h"
17 21
18 namespace content { 22 namespace content {
19 23
20 namespace { 24 namespace {
21 // Used with FrameTree::ForEach() to search for the FrameTreeNode 25
22 // corresponding to |frame_tree_node_id|. 26 // This is a global map between frame_tree_node_ids and pointer to
23 bool FrameTreeNodeForId(int64 frame_tree_node_id, 27 // FrameTreeNodes.
24 FrameTreeNode** out_node, 28 typedef base::hash_map<int64, FrameTreeNode*> FrameTreeNodeIDMap;
25 FrameTreeNode* node) { 29
26 if (node->frame_tree_node_id() == frame_tree_node_id) { 30 base::LazyInstance<FrameTreeNodeIDMap> g_frame_tree_node_id_map =
27 *out_node = node; 31 LAZY_INSTANCE_INITIALIZER;
28 // Terminate iteration once the node has been found. 32
29 return false; 33 // Used by static methods to return a pointer to FrameTreeNode from the global
30 } 34 // |frame_tree_node_id|.
31 return true; 35 FrameTreeNode* FrameTreeNodeForGlobalId(int64 frame_tree_node_id) {
nasko 2014/08/13 00:52:53 nit: The FTN id is global in all cases, so we can
36 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
37 FrameTreeNodeIDMap* nodes = g_frame_tree_node_id_map.Pointer();
38 FrameTreeNodeIDMap::iterator it = nodes->find(frame_tree_node_id);
39 return it == nodes->end() ? NULL : it->second;
32 } 40 }
33 41
34 bool FrameTreeNodeForRoutingId(int routing_id, 42 bool FrameTreeNodeForRoutingId(int routing_id,
35 int process_id, 43 int process_id,
36 FrameTreeNode** out_node, 44 FrameTreeNode** out_node,
37 FrameTreeNode* node) { 45 FrameTreeNode* node) {
38 // TODO(creis): Look through the swapped out RFHs as well. 46 // TODO(creis): Look through the swapped out RFHs as well.
39 if (node->current_frame_host()->GetProcess()->GetID() == process_id && 47 if (node->current_frame_host()->GetProcess()->GetID() == process_id &&
40 node->current_frame_host()->GetRoutingID() == routing_id) { 48 node->current_frame_host()->GetRoutingID() == routing_id) {
41 *out_node = node; 49 *out_node = node;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 render_widget_delegate_(render_widget_delegate), 85 render_widget_delegate_(render_widget_delegate),
78 manager_delegate_(manager_delegate), 86 manager_delegate_(manager_delegate),
79 root_(new FrameTreeNode(this, 87 root_(new FrameTreeNode(this,
80 navigator, 88 navigator,
81 render_frame_delegate, 89 render_frame_delegate,
82 render_view_delegate, 90 render_view_delegate,
83 render_widget_delegate, 91 render_widget_delegate,
84 manager_delegate, 92 manager_delegate,
85 std::string())), 93 std::string())),
86 focused_frame_tree_node_id_(-1) { 94 focused_frame_tree_node_id_(-1) {
95 g_frame_tree_node_id_map.Get().insert(
96 std::make_pair(root_->frame_tree_node_id(), root_.get()));
nasko 2014/08/13 00:52:53 Let's check here that we never insert duplicate en
87 } 97 }
88 98
89 FrameTree::~FrameTree() { 99 FrameTree::~FrameTree() {
100 g_frame_tree_node_id_map.Get().erase(root_->frame_tree_node_id());
101 }
102
103 // static
104 void FrameTree::CommitNavigationInNode(int64 frame_tree_node_id,
105 const NavigationBeforeCommitInfo& info) {
106 FrameTreeNode* node = FrameTreeNodeForGlobalId(frame_tree_node_id);
107 if (!node)
108 return;
109 DCHECK(node->frame_tree_node_id() == frame_tree_node_id);
110 node->render_manager()->CommitNavigation(info);
90 } 111 }
91 112
92 FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) { 113 FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) {
93 FrameTreeNode* node = NULL; 114 return FrameTreeNodeForGlobalId(frame_tree_node_id);
94 ForEach(base::Bind(&FrameTreeNodeForId, frame_tree_node_id, &node));
95 return node;
96 } 115 }
97 116
98 FrameTreeNode* FrameTree::FindByRoutingID(int routing_id, int process_id) { 117 FrameTreeNode* FrameTree::FindByRoutingID(int routing_id, int process_id) {
99 FrameTreeNode* node = NULL; 118 FrameTreeNode* node = NULL;
100 ForEach( 119 ForEach(
101 base::Bind(&FrameTreeNodeForRoutingId, routing_id, process_id, &node)); 120 base::Bind(&FrameTreeNodeForRoutingId, routing_id, process_id, &node));
102 return node; 121 return node;
103 } 122 }
104 123
105 void FrameTree::ForEach( 124 void FrameTree::ForEach(
(...skipping 11 matching lines...) Expand all
117 queue.push(node->child_at(i)); 136 queue.push(node->child_at(i));
118 } 137 }
119 } 138 }
120 139
121 RenderFrameHostImpl* FrameTree::AddFrame(FrameTreeNode* parent, 140 RenderFrameHostImpl* FrameTree::AddFrame(FrameTreeNode* parent,
122 int new_routing_id, 141 int new_routing_id,
123 const std::string& frame_name) { 142 const std::string& frame_name) {
124 scoped_ptr<FrameTreeNode> node(new FrameTreeNode( 143 scoped_ptr<FrameTreeNode> node(new FrameTreeNode(
125 this, parent->navigator(), render_frame_delegate_, render_view_delegate_, 144 this, parent->navigator(), render_frame_delegate_, render_view_delegate_,
126 render_widget_delegate_, manager_delegate_, frame_name)); 145 render_widget_delegate_, manager_delegate_, frame_name));
146 g_frame_tree_node_id_map.Get().insert(
147 std::make_pair(node->frame_tree_node_id(), node.get()));
127 FrameTreeNode* node_ptr = node.get(); 148 FrameTreeNode* node_ptr = node.get();
128 // AddChild is what creates the RenderFrameHost. 149 // AddChild is what creates the RenderFrameHost.
129 parent->AddChild(node.Pass(), new_routing_id); 150 parent->AddChild(node.Pass(), new_routing_id);
130 return node_ptr->current_frame_host(); 151 return node_ptr->current_frame_host();
131 } 152 }
132 153
133 void FrameTree::RemoveFrame(FrameTreeNode* child) { 154 void FrameTree::RemoveFrame(FrameTreeNode* child) {
134 FrameTreeNode* parent = child->parent(); 155 FrameTreeNode* parent = child->parent();
135 if (!parent) { 156 if (!parent) {
136 NOTREACHED() << "Unexpected RemoveFrame call for main frame."; 157 NOTREACHED() << "Unexpected RemoveFrame call for main frame.";
137 return; 158 return;
138 } 159 }
139 160
140 // Notify observers of the frame removal. 161 // Notify observers of the frame removal.
141 RenderFrameHostImpl* render_frame_host = child->current_frame_host(); 162 RenderFrameHostImpl* render_frame_host = child->current_frame_host();
142 if (!on_frame_removed_.is_null()) { 163 if (!on_frame_removed_.is_null()) {
143 on_frame_removed_.Run(render_frame_host); 164 on_frame_removed_.Run(render_frame_host);
144 } 165 }
145 166 g_frame_tree_node_id_map.Get().erase(child->frame_tree_node_id());
146 parent->RemoveChild(child); 167 parent->RemoveChild(child);
147 } 168 }
148 169
149 void FrameTree::CreateProxiesForSiteInstance( 170 void FrameTree::CreateProxiesForSiteInstance(
150 FrameTreeNode* source, 171 FrameTreeNode* source,
151 SiteInstance* site_instance) { 172 SiteInstance* site_instance) {
152 // Create the swapped out RVH for the new SiteInstance. This will create 173 // 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 174 // a top-level swapped out RFH as well, which will then be wrapped by a
154 // RenderFrameProxyHost. 175 // RenderFrameProxyHost.
155 if (!source->IsMainFrame()) { 176 if (!source->IsMainFrame()) {
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 rvh->Shutdown(); 315 rvh->Shutdown();
295 render_view_host_pending_shutdown_map_.erase(multi_iter); 316 render_view_host_pending_shutdown_map_.erase(multi_iter);
296 } 317 }
297 break; 318 break;
298 } 319 }
299 CHECK(render_view_host_found); 320 CHECK(render_view_host_found);
300 } 321 }
301 } 322 }
302 323
303 } // namespace content 324 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/frame_tree.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698