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/render_frame_host_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
6 | 6 |
7 #include <algorithm> | |
7 #include <utility> | 8 #include <utility> |
8 | 9 |
9 #include "base/command_line.h" | 10 #include "base/command_line.h" |
10 #include "base/logging.h" | 11 #include "base/logging.h" |
11 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
12 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
13 #include "content/browser/child_process_security_policy_impl.h" | 14 #include "content/browser/child_process_security_policy_impl.h" |
14 #include "content/browser/devtools/render_frame_devtools_agent_host.h" | 15 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
15 #include "content/browser/frame_host/cross_site_transferring_request.h" | 16 #include "content/browser/frame_host/cross_site_transferring_request.h" |
16 #include "content/browser/frame_host/debug_urls.h" | 17 #include "content/browser/frame_host/debug_urls.h" |
17 #include "content/browser/frame_host/frame_navigation_entry.h" | 18 #include "content/browser/frame_host/frame_navigation_entry.h" |
18 #include "content/browser/frame_host/interstitial_page_impl.h" | 19 #include "content/browser/frame_host/interstitial_page_impl.h" |
19 #include "content/browser/frame_host/navigation_controller_impl.h" | 20 #include "content/browser/frame_host/navigation_controller_impl.h" |
20 #include "content/browser/frame_host/navigation_entry_impl.h" | 21 #include "content/browser/frame_host/navigation_entry_impl.h" |
21 #include "content/browser/frame_host/navigation_request.h" | 22 #include "content/browser/frame_host/navigation_request.h" |
22 #include "content/browser/frame_host/navigator.h" | 23 #include "content/browser/frame_host/navigator.h" |
23 #include "content/browser/frame_host/render_frame_host_factory.h" | 24 #include "content/browser/frame_host/render_frame_host_factory.h" |
24 #include "content/browser/frame_host/render_frame_host_impl.h" | 25 #include "content/browser/frame_host/render_frame_host_impl.h" |
25 #include "content/browser/frame_host/render_frame_proxy_host.h" | 26 #include "content/browser/frame_host/render_frame_proxy_host.h" |
26 #include "content/browser/renderer_host/render_process_host_impl.h" | 27 #include "content/browser/renderer_host/render_process_host_impl.h" |
27 #include "content/browser/renderer_host/render_view_host_factory.h" | 28 #include "content/browser/renderer_host/render_view_host_factory.h" |
28 #include "content/browser/renderer_host/render_view_host_impl.h" | 29 #include "content/browser/renderer_host/render_view_host_impl.h" |
29 #include "content/browser/site_instance_impl.h" | 30 #include "content/browser/site_instance_impl.h" |
30 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 31 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
31 #include "content/browser/webui/web_ui_impl.h" | 32 #include "content/browser/webui/web_ui_impl.h" |
32 #include "content/common/frame_messages.h" | 33 #include "content/common/frame_messages.h" |
33 #include "content/common/view_messages.h" | 34 #include "content/common/view_messages.h" |
34 #include "content/public/browser/content_browser_client.h" | 35 #include "content/public/browser/content_browser_client.h" |
35 #include "content/public/browser/notification_service.h" | 36 #include "content/public/browser/render_process_host_observer.h" |
36 #include "content/public/browser/notification_types.h" | |
37 #include "content/public/browser/render_widget_host_iterator.h" | 37 #include "content/public/browser/render_widget_host_iterator.h" |
38 #include "content/public/browser/render_widget_host_view.h" | 38 #include "content/public/browser/render_widget_host_view.h" |
39 #include "content/public/browser/user_metrics.h" | 39 #include "content/public/browser/user_metrics.h" |
40 #include "content/public/browser/web_ui_controller.h" | 40 #include "content/public/browser/web_ui_controller.h" |
41 #include "content/public/common/content_switches.h" | 41 #include "content/public/common/content_switches.h" |
42 #include "content/public/common/referrer.h" | 42 #include "content/public/common/referrer.h" |
43 #include "content/public/common/url_constants.h" | 43 #include "content/public/common/url_constants.h" |
44 | 44 |
45 namespace content { | 45 namespace content { |
46 | 46 |
47 // A helper class to hold all frame proxies and register as a | |
48 // RenderProcessHostObserver for them. | |
49 class RenderFrameHostManager::RenderFrameProxyHostMap | |
50 : public RenderProcessHostObserver { | |
51 public: | |
52 typedef base::hash_map<int32, RenderFrameProxyHost*> MapType; | |
ncarter (slow)
2015/07/21 19:07:14
using MapType = base::hash_map<int32, RenderFrameP
Avi (use Gerrit)
2015/07/21 20:45:16
Done.
| |
53 | |
54 RenderFrameProxyHostMap(RenderFrameHostManager* manager); | |
55 ~RenderFrameProxyHostMap() override; | |
56 | |
57 // Read-only access to the underlying map of site instance ID to | |
58 // RenderFrameProxyHosts. | |
59 MapType::const_iterator begin() { return map_.begin(); } | |
ncarter (slow)
2015/07/21 19:07:15
Should these accessors be const, to fit the flavor
Avi (use Gerrit)
2015/07/21 20:45:16
Done.
| |
60 MapType::const_iterator end() { return map_.end(); } | |
61 bool empty() { return map_.empty(); } | |
62 | |
63 // Returns the proxy with the specified ID, or nullptr if there is no such | |
64 // one. | |
65 RenderFrameProxyHost* Get(int32 id); | |
66 | |
67 // Adds the specified proxy with the specified ID. It is an error (and fatal) | |
68 // to add more than one proxy with the specified ID. | |
69 void Add(int32 id, scoped_ptr<RenderFrameProxyHost> proxy); | |
70 | |
71 // Removes the proxy with the specified site instance ID. | |
72 void Remove(int32 id); | |
73 | |
74 // Removes all proxies. | |
75 void Clear(); | |
76 | |
77 // RenderProcessHostObserver implementation. | |
78 void RenderProcessWillExit(RenderProcessHost* host) override; | |
79 void RenderProcessExited(RenderProcessHost* host, | |
80 base::TerminationStatus status, | |
81 int exit_code) override; | |
82 | |
83 private: | |
84 RenderFrameHostManager* manager_; | |
85 MapType map_; | |
86 }; | |
87 | |
88 RenderFrameHostManager::RenderFrameProxyHostMap::RenderFrameProxyHostMap( | |
89 RenderFrameHostManager* manager) | |
90 : manager_(manager) {} | |
91 | |
92 RenderFrameHostManager::RenderFrameProxyHostMap::~RenderFrameProxyHostMap() { | |
93 Clear(); | |
94 } | |
95 | |
96 RenderFrameProxyHost* RenderFrameHostManager::RenderFrameProxyHostMap::Get( | |
97 int32 id) { | |
98 auto it = map_.find(id); | |
99 if (it != map_.end()) | |
100 return it->second; | |
101 return nullptr; | |
102 } | |
103 | |
104 void RenderFrameHostManager::RenderFrameProxyHostMap::Add( | |
105 int32 id, | |
106 scoped_ptr<RenderFrameProxyHost> proxy) { | |
107 CHECK_EQ(0u, map_.count(id)) << "Inserting a duplicate item."; | |
108 | |
109 // If this is the first proxy that has this process host, observe the | |
110 // process host. | |
111 RenderProcessHost* host = proxy->GetProcess(); | |
112 size_t count = | |
113 std::count_if(begin(), end(), [host](MapType::value_type item) { | |
114 return item.second->GetProcess() == host; | |
115 }); | |
116 if (count == 0) | |
117 host->AddObserver(this); | |
118 | |
119 map_[id] = proxy.release(); | |
120 } | |
121 | |
122 void RenderFrameHostManager::RenderFrameProxyHostMap::Remove(int32 id) { | |
123 auto it = map_.find(id); | |
124 if (it == map_.end()) | |
125 return; | |
126 | |
127 // If this is the last proxy that has this process host, stop observing the | |
128 // process host. | |
129 RenderProcessHost* host = it->second->GetProcess(); | |
130 size_t count = | |
131 std::count_if(begin(), end(), [host](MapType::value_type item) { | |
132 return item.second->GetProcess() == host; | |
133 }); | |
134 if (count == 1) | |
135 host->RemoveObserver(this); | |
136 | |
137 delete it->second; | |
138 map_.erase(it); | |
139 } | |
140 | |
141 void RenderFrameHostManager::RenderFrameProxyHostMap::Clear() { | |
142 std::set<RenderProcessHost*> hosts; | |
143 for (const auto& pair : map_) | |
144 hosts.insert(pair.second->GetProcess()); | |
145 for (auto host : hosts) | |
146 host->RemoveObserver(this); | |
147 | |
148 STLDeleteValues(&map_); | |
149 } | |
150 | |
151 void RenderFrameHostManager::RenderFrameProxyHostMap::RenderProcessWillExit( | |
152 RenderProcessHost* host) { | |
153 manager_->RendererProcessClosing(host); | |
154 } | |
155 | |
156 void RenderFrameHostManager::RenderFrameProxyHostMap::RenderProcessExited( | |
157 RenderProcessHost* host, | |
158 base::TerminationStatus status, | |
159 int exit_code) { | |
160 manager_->RendererProcessClosing(host); | |
161 } | |
162 | |
47 // static | 163 // static |
48 bool RenderFrameHostManager::ClearRFHsPendingShutdown(FrameTreeNode* node) { | 164 bool RenderFrameHostManager::ClearRFHsPendingShutdown(FrameTreeNode* node) { |
49 node->render_manager()->pending_delete_hosts_.clear(); | 165 node->render_manager()->pending_delete_hosts_.clear(); |
50 return true; | 166 return true; |
51 } | 167 } |
52 | 168 |
53 // static | 169 // static |
54 bool RenderFrameHostManager::IsSwappedOutStateForbidden() { | 170 bool RenderFrameHostManager::IsSwappedOutStateForbidden() { |
55 return base::CommandLine::ForCurrentProcess()->HasSwitch( | 171 return base::CommandLine::ForCurrentProcess()->HasSwitch( |
56 switches::kSitePerProcess); | 172 switches::kSitePerProcess); |
57 } | 173 } |
58 | 174 |
59 RenderFrameHostManager::RenderFrameHostManager( | 175 RenderFrameHostManager::RenderFrameHostManager( |
60 FrameTreeNode* frame_tree_node, | 176 FrameTreeNode* frame_tree_node, |
61 RenderFrameHostDelegate* render_frame_delegate, | 177 RenderFrameHostDelegate* render_frame_delegate, |
62 RenderViewHostDelegate* render_view_delegate, | 178 RenderViewHostDelegate* render_view_delegate, |
63 RenderWidgetHostDelegate* render_widget_delegate, | 179 RenderWidgetHostDelegate* render_widget_delegate, |
64 Delegate* delegate) | 180 Delegate* delegate) |
65 : frame_tree_node_(frame_tree_node), | 181 : frame_tree_node_(frame_tree_node), |
66 delegate_(delegate), | 182 delegate_(delegate), |
67 render_frame_delegate_(render_frame_delegate), | 183 render_frame_delegate_(render_frame_delegate), |
68 render_view_delegate_(render_view_delegate), | 184 render_view_delegate_(render_view_delegate), |
69 render_widget_delegate_(render_widget_delegate), | 185 render_widget_delegate_(render_widget_delegate), |
186 proxy_hosts_(new RenderFrameProxyHostMap(this)), | |
70 interstitial_page_(nullptr), | 187 interstitial_page_(nullptr), |
71 should_reuse_web_ui_(false), | 188 should_reuse_web_ui_(false), |
72 weak_factory_(this) { | 189 weak_factory_(this) { |
73 DCHECK(frame_tree_node_); | 190 DCHECK(frame_tree_node_); |
74 } | 191 } |
75 | 192 |
76 RenderFrameHostManager::~RenderFrameHostManager() { | 193 RenderFrameHostManager::~RenderFrameHostManager() { |
77 if (pending_render_frame_host_) { | 194 if (pending_render_frame_host_) { |
78 scoped_ptr<RenderFrameHostImpl> relic = UnsetPendingRenderFrameHost(); | 195 scoped_ptr<RenderFrameHostImpl> relic = UnsetPendingRenderFrameHost(); |
79 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); | 196 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); |
80 } | 197 } |
81 | 198 |
82 if (speculative_render_frame_host_) { | 199 if (speculative_render_frame_host_) { |
83 scoped_ptr<RenderFrameHostImpl> relic = UnsetSpeculativeRenderFrameHost(); | 200 scoped_ptr<RenderFrameHostImpl> relic = UnsetSpeculativeRenderFrameHost(); |
84 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); | 201 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); |
85 } | 202 } |
86 | 203 |
87 ShutdownProxiesIfLastActiveFrameInSiteInstance(render_frame_host_.get()); | 204 ShutdownProxiesIfLastActiveFrameInSiteInstance(render_frame_host_.get()); |
88 | 205 |
89 // Delete any RenderFrameProxyHosts and swapped out RenderFrameHosts. | 206 // Delete any RenderFrameProxyHosts and swapped out RenderFrameHosts. |
90 // It is important to delete those prior to deleting the current | 207 // It is important to delete those prior to deleting the current |
91 // RenderFrameHost, since the CrossProcessFrameConnector (owned by | 208 // RenderFrameHost, since the CrossProcessFrameConnector (owned by |
92 // RenderFrameProxyHost) points to the RenderWidgetHostView associated with | 209 // RenderFrameProxyHost) points to the RenderWidgetHostView associated with |
93 // the current RenderFrameHost and uses it during its destructor. | 210 // the current RenderFrameHost and uses it during its destructor. |
94 STLDeleteValues(&proxy_hosts_); | 211 ResetProxyHosts(); |
95 | 212 |
96 // Release the WebUI prior to resetting the current RenderFrameHost, as the | 213 // Release the WebUI prior to resetting the current RenderFrameHost, as the |
97 // WebUI accesses the RenderFrameHost during cleanup. | 214 // WebUI accesses the RenderFrameHost during cleanup. |
98 web_ui_.reset(); | 215 web_ui_.reset(); |
99 | 216 |
100 // We should always have a current RenderFrameHost except in some tests. | 217 // We should always have a current RenderFrameHost except in some tests. |
101 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); | 218 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); |
102 } | 219 } |
103 | 220 |
104 void RenderFrameHostManager::Init(BrowserContext* browser_context, | 221 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
(...skipping 10 matching lines...) Expand all Loading... | |
115 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, | 232 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, |
116 frame_routing_id, flags)); | 233 frame_routing_id, flags)); |
117 | 234 |
118 // Notify the delegate of the creation of the current RenderFrameHost. | 235 // Notify the delegate of the creation of the current RenderFrameHost. |
119 // Do this only for subframes, as the main frame case is taken care of by | 236 // Do this only for subframes, as the main frame case is taken care of by |
120 // WebContentsImpl::Init. | 237 // WebContentsImpl::Init. |
121 if (!frame_tree_node_->IsMainFrame()) { | 238 if (!frame_tree_node_->IsMainFrame()) { |
122 delegate_->NotifySwappedFromRenderManager( | 239 delegate_->NotifySwappedFromRenderManager( |
123 nullptr, render_frame_host_.get(), false); | 240 nullptr, render_frame_host_.get(), false); |
124 } | 241 } |
125 | |
126 // Keep track of renderer processes as they start to shut down or are | |
127 // crashed/killed. | |
128 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, | |
129 NotificationService::AllSources()); | |
130 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, | |
131 NotificationService::AllSources()); | |
132 } | 242 } |
133 | 243 |
134 RenderViewHostImpl* RenderFrameHostManager::current_host() const { | 244 RenderViewHostImpl* RenderFrameHostManager::current_host() const { |
135 if (!render_frame_host_) | 245 if (!render_frame_host_) |
136 return NULL; | 246 return nullptr; |
137 return render_frame_host_->render_view_host(); | 247 return render_frame_host_->render_view_host(); |
138 } | 248 } |
139 | 249 |
140 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { | 250 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { |
141 if (!pending_render_frame_host_) | 251 if (!pending_render_frame_host_) |
142 return NULL; | 252 return nullptr; |
143 return pending_render_frame_host_->render_view_host(); | 253 return pending_render_frame_host_->render_view_host(); |
144 } | 254 } |
145 | 255 |
146 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { | 256 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { |
147 if (interstitial_page_) | 257 if (interstitial_page_) |
148 return interstitial_page_->GetView(); | 258 return interstitial_page_->GetView(); |
149 if (render_frame_host_) | 259 if (render_frame_host_) |
150 return render_frame_host_->GetView(); | 260 return render_frame_host_->GetView(); |
151 return nullptr; | 261 return nullptr; |
152 } | 262 } |
(...skipping 15 matching lines...) Expand all Loading... | |
168 FrameTreeNode* outer_contents_frame_tree_node = | 278 FrameTreeNode* outer_contents_frame_tree_node = |
169 FrameTreeNode::GloballyFindByID( | 279 FrameTreeNode::GloballyFindByID( |
170 delegate_->GetOuterDelegateFrameTreeNodeID()); | 280 delegate_->GetOuterDelegateFrameTreeNodeID()); |
171 return outer_contents_frame_tree_node->parent() | 281 return outer_contents_frame_tree_node->parent() |
172 ->current_frame_host() | 282 ->current_frame_host() |
173 ->render_view_host(); | 283 ->render_view_host(); |
174 } | 284 } |
175 | 285 |
176 RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() { | 286 RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() { |
177 if (frame_tree_node_->IsMainFrame()) | 287 if (frame_tree_node_->IsMainFrame()) |
178 return NULL; | 288 return nullptr; |
179 | 289 |
180 RenderFrameProxyHostMap::iterator iter = | 290 return proxy_hosts_->Get(frame_tree_node_->parent() |
181 proxy_hosts_.find(frame_tree_node_->parent() | 291 ->render_manager() |
182 ->render_manager() | 292 ->current_frame_host() |
183 ->current_frame_host() | 293 ->GetSiteInstance() |
184 ->GetSiteInstance() | 294 ->GetId()); |
185 ->GetId()); | |
186 if (iter == proxy_hosts_.end()) | |
187 return NULL; | |
188 | |
189 return iter->second; | |
190 } | 295 } |
191 | 296 |
192 RenderFrameProxyHost* RenderFrameHostManager::GetProxyToOuterDelegate() { | 297 RenderFrameProxyHost* RenderFrameHostManager::GetProxyToOuterDelegate() { |
193 int outer_contents_frame_tree_node_id = | 298 int outer_contents_frame_tree_node_id = |
194 delegate_->GetOuterDelegateFrameTreeNodeID(); | 299 delegate_->GetOuterDelegateFrameTreeNodeID(); |
195 FrameTreeNode* outer_contents_frame_tree_node = | 300 FrameTreeNode* outer_contents_frame_tree_node = |
196 FrameTreeNode::GloballyFindByID(outer_contents_frame_tree_node_id); | 301 FrameTreeNode::GloballyFindByID(outer_contents_frame_tree_node_id); |
197 if (!outer_contents_frame_tree_node || | 302 if (!outer_contents_frame_tree_node || |
198 !outer_contents_frame_tree_node->parent()) { | 303 !outer_contents_frame_tree_node->parent()) { |
199 return nullptr; | 304 return nullptr; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
243 // Create a pending RenderFrameHost to use for the navigation. | 348 // Create a pending RenderFrameHost to use for the navigation. |
244 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( | 349 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( |
245 dest_url, | 350 dest_url, |
246 // TODO(creis): Move source_site_instance to FNE. | 351 // TODO(creis): Move source_site_instance to FNE. |
247 entry.source_site_instance(), frame_entry.site_instance(), | 352 entry.source_site_instance(), frame_entry.site_instance(), |
248 entry.GetTransitionType(), | 353 entry.GetTransitionType(), |
249 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, | 354 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, |
250 entry.IsViewSourceMode(), entry.transferred_global_request_id(), | 355 entry.IsViewSourceMode(), entry.transferred_global_request_id(), |
251 entry.bindings()); | 356 entry.bindings()); |
252 if (!dest_render_frame_host) | 357 if (!dest_render_frame_host) |
253 return NULL; // We weren't able to create a pending render frame host. | 358 return nullptr; // We weren't able to create a pending render frame host. |
254 | 359 |
255 // If the current render_frame_host_ isn't live, we should create it so | 360 // If the current render_frame_host_ isn't live, we should create it so |
256 // that we don't show a sad tab while the dest_render_frame_host fetches | 361 // that we don't show a sad tab while the dest_render_frame_host fetches |
257 // its first page. (Bug 1145340) | 362 // its first page. (Bug 1145340) |
258 if (dest_render_frame_host != render_frame_host_ && | 363 if (dest_render_frame_host != render_frame_host_ && |
259 !render_frame_host_->IsRenderFrameLive()) { | 364 !render_frame_host_->IsRenderFrameLive()) { |
260 // Note: we don't call InitRenderView here because we are navigating away | 365 // Note: we don't call InitRenderView here because we are navigating away |
261 // soon anyway, and we don't have the NavigationEntry for this host. | 366 // soon anyway, and we don't have the NavigationEntry for this host. |
262 delegate_->CreateRenderViewForRenderManager( | 367 delegate_->CreateRenderViewForRenderManager( |
263 render_frame_host_->render_view_host(), MSG_ROUTING_NONE, | 368 render_frame_host_->render_view_host(), MSG_ROUTING_NONE, |
(...skipping 11 matching lines...) Expand all Loading... | |
275 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI | 380 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI |
276 // site that is handled via Mojo, then Mojo WebUI code in //chrome will | 381 // site that is handled via Mojo, then Mojo WebUI code in //chrome will |
277 // add a service to this RFH's ServiceRegistry). | 382 // add a service to this RFH's ServiceRegistry). |
278 dest_render_frame_host->SetUpMojoIfNeeded(); | 383 dest_render_frame_host->SetUpMojoIfNeeded(); |
279 | 384 |
280 // Recreate the opener chain. | 385 // Recreate the opener chain. |
281 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); | 386 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); |
282 if (!InitRenderView(dest_render_frame_host->render_view_host(), | 387 if (!InitRenderView(dest_render_frame_host->render_view_host(), |
283 MSG_ROUTING_NONE, | 388 MSG_ROUTING_NONE, |
284 frame_tree_node_->IsMainFrame())) | 389 frame_tree_node_->IsMainFrame())) |
285 return NULL; | 390 return nullptr; |
286 | 391 |
287 // Now that we've created a new renderer, be sure to hide it if it isn't | 392 // Now that we've created a new renderer, be sure to hide it if it isn't |
288 // our primary one. Otherwise, we might crash if we try to call Show() | 393 // our primary one. Otherwise, we might crash if we try to call Show() |
289 // on it later. | 394 // on it later. |
290 if (dest_render_frame_host != render_frame_host_) { | 395 if (dest_render_frame_host != render_frame_host_) { |
291 if (dest_render_frame_host->GetView()) | 396 if (dest_render_frame_host->GetView()) |
292 dest_render_frame_host->GetView()->Hide(); | 397 dest_render_frame_host->GetView()->Hide(); |
293 } else { | 398 } else { |
294 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 399 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
295 // manager still uses NotificationService and expects to see a | 400 // manager still uses NotificationService and expects to see a |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
534 } else { | 639 } else { |
535 // No one else should be sending us DidNavigate in this state. | 640 // No one else should be sending us DidNavigate in this state. |
536 DCHECK(false); | 641 DCHECK(false); |
537 } | 642 } |
538 } | 643 } |
539 | 644 |
540 void RenderFrameHostManager::DidDisownOpener( | 645 void RenderFrameHostManager::DidDisownOpener( |
541 RenderFrameHost* render_frame_host) { | 646 RenderFrameHost* render_frame_host) { |
542 // Notify all RenderFrameHosts but the one that notified us. This is necessary | 647 // Notify all RenderFrameHosts but the one that notified us. This is necessary |
543 // in case a process swap has occurred while the message was in flight. | 648 // in case a process swap has occurred while the message was in flight. |
544 for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin(); | 649 for (const auto& pair : *proxy_hosts_) { |
545 iter != proxy_hosts_.end(); | 650 DCHECK_NE(pair.second->GetSiteInstance(), |
546 ++iter) { | |
547 DCHECK_NE(iter->second->GetSiteInstance(), | |
548 current_frame_host()->GetSiteInstance()); | 651 current_frame_host()->GetSiteInstance()); |
549 iter->second->DisownOpener(); | 652 pair.second->DisownOpener(); |
550 } | 653 } |
551 | 654 |
552 if (render_frame_host_.get() != render_frame_host) | 655 if (render_frame_host_.get() != render_frame_host) |
553 render_frame_host_->DisownOpener(); | 656 render_frame_host_->DisownOpener(); |
554 | 657 |
555 if (pending_render_frame_host_ && | 658 if (pending_render_frame_host_ && |
556 pending_render_frame_host_.get() != render_frame_host) { | 659 pending_render_frame_host_.get() != render_frame_host) { |
557 pending_render_frame_host_->DisownOpener(); | 660 pending_render_frame_host_->DisownOpener(); |
558 } | 661 } |
559 } | 662 } |
560 | 663 |
561 void RenderFrameHostManager::CommitPendingSandboxFlags() { | 664 void RenderFrameHostManager::CommitPendingSandboxFlags() { |
562 // Return early if there were no pending sandbox flags updates. | 665 // Return early if there were no pending sandbox flags updates. |
563 if (!frame_tree_node_->CommitPendingSandboxFlags()) | 666 if (!frame_tree_node_->CommitPendingSandboxFlags()) |
564 return; | 667 return; |
565 | 668 |
566 // Sandbox flags updates can only happen when the frame has a parent. | 669 // Sandbox flags updates can only happen when the frame has a parent. |
567 CHECK(frame_tree_node_->parent()); | 670 CHECK(frame_tree_node_->parent()); |
568 | 671 |
569 // Notify all of the frame's proxies about updated sandbox flags, excluding | 672 // Notify all of the frame's proxies about updated sandbox flags, excluding |
570 // the parent process since it already knows the latest flags. | 673 // the parent process since it already knows the latest flags. |
571 SiteInstance* parent_site_instance = | 674 SiteInstance* parent_site_instance = |
572 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance(); | 675 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance(); |
573 for (const auto& pair : proxy_hosts_) { | 676 for (const auto& pair : *proxy_hosts_) { |
574 if (pair.second->GetSiteInstance() != parent_site_instance) { | 677 if (pair.second->GetSiteInstance() != parent_site_instance) { |
575 pair.second->Send(new FrameMsg_DidUpdateSandboxFlags( | 678 pair.second->Send(new FrameMsg_DidUpdateSandboxFlags( |
576 pair.second->GetRoutingID(), | 679 pair.second->GetRoutingID(), |
577 frame_tree_node_->current_replication_state().sandbox_flags)); | 680 frame_tree_node_->current_replication_state().sandbox_flags)); |
578 } | 681 } |
579 } | 682 } |
580 } | 683 } |
581 | 684 |
582 void RenderFrameHostManager::RendererProcessClosing( | 685 void RenderFrameHostManager::RendererProcessClosing( |
583 RenderProcessHost* render_process_host) { | 686 RenderProcessHost* render_process_host) { |
584 // Remove any swapped out RVHs from this process, so that we don't try to | 687 // Remove any swapped out RVHs from this process, so that we don't try to |
585 // swap them back in while the process is exiting. Start by finding them, | 688 // swap them back in while the process is exiting. Start by finding them, |
586 // since there could be more than one. | 689 // since there could be more than one. |
587 std::list<int> ids_to_remove; | 690 std::list<int> ids_to_remove; |
588 // Do not remove proxies in the dead process that still have active frame | 691 // Do not remove proxies in the dead process that still have active frame |
589 // count though, we just reset them to be uninitialized. | 692 // count though, we just reset them to be uninitialized. |
590 std::list<int> ids_to_keep; | 693 std::list<int> ids_to_keep; |
591 for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin(); | 694 for (const auto& pair : *proxy_hosts_) { |
ncarter (slow)
2015/07/21 19:07:14
This is cool.
Avi (use Gerrit)
2015/07/21 20:45:16
Thanks!
| |
592 iter != proxy_hosts_.end(); | 695 RenderFrameProxyHost* proxy = pair.second; |
593 ++iter) { | |
594 RenderFrameProxyHost* proxy = iter->second; | |
595 if (proxy->GetProcess() != render_process_host) | 696 if (proxy->GetProcess() != render_process_host) |
596 continue; | 697 continue; |
597 | 698 |
598 if (static_cast<SiteInstanceImpl*>(proxy->GetSiteInstance()) | 699 if (static_cast<SiteInstanceImpl*>(proxy->GetSiteInstance()) |
599 ->active_frame_count() >= 1U) { | 700 ->active_frame_count() >= 1U) { |
600 ids_to_keep.push_back(iter->first); | 701 ids_to_keep.push_back(pair.first); |
601 } else { | 702 } else { |
602 ids_to_remove.push_back(iter->first); | 703 ids_to_remove.push_back(pair.first); |
603 } | 704 } |
604 } | 705 } |
605 | 706 |
606 // Now delete them. | 707 // Now delete them. |
607 while (!ids_to_remove.empty()) { | 708 while (!ids_to_remove.empty()) { |
608 delete proxy_hosts_[ids_to_remove.back()]; | 709 proxy_hosts_->Remove(ids_to_remove.back()); |
609 proxy_hosts_.erase(ids_to_remove.back()); | |
610 ids_to_remove.pop_back(); | 710 ids_to_remove.pop_back(); |
611 } | 711 } |
612 | 712 |
613 while (!ids_to_keep.empty()) { | 713 while (!ids_to_keep.empty()) { |
614 frame_tree_node_->frame_tree()->ForEach( | 714 frame_tree_node_->frame_tree()->ForEach( |
615 base::Bind( | 715 base::Bind( |
616 &RenderFrameHostManager::ResetProxiesInSiteInstance, | 716 &RenderFrameHostManager::ResetProxiesInSiteInstance, |
617 ids_to_keep.back())); | 717 ids_to_keep.back())); |
618 ids_to_keep.pop_back(); | 718 ids_to_keep.pop_back(); |
619 } | 719 } |
(...skipping 28 matching lines...) Expand all Loading... | |
648 // RenderFrameHost once it runs its unload handler, without replacing it with | 748 // RenderFrameHost once it runs its unload handler, without replacing it with |
649 // a proxy. | 749 // a proxy. |
650 size_t active_frame_count = | 750 size_t active_frame_count = |
651 old_render_frame_host->GetSiteInstance()->active_frame_count(); | 751 old_render_frame_host->GetSiteInstance()->active_frame_count(); |
652 if (active_frame_count <= 1) { | 752 if (active_frame_count <= 1) { |
653 // Clear out any proxies from this SiteInstance, in case this was the | 753 // Clear out any proxies from this SiteInstance, in case this was the |
654 // last one keeping other proxies alive. | 754 // last one keeping other proxies alive. |
655 ShutdownProxiesIfLastActiveFrameInSiteInstance(old_render_frame_host.get()); | 755 ShutdownProxiesIfLastActiveFrameInSiteInstance(old_render_frame_host.get()); |
656 | 756 |
657 // Tell the old RenderFrameHost to swap out, with no proxy to replace it. | 757 // Tell the old RenderFrameHost to swap out, with no proxy to replace it. |
658 old_render_frame_host->SwapOut(NULL, true); | 758 old_render_frame_host->SwapOut(nullptr, true); |
659 MoveToPendingDeleteHosts(old_render_frame_host.Pass()); | 759 MoveToPendingDeleteHosts(old_render_frame_host.Pass()); |
660 return; | 760 return; |
661 } | 761 } |
662 | 762 |
663 // Otherwise there are active views and we need a proxy for the old RFH. | 763 // Otherwise there are active views and we need a proxy for the old RFH. |
664 // (There should not be one yet.) | 764 // (There should not be one yet.) |
665 CHECK(!GetRenderFrameProxyHost(old_render_frame_host->GetSiteInstance())); | 765 scoped_ptr<RenderFrameProxyHost> scoped_proxy(new RenderFrameProxyHost( |
666 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | |
667 old_render_frame_host->GetSiteInstance(), | 766 old_render_frame_host->GetSiteInstance(), |
668 old_render_frame_host->render_view_host(), frame_tree_node_); | 767 old_render_frame_host->render_view_host(), frame_tree_node_)); |
669 CHECK(proxy_hosts_.insert(std::make_pair(old_site_instance_id, proxy)).second) | 768 RenderFrameProxyHost* proxy = scoped_proxy.get(); |
ncarter (slow)
2015/07/21 19:07:14
You could simplify this a little by eliminating th
Avi (use Gerrit)
2015/07/21 20:45:16
That's a little cleaner; I'll go with that. I just
| |
670 << "Inserting a duplicate item."; | 769 proxy_hosts_->Add(old_site_instance_id, scoped_proxy.Pass()); |
671 | 770 |
672 // Tell the old RenderFrameHost to swap out and be replaced by the proxy. | 771 // Tell the old RenderFrameHost to swap out and be replaced by the proxy. |
673 old_render_frame_host->SwapOut(proxy, true); | 772 old_render_frame_host->SwapOut(proxy, true); |
674 | 773 |
675 // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized. | 774 // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized. |
676 proxy->set_render_frame_proxy_created(true); | 775 proxy->set_render_frame_proxy_created(true); |
677 | 776 |
678 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { | 777 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { |
679 // In --site-per-process, frames delete their RFH rather than storing it | 778 // In --site-per-process, frames delete their RFH rather than storing it |
680 // in the proxy. Schedule it for deletion once the SwapOutACK comes in. | 779 // in the proxy. Schedule it for deletion once the SwapOutACK comes in. |
(...skipping 17 matching lines...) Expand all Loading... | |
698 | 797 |
699 // If the SiteInstance for the pending RFH is being used by others don't | 798 // If the SiteInstance for the pending RFH is being used by others don't |
700 // delete the RFH. Just swap it out and it can be reused at a later point. | 799 // delete the RFH. Just swap it out and it can be reused at a later point. |
701 // In --site-per-process, RenderFrameHosts are not kept around and are | 800 // In --site-per-process, RenderFrameHosts are not kept around and are |
702 // deleted when not used, replaced by RenderFrameProxyHosts. | 801 // deleted when not used, replaced by RenderFrameProxyHosts. |
703 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance(); | 802 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance(); |
704 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) { | 803 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) { |
705 // Any currently suspended navigations are no longer needed. | 804 // Any currently suspended navigations are no longer needed. |
706 render_frame_host->CancelSuspendedNavigations(); | 805 render_frame_host->CancelSuspendedNavigations(); |
707 | 806 |
708 CHECK(!GetRenderFrameProxyHost(site_instance)); | 807 scoped_ptr<RenderFrameProxyHost> scoped_proxy(new RenderFrameProxyHost( |
709 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 808 site_instance, render_frame_host->render_view_host(), |
710 site_instance, render_frame_host->render_view_host(), frame_tree_node_); | 809 frame_tree_node_)); |
711 proxy_hosts_[site_instance->GetId()] = proxy; | 810 RenderFrameProxyHost* proxy = scoped_proxy.get(); |
ncarter (slow)
2015/07/21 19:07:14
Ditto.
Avi (use Gerrit)
2015/07/21 20:45:16
Done.
| |
811 proxy_hosts_->Add(site_instance->GetId(), scoped_proxy.Pass()); | |
712 | 812 |
713 // Check if the RenderFrameHost is already swapped out, to avoid swapping it | 813 // Check if the RenderFrameHost is already swapped out, to avoid swapping it |
714 // out again. | 814 // out again. |
715 if (!render_frame_host->is_swapped_out()) | 815 if (!render_frame_host->is_swapped_out()) |
716 render_frame_host->SwapOut(proxy, false); | 816 render_frame_host->SwapOut(proxy, false); |
717 | 817 |
718 if (!RenderFrameHostManager::IsSwappedOutStateForbidden()) { | 818 if (!RenderFrameHostManager::IsSwappedOutStateForbidden()) { |
719 DCHECK(frame_tree_node_->IsMainFrame()); | 819 DCHECK(frame_tree_node_->IsMainFrame()); |
720 proxy->TakeFrameHostOwnership(render_frame_host.Pass()); | 820 proxy->TakeFrameHostOwnership(render_frame_host.Pass()); |
721 } | 821 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
753 iter++) { | 853 iter++) { |
754 if (*iter == render_frame_host) { | 854 if (*iter == render_frame_host) { |
755 pending_delete_hosts_.erase(iter); | 855 pending_delete_hosts_.erase(iter); |
756 return true; | 856 return true; |
757 } | 857 } |
758 } | 858 } |
759 return false; | 859 return false; |
760 } | 860 } |
761 | 861 |
762 void RenderFrameHostManager::ResetProxyHosts() { | 862 void RenderFrameHostManager::ResetProxyHosts() { |
763 STLDeleteValues(&proxy_hosts_); | 863 proxy_hosts_->Clear(); |
764 } | 864 } |
765 | 865 |
766 // PlzNavigate | 866 // PlzNavigate |
767 void RenderFrameHostManager::DidCreateNavigationRequest( | 867 void RenderFrameHostManager::DidCreateNavigationRequest( |
768 const NavigationRequest& request) { | 868 const NavigationRequest& request) { |
769 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 869 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
770 switches::kEnableBrowserSideNavigation)); | 870 switches::kEnableBrowserSideNavigation)); |
771 // Clean up any state in case there's an ongoing navigation. | 871 // Clean up any state in case there's an ongoing navigation. |
772 // TODO(carlosk): remove this cleanup here once we properly cancel ongoing | 872 // TODO(carlosk): remove this cleanup here once we properly cancel ongoing |
773 // navigations. | 873 // navigations. |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
906 // PlzNavigate | 1006 // PlzNavigate |
907 scoped_ptr<RenderFrameHostImpl> | 1007 scoped_ptr<RenderFrameHostImpl> |
908 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { | 1008 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { |
909 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1009 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
910 switches::kEnableBrowserSideNavigation)); | 1010 switches::kEnableBrowserSideNavigation)); |
911 speculative_render_frame_host_->GetProcess()->RemovePendingView(); | 1011 speculative_render_frame_host_->GetProcess()->RemovePendingView(); |
912 return speculative_render_frame_host_.Pass(); | 1012 return speculative_render_frame_host_.Pass(); |
913 } | 1013 } |
914 | 1014 |
915 void RenderFrameHostManager::OnDidStartLoading() { | 1015 void RenderFrameHostManager::OnDidStartLoading() { |
916 for (const auto& pair : proxy_hosts_) { | 1016 for (const auto& pair : *proxy_hosts_) { |
917 pair.second->Send( | 1017 pair.second->Send( |
918 new FrameMsg_DidStartLoading(pair.second->GetRoutingID())); | 1018 new FrameMsg_DidStartLoading(pair.second->GetRoutingID())); |
919 } | 1019 } |
920 } | 1020 } |
921 | 1021 |
922 void RenderFrameHostManager::OnDidStopLoading() { | 1022 void RenderFrameHostManager::OnDidStopLoading() { |
923 for (const auto& pair : proxy_hosts_) { | 1023 for (const auto& pair : *proxy_hosts_) { |
924 pair.second->Send(new FrameMsg_DidStopLoading(pair.second->GetRoutingID())); | 1024 pair.second->Send(new FrameMsg_DidStopLoading(pair.second->GetRoutingID())); |
925 } | 1025 } |
926 } | 1026 } |
927 | 1027 |
928 void RenderFrameHostManager::OnDidUpdateName(const std::string& name) { | 1028 void RenderFrameHostManager::OnDidUpdateName(const std::string& name) { |
929 // The window.name message may be sent outside of --site-per-process when | 1029 // The window.name message may be sent outside of --site-per-process when |
930 // report_frame_name_changes renderer preference is set (used by | 1030 // report_frame_name_changes renderer preference is set (used by |
931 // WebView). Don't send the update to proxies in those cases. | 1031 // WebView). Don't send the update to proxies in those cases. |
932 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 1032 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
933 switches::kSitePerProcess)) | 1033 switches::kSitePerProcess)) |
934 return; | 1034 return; |
935 | 1035 |
936 for (const auto& pair : proxy_hosts_) { | 1036 for (const auto& pair : *proxy_hosts_) { |
937 pair.second->Send( | 1037 pair.second->Send( |
938 new FrameMsg_DidUpdateName(pair.second->GetRoutingID(), name)); | 1038 new FrameMsg_DidUpdateName(pair.second->GetRoutingID(), name)); |
939 } | 1039 } |
940 } | 1040 } |
941 | 1041 |
942 void RenderFrameHostManager::OnDidUpdateOrigin( | 1042 void RenderFrameHostManager::OnDidUpdateOrigin( |
943 const url::DeprecatedSerializedOrigin& origin) { | 1043 const url::DeprecatedSerializedOrigin& origin) { |
944 if (!IsSwappedOutStateForbidden()) | 1044 if (!IsSwappedOutStateForbidden()) |
945 return; | 1045 return; |
946 | 1046 |
947 for (const auto& pair : proxy_hosts_) { | 1047 for (const auto& pair : *proxy_hosts_) { |
948 pair.second->Send( | 1048 pair.second->Send( |
949 new FrameMsg_DidUpdateOrigin(pair.second->GetRoutingID(), origin)); | 1049 new FrameMsg_DidUpdateOrigin(pair.second->GetRoutingID(), origin)); |
950 } | 1050 } |
951 } | 1051 } |
952 | 1052 |
953 void RenderFrameHostManager::Observe( | |
954 int type, | |
955 const NotificationSource& source, | |
956 const NotificationDetails& details) { | |
957 switch (type) { | |
958 case NOTIFICATION_RENDERER_PROCESS_CLOSED: | |
959 case NOTIFICATION_RENDERER_PROCESS_CLOSING: | |
960 RendererProcessClosing( | |
961 Source<RenderProcessHost>(source).ptr()); | |
962 break; | |
963 | |
964 default: | |
965 NOTREACHED(); | |
966 } | |
967 } | |
968 | |
969 RenderFrameHostManager::SiteInstanceDescriptor::SiteInstanceDescriptor( | 1053 RenderFrameHostManager::SiteInstanceDescriptor::SiteInstanceDescriptor( |
970 BrowserContext* browser_context, | 1054 BrowserContext* browser_context, |
971 GURL dest_url, | 1055 GURL dest_url, |
972 bool related_to_current) | 1056 bool related_to_current) |
973 : existing_site_instance(nullptr), | 1057 : existing_site_instance(nullptr), |
974 new_is_related_to_current(related_to_current) { | 1058 new_is_related_to_current(related_to_current) { |
975 new_site_url = SiteInstance::GetSiteForURL(browser_context, dest_url); | 1059 new_site_url = SiteInstance::GetSiteForURL(browser_context, dest_url); |
976 } | 1060 } |
977 | 1061 |
978 // static | 1062 // static |
979 bool RenderFrameHostManager::ClearProxiesInSiteInstance( | 1063 bool RenderFrameHostManager::ClearProxiesInSiteInstance( |
980 int32 site_instance_id, | 1064 int32 site_instance_id, |
981 FrameTreeNode* node) { | 1065 FrameTreeNode* node) { |
982 RenderFrameProxyHostMap::iterator iter = | 1066 RenderFrameProxyHost* proxy = |
983 node->render_manager()->proxy_hosts_.find(site_instance_id); | 1067 node->render_manager()->proxy_hosts_->Get(site_instance_id); |
984 if (iter != node->render_manager()->proxy_hosts_.end()) { | 1068 if (proxy) { |
985 RenderFrameProxyHost* proxy = iter->second; | |
986 // Delete the proxy. If it is for a main frame (and thus the RFH is stored | 1069 // Delete the proxy. If it is for a main frame (and thus the RFH is stored |
987 // in the proxy) and it was still pending swap out, move the RFH to the | 1070 // in the proxy) and it was still pending swap out, move the RFH to the |
988 // pending deletion list first. | 1071 // pending deletion list first. |
989 if (node->IsMainFrame() && | 1072 if (node->IsMainFrame() && |
990 proxy->render_frame_host() && | 1073 proxy->render_frame_host() && |
991 proxy->render_frame_host()->rfh_state() == | 1074 proxy->render_frame_host()->rfh_state() == |
992 RenderFrameHostImpl::STATE_PENDING_SWAP_OUT) { | 1075 RenderFrameHostImpl::STATE_PENDING_SWAP_OUT) { |
993 DCHECK(!RenderFrameHostManager::IsSwappedOutStateForbidden()); | 1076 DCHECK(!RenderFrameHostManager::IsSwappedOutStateForbidden()); |
994 scoped_ptr<RenderFrameHostImpl> swapped_out_rfh = | 1077 scoped_ptr<RenderFrameHostImpl> swapped_out_rfh = |
995 proxy->PassFrameHostOwnership(); | 1078 proxy->PassFrameHostOwnership(); |
996 node->render_manager()->MoveToPendingDeleteHosts(swapped_out_rfh.Pass()); | 1079 node->render_manager()->MoveToPendingDeleteHosts(swapped_out_rfh.Pass()); |
997 } | 1080 } |
998 delete proxy; | 1081 node->render_manager()->proxy_hosts_->Remove(site_instance_id); |
999 node->render_manager()->proxy_hosts_.erase(site_instance_id); | |
1000 } | 1082 } |
1001 | 1083 |
1002 return true; | 1084 return true; |
1003 } | 1085 } |
1004 | 1086 |
1005 // static. | 1087 // static. |
1006 bool RenderFrameHostManager::ResetProxiesInSiteInstance(int32 site_instance_id, | 1088 bool RenderFrameHostManager::ResetProxiesInSiteInstance(int32 site_instance_id, |
1007 FrameTreeNode* node) { | 1089 FrameTreeNode* node) { |
1008 RenderFrameProxyHostMap::iterator iter = | 1090 RenderFrameProxyHost* proxy = |
1009 node->render_manager()->proxy_hosts_.find(site_instance_id); | 1091 node->render_manager()->proxy_hosts_->Get(site_instance_id); |
1010 if (iter != node->render_manager()->proxy_hosts_.end()) | 1092 if (proxy) |
1011 iter->second->set_render_frame_proxy_created(false); | 1093 proxy->set_render_frame_proxy_created(false); |
1012 | 1094 |
1013 return true; | 1095 return true; |
1014 } | 1096 } |
1015 | 1097 |
1016 bool RenderFrameHostManager::ShouldTransitionCrossSite() { | 1098 bool RenderFrameHostManager::ShouldTransitionCrossSite() { |
1017 // True for --site-per-process, which overrides both kSingleProcess and | 1099 // True for --site-per-process, which overrides both kSingleProcess and |
1018 // kProcessPerTab. | 1100 // kProcessPerTab. |
1019 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1101 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
1020 switches::kSitePerProcess)) | 1102 switches::kSitePerProcess)) |
1021 return true; | 1103 return true; |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1548 if (proxy && proxy->render_frame_host()) { | 1630 if (proxy && proxy->render_frame_host()) { |
1549 CHECK(!swapped_out_forbidden); | 1631 CHECK(!swapped_out_forbidden); |
1550 if (view_routing_id_ptr) | 1632 if (view_routing_id_ptr) |
1551 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); | 1633 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); |
1552 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. | 1634 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. |
1553 // Prevent the process from exiting while we're trying to use it. | 1635 // Prevent the process from exiting while we're trying to use it. |
1554 if (!swapped_out) { | 1636 if (!swapped_out) { |
1555 new_render_frame_host = proxy->PassFrameHostOwnership(); | 1637 new_render_frame_host = proxy->PassFrameHostOwnership(); |
1556 new_render_frame_host->GetProcess()->AddPendingView(); | 1638 new_render_frame_host->GetProcess()->AddPendingView(); |
1557 | 1639 |
1558 proxy_hosts_.erase(instance->GetId()); | 1640 proxy_hosts_->Remove(instance->GetId()); |
ncarter (slow)
2015/07/21 19:07:14
Is it worth adding a "// deletes |proxy|" or "prox
Avi (use Gerrit)
2015/07/21 20:45:16
Done.
| |
1559 delete proxy; | |
1560 } | 1641 } |
1561 } else { | 1642 } else { |
1562 // Create a new RenderFrameHost if we don't find an existing one. | 1643 // Create a new RenderFrameHost if we don't find an existing one. |
1563 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE, | 1644 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE, |
1564 MSG_ROUTING_NONE, flags); | 1645 MSG_ROUTING_NONE, flags); |
1565 RenderViewHostImpl* render_view_host = | 1646 RenderViewHostImpl* render_view_host = |
1566 new_render_frame_host->render_view_host(); | 1647 new_render_frame_host->render_view_host(); |
1567 int proxy_routing_id = MSG_ROUTING_NONE; | 1648 int proxy_routing_id = MSG_ROUTING_NONE; |
1568 | 1649 |
1569 // Prevent the process from exiting while we're trying to navigate in it. | 1650 // Prevent the process from exiting while we're trying to navigate in it. |
1570 // Otherwise, if the new RFH is swapped out already, store it. | 1651 // Otherwise, if the new RFH is swapped out already, store it. |
1571 if (!swapped_out) { | 1652 if (!swapped_out) { |
1572 new_render_frame_host->GetProcess()->AddPendingView(); | 1653 new_render_frame_host->GetProcess()->AddPendingView(); |
1573 } else { | 1654 } else { |
1574 proxy = new RenderFrameProxyHost( | 1655 scoped_ptr<RenderFrameProxyHost> scoped_proxy(new RenderFrameProxyHost( |
1575 new_render_frame_host->GetSiteInstance(), | 1656 new_render_frame_host->GetSiteInstance(), |
1576 new_render_frame_host->render_view_host(), frame_tree_node_); | 1657 new_render_frame_host->render_view_host(), frame_tree_node_)); |
1577 proxy_hosts_[instance->GetId()] = proxy; | 1658 proxy = scoped_proxy.get(); |
ncarter (slow)
2015/07/21 19:07:14
Ditto
Avi (use Gerrit)
2015/07/21 20:45:16
Done.
| |
1659 proxy_hosts_->Add(instance->GetId(), scoped_proxy.Pass()); | |
1578 proxy_routing_id = proxy->GetRoutingID(); | 1660 proxy_routing_id = proxy->GetRoutingID(); |
1579 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1661 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1580 } | 1662 } |
1581 | 1663 |
1582 success = InitRenderView(render_view_host, proxy_routing_id, | 1664 success = InitRenderView(render_view_host, proxy_routing_id, |
1583 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); | 1665 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); |
1584 if (success) { | 1666 if (success) { |
1585 // Remember that InitRenderView also created the RenderFrameProxy. | 1667 // Remember that InitRenderView also created the RenderFrameProxy. |
1586 if (swapped_out) | 1668 if (swapped_out) |
1587 proxy->set_render_frame_proxy_created(true); | 1669 proxy->set_render_frame_proxy_created(true); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1651 render_view_host = frame_tree_node_->frame_tree()->CreateRenderViewHost( | 1733 render_view_host = frame_tree_node_->frame_tree()->CreateRenderViewHost( |
1652 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, true, true); | 1734 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, true, true); |
1653 } | 1735 } |
1654 } | 1736 } |
1655 | 1737 |
1656 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1738 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
1657 if (proxy && proxy->is_render_frame_proxy_live()) | 1739 if (proxy && proxy->is_render_frame_proxy_live()) |
1658 return proxy->GetRoutingID(); | 1740 return proxy->GetRoutingID(); |
1659 | 1741 |
1660 if (!proxy) { | 1742 if (!proxy) { |
1661 proxy = new RenderFrameProxyHost( | 1743 scoped_ptr<RenderFrameProxyHost> scoped_proxy( |
1662 instance, render_view_host, frame_tree_node_); | 1744 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_)); |
1663 proxy_hosts_[instance->GetId()] = proxy; | 1745 proxy = scoped_proxy.get(); |
ncarter (slow)
2015/07/21 19:07:14
Ditto
Avi (use Gerrit)
2015/07/21 20:45:16
Done.
| |
1746 proxy_hosts_->Add(instance->GetId(), scoped_proxy.Pass()); | |
1664 } | 1747 } |
1665 | 1748 |
1666 if (RenderFrameHostManager::IsSwappedOutStateForbidden() && | 1749 if (RenderFrameHostManager::IsSwappedOutStateForbidden() && |
1667 frame_tree_node_->IsMainFrame()) { | 1750 frame_tree_node_->IsMainFrame()) { |
1668 InitRenderView(render_view_host, proxy->GetRoutingID(), true); | 1751 InitRenderView(render_view_host, proxy->GetRoutingID(), true); |
1669 proxy->set_render_frame_proxy_created(true); | 1752 proxy->set_render_frame_proxy_created(true); |
1670 } else { | 1753 } else { |
1671 proxy->InitRenderFrameProxy(); | 1754 proxy->InitRenderFrameProxy(); |
1672 } | 1755 } |
1673 | 1756 |
1674 return proxy->GetRoutingID(); | 1757 return proxy->GetRoutingID(); |
1675 } | 1758 } |
1676 | 1759 |
1677 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { | 1760 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { |
1678 for (const auto& pair : proxy_hosts_) { | 1761 for (const auto& pair : *proxy_hosts_) { |
1679 child->render_manager()->CreateRenderFrameProxy( | 1762 child->render_manager()->CreateRenderFrameProxy( |
1680 pair.second->GetSiteInstance()); | 1763 pair.second->GetSiteInstance()); |
1681 } | 1764 } |
1682 } | 1765 } |
1683 | 1766 |
1684 void RenderFrameHostManager::EnsureRenderViewInitialized( | 1767 void RenderFrameHostManager::EnsureRenderViewInitialized( |
1685 RenderViewHostImpl* render_view_host, | 1768 RenderViewHostImpl* render_view_host, |
1686 SiteInstance* instance) { | 1769 SiteInstance* instance) { |
1687 DCHECK(frame_tree_node_->IsMainFrame()); | 1770 DCHECK(frame_tree_node_->IsMainFrame()); |
1688 | 1771 |
(...skipping 11 matching lines...) Expand all Loading... | |
1700 | 1783 |
1701 InitRenderView(render_view_host, proxy->GetRoutingID(), false); | 1784 InitRenderView(render_view_host, proxy->GetRoutingID(), false); |
1702 proxy->set_render_frame_proxy_created(true); | 1785 proxy->set_render_frame_proxy_created(true); |
1703 } | 1786 } |
1704 | 1787 |
1705 void RenderFrameHostManager::CreateOuterDelegateProxy( | 1788 void RenderFrameHostManager::CreateOuterDelegateProxy( |
1706 SiteInstance* outer_contents_site_instance, | 1789 SiteInstance* outer_contents_site_instance, |
1707 RenderFrameHostImpl* render_frame_host) { | 1790 RenderFrameHostImpl* render_frame_host) { |
1708 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1791 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
1709 switches::kSitePerProcess)); | 1792 switches::kSitePerProcess)); |
1710 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 1793 scoped_ptr<RenderFrameProxyHost> scoped_proxy(new RenderFrameProxyHost( |
1711 outer_contents_site_instance, nullptr, frame_tree_node_); | 1794 outer_contents_site_instance, nullptr, frame_tree_node_)); |
1712 proxy_hosts_[outer_contents_site_instance->GetId()] = proxy; | 1795 RenderFrameProxyHost* proxy = scoped_proxy.get(); |
ncarter (slow)
2015/07/21 19:07:14
Ditto
Avi (use Gerrit)
2015/07/21 20:45:16
Done.
| |
1796 proxy_hosts_->Add(outer_contents_site_instance->GetId(), scoped_proxy.Pass()); | |
1713 | 1797 |
1714 // Swap the outer WebContents's frame with the proxy to inner WebContents. | 1798 // Swap the outer WebContents's frame with the proxy to inner WebContents. |
1715 // | 1799 // |
1716 // We are in the outer WebContents, and its FrameTree would never see | 1800 // We are in the outer WebContents, and its FrameTree would never see |
1717 // a load start for any of its inner WebContents. Eventually, that also makes | 1801 // a load start for any of its inner WebContents. Eventually, that also makes |
1718 // the FrameTree never see the matching load stop. Therefore, we always pass | 1802 // the FrameTree never see the matching load stop. Therefore, we always pass |
1719 // false to |is_loading| below. | 1803 // false to |is_loading| below. |
1720 // TODO(lazyboy): This |is_loading| behavior might not be what we want, | 1804 // TODO(lazyboy): This |is_loading| behavior might not be what we want, |
1721 // investigate and fix. | 1805 // investigate and fix. |
1722 render_frame_host->Send(new FrameMsg_SwapOut( | 1806 render_frame_host->Send(new FrameMsg_SwapOut( |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1965 // This will swap it out and then put it on the proxy list (if there are other | 2049 // This will swap it out and then put it on the proxy list (if there are other |
1966 // active views in its SiteInstance) or schedule it for deletion when the swap | 2050 // active views in its SiteInstance) or schedule it for deletion when the swap |
1967 // out ack arrives (or immediately if the process isn't live). | 2051 // out ack arrives (or immediately if the process isn't live). |
1968 // In the --site-per-process case, old subframe RFHs are not kept alive inside | 2052 // In the --site-per-process case, old subframe RFHs are not kept alive inside |
1969 // the proxy. | 2053 // the proxy. |
1970 SwapOutOldFrame(old_render_frame_host.Pass()); | 2054 SwapOutOldFrame(old_render_frame_host.Pass()); |
1971 | 2055 |
1972 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { | 2056 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { |
1973 // Since the new RenderFrameHost is now committed, there must be no proxies | 2057 // Since the new RenderFrameHost is now committed, there must be no proxies |
1974 // for its SiteInstance. Delete any existing ones. | 2058 // for its SiteInstance. Delete any existing ones. |
1975 RenderFrameProxyHostMap::iterator iter = | 2059 proxy_hosts_->Remove(render_frame_host_->GetSiteInstance()->GetId()); |
1976 proxy_hosts_.find(render_frame_host_->GetSiteInstance()->GetId()); | |
1977 if (iter != proxy_hosts_.end()) { | |
1978 delete iter->second; | |
1979 proxy_hosts_.erase(iter); | |
1980 } | |
1981 } | 2060 } |
1982 | 2061 |
1983 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 2062 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
1984 switches::kSitePerProcess)) { | 2063 switches::kSitePerProcess)) { |
1985 // If this is a subframe, it should have a CrossProcessFrameConnector | 2064 // If this is a subframe, it should have a CrossProcessFrameConnector |
1986 // created already. Use it to link the new RFH's view to the proxy that | 2065 // created already. Use it to link the new RFH's view to the proxy that |
1987 // belongs to the parent frame's SiteInstance. If this navigation causes | 2066 // belongs to the parent frame's SiteInstance. If this navigation causes |
1988 // an out-of-process frame to return to the same process as its parent, the | 2067 // an out-of-process frame to return to the same process as its parent, the |
1989 // proxy would have been removed from proxy_hosts_ above. | 2068 // proxy would have been removed from proxy_hosts_ above. |
1990 // Note: We do this after swapping out the old RFH because that may create | 2069 // Note: We do this after swapping out the old RFH because that may create |
1991 // the proxy we're looking for. | 2070 // the proxy we're looking for. |
1992 RenderFrameProxyHost* proxy_to_parent = GetProxyToParent(); | 2071 RenderFrameProxyHost* proxy_to_parent = GetProxyToParent(); |
1993 if (proxy_to_parent) | 2072 if (proxy_to_parent) |
1994 proxy_to_parent->SetChildRWHView(render_frame_host_->GetView()); | 2073 proxy_to_parent->SetChildRWHView(render_frame_host_->GetView()); |
1995 } | 2074 } |
1996 | 2075 |
1997 // After all is done, there must never be a proxy in the list which has the | 2076 // After all is done, there must never be a proxy in the list which has the |
1998 // same SiteInstance as the current RenderFrameHost. | 2077 // same SiteInstance as the current RenderFrameHost. |
1999 CHECK(proxy_hosts_.find(render_frame_host_->GetSiteInstance()->GetId()) == | 2078 CHECK(proxy_hosts_->Get(render_frame_host_->GetSiteInstance()->GetId()) == |
ncarter (slow)
2015/07/21 19:07:14
CHECK(!proxy_hosts->Get(...)) ?
Avi (use Gerrit)
2015/07/21 20:45:16
Done.
| |
2000 proxy_hosts_.end()); | 2079 nullptr); |
2001 } | 2080 } |
2002 | 2081 |
2003 void RenderFrameHostManager::ShutdownProxiesIfLastActiveFrameInSiteInstance( | 2082 void RenderFrameHostManager::ShutdownProxiesIfLastActiveFrameInSiteInstance( |
2004 RenderFrameHostImpl* render_frame_host) { | 2083 RenderFrameHostImpl* render_frame_host) { |
2005 if (!render_frame_host) | 2084 if (!render_frame_host) |
2006 return; | 2085 return; |
2007 if (!RenderFrameHostImpl::IsRFHStateActive(render_frame_host->rfh_state())) | 2086 if (!RenderFrameHostImpl::IsRFHStateActive(render_frame_host->rfh_state())) |
2008 return; | 2087 return; |
2009 if (render_frame_host->GetSiteInstance()->active_frame_count() > 1U) | 2088 if (render_frame_host->GetSiteInstance()->active_frame_count() > 1U) |
2010 return; | 2089 return; |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2140 return pending_render_frame_host_.get(); | 2219 return pending_render_frame_host_.get(); |
2141 } | 2220 } |
2142 | 2221 |
2143 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. | 2222 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. |
2144 | 2223 |
2145 // It's possible to swap out the current RFH and then decide to navigate in it | 2224 // It's possible to swap out the current RFH and then decide to navigate in it |
2146 // anyway (e.g., a cross-process navigation that redirects back to the | 2225 // anyway (e.g., a cross-process navigation that redirects back to the |
2147 // original site). In that case, we have a proxy for the current RFH but | 2226 // original site). In that case, we have a proxy for the current RFH but |
2148 // haven't deleted it yet. The new navigation will swap it back in, so we can | 2227 // haven't deleted it yet. The new navigation will swap it back in, so we can |
2149 // delete the proxy. | 2228 // delete the proxy. |
2150 DeleteRenderFrameProxyHost(new_instance.get()); | 2229 proxy_hosts_->Remove(new_instance.get()->GetId()); |
2151 | 2230 |
2152 if (ShouldReuseWebUI(current_entry, dest_url)) { | 2231 if (ShouldReuseWebUI(current_entry, dest_url)) { |
2153 pending_web_ui_.reset(); | 2232 pending_web_ui_.reset(); |
2154 pending_and_current_web_ui_ = web_ui_->AsWeakPtr(); | 2233 pending_and_current_web_ui_ = web_ui_->AsWeakPtr(); |
2155 } else { | 2234 } else { |
2156 SetPendingWebUI(dest_url, bindings); | 2235 SetPendingWebUI(dest_url, bindings); |
2157 // Make sure the new RenderViewHost has the right bindings. | 2236 // Make sure the new RenderViewHost has the right bindings. |
2158 if (pending_web_ui() && | 2237 if (pending_web_ui() && |
2159 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { | 2238 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { |
2160 render_frame_host_->render_view_host()->AllowBindings( | 2239 render_frame_host_->render_view_host()->AllowBindings( |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2238 if (!proxy->render_frame_host()) | 2317 if (!proxy->render_frame_host()) |
2239 return false; | 2318 return false; |
2240 return IsOnSwappedOutList(proxy->render_frame_host()); | 2319 return IsOnSwappedOutList(proxy->render_frame_host()); |
2241 } | 2320 } |
2242 | 2321 |
2243 bool RenderFrameHostManager::IsOnSwappedOutList( | 2322 bool RenderFrameHostManager::IsOnSwappedOutList( |
2244 RenderFrameHostImpl* rfh) const { | 2323 RenderFrameHostImpl* rfh) const { |
2245 if (!rfh->GetSiteInstance()) | 2324 if (!rfh->GetSiteInstance()) |
2246 return false; | 2325 return false; |
2247 | 2326 |
2248 RenderFrameProxyHostMap::const_iterator iter = proxy_hosts_.find( | 2327 RenderFrameProxyHost* host = |
2249 rfh->GetSiteInstance()->GetId()); | 2328 proxy_hosts_->Get(rfh->GetSiteInstance()->GetId()); |
2250 if (iter == proxy_hosts_.end()) | 2329 if (!host) |
2251 return false; | 2330 return false; |
2252 | 2331 |
2253 return iter->second->render_frame_host() == rfh; | 2332 return host->render_frame_host() == rfh; |
2254 } | 2333 } |
2255 | 2334 |
2256 RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost( | 2335 RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost( |
2257 SiteInstance* instance) const { | 2336 SiteInstance* instance) const { |
2258 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 2337 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
2259 if (proxy) | 2338 if (proxy) |
2260 return proxy->GetRenderViewHost(); | 2339 return proxy->GetRenderViewHost(); |
2261 return NULL; | 2340 return nullptr; |
2262 } | 2341 } |
2263 | 2342 |
2264 RenderFrameProxyHost* RenderFrameHostManager::GetRenderFrameProxyHost( | 2343 RenderFrameProxyHost* RenderFrameHostManager::GetRenderFrameProxyHost( |
2265 SiteInstance* instance) const { | 2344 SiteInstance* instance) const { |
2266 RenderFrameProxyHostMap::const_iterator iter = | 2345 return proxy_hosts_->Get(instance->GetId()); |
2267 proxy_hosts_.find(instance->GetId()); | |
2268 if (iter != proxy_hosts_.end()) | |
2269 return iter->second; | |
2270 | |
2271 return NULL; | |
2272 } | 2346 } |
2273 | 2347 |
2274 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 2348 std::map<int, RenderFrameProxyHost*> |
2275 SiteInstance* instance) { | 2349 RenderFrameHostManager::GetAllProxyHostsForTesting() { |
2276 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 2350 std::map<int, RenderFrameProxyHost*> result; |
2277 if (iter != proxy_hosts_.end()) { | 2351 result.insert(proxy_hosts_->begin(), proxy_hosts_->end()); |
2278 delete iter->second; | 2352 return result; |
2279 proxy_hosts_.erase(iter); | |
2280 } | |
2281 } | 2353 } |
2282 | 2354 |
2283 void RenderFrameHostManager::CreateOpenerProxiesIfNeeded( | 2355 void RenderFrameHostManager::CreateOpenerProxiesIfNeeded( |
2284 SiteInstance* instance) { | 2356 SiteInstance* instance) { |
2285 FrameTreeNode* opener = frame_tree_node_->opener(); | 2357 FrameTreeNode* opener = frame_tree_node_->opener(); |
2286 if (!opener) | 2358 if (!opener) |
2287 return; | 2359 return; |
2288 | 2360 |
2289 // Create proxies for the opener chain. | 2361 // Create proxies for the opener chain. |
2290 opener->render_manager()->CreateOpenerProxies(instance); | 2362 opener->render_manager()->CreateOpenerProxies(instance); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2339 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { | 2411 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
2340 if (!frame_tree_node_->opener()) | 2412 if (!frame_tree_node_->opener()) |
2341 return MSG_ROUTING_NONE; | 2413 return MSG_ROUTING_NONE; |
2342 | 2414 |
2343 return frame_tree_node_->opener() | 2415 return frame_tree_node_->opener() |
2344 ->render_manager() | 2416 ->render_manager() |
2345 ->GetRoutingIdForSiteInstance(instance); | 2417 ->GetRoutingIdForSiteInstance(instance); |
2346 } | 2418 } |
2347 | 2419 |
2348 } // namespace content | 2420 } // namespace content |
OLD | NEW |