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 using MapType = base::hash_map<int32, RenderFrameProxyHost*>; |
| 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() const { return map_.begin(); } |
| 60 MapType::const_iterator end() const { return map_.end(); } |
| 61 bool empty() const { 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_) { |
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())); | |
666 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 765 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 proxy_hosts_->Add(old_site_instance_id, make_scoped_ptr(proxy)); |
670 << "Inserting a duplicate item."; | |
671 | 769 |
672 // Tell the old RenderFrameHost to swap out and be replaced by the proxy. | 770 // Tell the old RenderFrameHost to swap out and be replaced by the proxy. |
673 old_render_frame_host->SwapOut(proxy, true); | 771 old_render_frame_host->SwapOut(proxy, true); |
674 | 772 |
675 // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized. | 773 // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized. |
676 proxy->set_render_frame_proxy_created(true); | 774 proxy->set_render_frame_proxy_created(true); |
677 | 775 |
678 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { | 776 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { |
679 // In --site-per-process, frames delete their RFH rather than storing it | 777 // 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. | 778 // in the proxy. Schedule it for deletion once the SwapOutACK comes in. |
(...skipping 17 matching lines...) Expand all Loading... |
698 | 796 |
699 // If the SiteInstance for the pending RFH is being used by others don't | 797 // 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. | 798 // 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 | 799 // In --site-per-process, RenderFrameHosts are not kept around and are |
702 // deleted when not used, replaced by RenderFrameProxyHosts. | 800 // deleted when not used, replaced by RenderFrameProxyHosts. |
703 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance(); | 801 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance(); |
704 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) { | 802 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) { |
705 // Any currently suspended navigations are no longer needed. | 803 // Any currently suspended navigations are no longer needed. |
706 render_frame_host->CancelSuspendedNavigations(); | 804 render_frame_host->CancelSuspendedNavigations(); |
707 | 805 |
708 CHECK(!GetRenderFrameProxyHost(site_instance)); | |
709 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 806 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( |
710 site_instance, render_frame_host->render_view_host(), frame_tree_node_); | 807 site_instance, render_frame_host->render_view_host(), frame_tree_node_); |
711 proxy_hosts_[site_instance->GetId()] = proxy; | 808 proxy_hosts_->Add(site_instance->GetId(), make_scoped_ptr(proxy)); |
712 | 809 |
713 // Check if the RenderFrameHost is already swapped out, to avoid swapping it | 810 // Check if the RenderFrameHost is already swapped out, to avoid swapping it |
714 // out again. | 811 // out again. |
715 if (!render_frame_host->is_swapped_out()) | 812 if (!render_frame_host->is_swapped_out()) |
716 render_frame_host->SwapOut(proxy, false); | 813 render_frame_host->SwapOut(proxy, false); |
717 | 814 |
718 if (!RenderFrameHostManager::IsSwappedOutStateForbidden()) { | 815 if (!RenderFrameHostManager::IsSwappedOutStateForbidden()) { |
719 DCHECK(frame_tree_node_->IsMainFrame()); | 816 DCHECK(frame_tree_node_->IsMainFrame()); |
720 proxy->TakeFrameHostOwnership(render_frame_host.Pass()); | 817 proxy->TakeFrameHostOwnership(render_frame_host.Pass()); |
721 } | 818 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 iter++) { | 850 iter++) { |
754 if (*iter == render_frame_host) { | 851 if (*iter == render_frame_host) { |
755 pending_delete_hosts_.erase(iter); | 852 pending_delete_hosts_.erase(iter); |
756 return true; | 853 return true; |
757 } | 854 } |
758 } | 855 } |
759 return false; | 856 return false; |
760 } | 857 } |
761 | 858 |
762 void RenderFrameHostManager::ResetProxyHosts() { | 859 void RenderFrameHostManager::ResetProxyHosts() { |
763 STLDeleteValues(&proxy_hosts_); | 860 proxy_hosts_->Clear(); |
764 } | 861 } |
765 | 862 |
766 // PlzNavigate | 863 // PlzNavigate |
767 void RenderFrameHostManager::DidCreateNavigationRequest( | 864 void RenderFrameHostManager::DidCreateNavigationRequest( |
768 const NavigationRequest& request) { | 865 const NavigationRequest& request) { |
769 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 866 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
770 switches::kEnableBrowserSideNavigation)); | 867 switches::kEnableBrowserSideNavigation)); |
771 // Clean up any state in case there's an ongoing navigation. | 868 // Clean up any state in case there's an ongoing navigation. |
772 // TODO(carlosk): remove this cleanup here once we properly cancel ongoing | 869 // TODO(carlosk): remove this cleanup here once we properly cancel ongoing |
773 // navigations. | 870 // navigations. |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 // PlzNavigate | 1003 // PlzNavigate |
907 scoped_ptr<RenderFrameHostImpl> | 1004 scoped_ptr<RenderFrameHostImpl> |
908 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { | 1005 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { |
909 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1006 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
910 switches::kEnableBrowserSideNavigation)); | 1007 switches::kEnableBrowserSideNavigation)); |
911 speculative_render_frame_host_->GetProcess()->RemovePendingView(); | 1008 speculative_render_frame_host_->GetProcess()->RemovePendingView(); |
912 return speculative_render_frame_host_.Pass(); | 1009 return speculative_render_frame_host_.Pass(); |
913 } | 1010 } |
914 | 1011 |
915 void RenderFrameHostManager::OnDidStartLoading() { | 1012 void RenderFrameHostManager::OnDidStartLoading() { |
916 for (const auto& pair : proxy_hosts_) { | 1013 for (const auto& pair : *proxy_hosts_) { |
917 pair.second->Send( | 1014 pair.second->Send( |
918 new FrameMsg_DidStartLoading(pair.second->GetRoutingID())); | 1015 new FrameMsg_DidStartLoading(pair.second->GetRoutingID())); |
919 } | 1016 } |
920 } | 1017 } |
921 | 1018 |
922 void RenderFrameHostManager::OnDidStopLoading() { | 1019 void RenderFrameHostManager::OnDidStopLoading() { |
923 for (const auto& pair : proxy_hosts_) { | 1020 for (const auto& pair : *proxy_hosts_) { |
924 pair.second->Send(new FrameMsg_DidStopLoading(pair.second->GetRoutingID())); | 1021 pair.second->Send(new FrameMsg_DidStopLoading(pair.second->GetRoutingID())); |
925 } | 1022 } |
926 } | 1023 } |
927 | 1024 |
928 void RenderFrameHostManager::OnDidUpdateName(const std::string& name) { | 1025 void RenderFrameHostManager::OnDidUpdateName(const std::string& name) { |
929 // The window.name message may be sent outside of --site-per-process when | 1026 // The window.name message may be sent outside of --site-per-process when |
930 // report_frame_name_changes renderer preference is set (used by | 1027 // report_frame_name_changes renderer preference is set (used by |
931 // WebView). Don't send the update to proxies in those cases. | 1028 // WebView). Don't send the update to proxies in those cases. |
932 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 1029 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
933 switches::kSitePerProcess)) | 1030 switches::kSitePerProcess)) |
934 return; | 1031 return; |
935 | 1032 |
936 for (const auto& pair : proxy_hosts_) { | 1033 for (const auto& pair : *proxy_hosts_) { |
937 pair.second->Send( | 1034 pair.second->Send( |
938 new FrameMsg_DidUpdateName(pair.second->GetRoutingID(), name)); | 1035 new FrameMsg_DidUpdateName(pair.second->GetRoutingID(), name)); |
939 } | 1036 } |
940 } | 1037 } |
941 | 1038 |
942 void RenderFrameHostManager::OnDidUpdateOrigin( | 1039 void RenderFrameHostManager::OnDidUpdateOrigin( |
943 const url::DeprecatedSerializedOrigin& origin) { | 1040 const url::DeprecatedSerializedOrigin& origin) { |
944 if (!IsSwappedOutStateForbidden()) | 1041 if (!IsSwappedOutStateForbidden()) |
945 return; | 1042 return; |
946 | 1043 |
947 for (const auto& pair : proxy_hosts_) { | 1044 for (const auto& pair : *proxy_hosts_) { |
948 pair.second->Send( | 1045 pair.second->Send( |
949 new FrameMsg_DidUpdateOrigin(pair.second->GetRoutingID(), origin)); | 1046 new FrameMsg_DidUpdateOrigin(pair.second->GetRoutingID(), origin)); |
950 } | 1047 } |
951 } | 1048 } |
952 | 1049 |
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( | 1050 RenderFrameHostManager::SiteInstanceDescriptor::SiteInstanceDescriptor( |
970 BrowserContext* browser_context, | 1051 BrowserContext* browser_context, |
971 GURL dest_url, | 1052 GURL dest_url, |
972 bool related_to_current) | 1053 bool related_to_current) |
973 : existing_site_instance(nullptr), | 1054 : existing_site_instance(nullptr), |
974 new_is_related_to_current(related_to_current) { | 1055 new_is_related_to_current(related_to_current) { |
975 new_site_url = SiteInstance::GetSiteForURL(browser_context, dest_url); | 1056 new_site_url = SiteInstance::GetSiteForURL(browser_context, dest_url); |
976 } | 1057 } |
977 | 1058 |
978 // static | 1059 // static |
979 bool RenderFrameHostManager::ClearProxiesInSiteInstance( | 1060 bool RenderFrameHostManager::ClearProxiesInSiteInstance( |
980 int32 site_instance_id, | 1061 int32 site_instance_id, |
981 FrameTreeNode* node) { | 1062 FrameTreeNode* node) { |
982 RenderFrameProxyHostMap::iterator iter = | 1063 RenderFrameProxyHost* proxy = |
983 node->render_manager()->proxy_hosts_.find(site_instance_id); | 1064 node->render_manager()->proxy_hosts_->Get(site_instance_id); |
984 if (iter != node->render_manager()->proxy_hosts_.end()) { | 1065 if (proxy) { |
985 RenderFrameProxyHost* proxy = iter->second; | |
986 // Delete the proxy. If it is for a main frame (and thus the RFH is stored | 1066 // 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 | 1067 // in the proxy) and it was still pending swap out, move the RFH to the |
988 // pending deletion list first. | 1068 // pending deletion list first. |
989 if (node->IsMainFrame() && | 1069 if (node->IsMainFrame() && |
990 proxy->render_frame_host() && | 1070 proxy->render_frame_host() && |
991 proxy->render_frame_host()->rfh_state() == | 1071 proxy->render_frame_host()->rfh_state() == |
992 RenderFrameHostImpl::STATE_PENDING_SWAP_OUT) { | 1072 RenderFrameHostImpl::STATE_PENDING_SWAP_OUT) { |
993 DCHECK(!RenderFrameHostManager::IsSwappedOutStateForbidden()); | 1073 DCHECK(!RenderFrameHostManager::IsSwappedOutStateForbidden()); |
994 scoped_ptr<RenderFrameHostImpl> swapped_out_rfh = | 1074 scoped_ptr<RenderFrameHostImpl> swapped_out_rfh = |
995 proxy->PassFrameHostOwnership(); | 1075 proxy->PassFrameHostOwnership(); |
996 node->render_manager()->MoveToPendingDeleteHosts(swapped_out_rfh.Pass()); | 1076 node->render_manager()->MoveToPendingDeleteHosts(swapped_out_rfh.Pass()); |
997 } | 1077 } |
998 delete proxy; | 1078 node->render_manager()->proxy_hosts_->Remove(site_instance_id); |
999 node->render_manager()->proxy_hosts_.erase(site_instance_id); | |
1000 } | 1079 } |
1001 | 1080 |
1002 return true; | 1081 return true; |
1003 } | 1082 } |
1004 | 1083 |
1005 // static. | 1084 // static. |
1006 bool RenderFrameHostManager::ResetProxiesInSiteInstance(int32 site_instance_id, | 1085 bool RenderFrameHostManager::ResetProxiesInSiteInstance(int32 site_instance_id, |
1007 FrameTreeNode* node) { | 1086 FrameTreeNode* node) { |
1008 RenderFrameProxyHostMap::iterator iter = | 1087 RenderFrameProxyHost* proxy = |
1009 node->render_manager()->proxy_hosts_.find(site_instance_id); | 1088 node->render_manager()->proxy_hosts_->Get(site_instance_id); |
1010 if (iter != node->render_manager()->proxy_hosts_.end()) | 1089 if (proxy) |
1011 iter->second->set_render_frame_proxy_created(false); | 1090 proxy->set_render_frame_proxy_created(false); |
1012 | 1091 |
1013 return true; | 1092 return true; |
1014 } | 1093 } |
1015 | 1094 |
1016 bool RenderFrameHostManager::ShouldTransitionCrossSite() { | 1095 bool RenderFrameHostManager::ShouldTransitionCrossSite() { |
1017 // True for --site-per-process, which overrides both kSingleProcess and | 1096 // True for --site-per-process, which overrides both kSingleProcess and |
1018 // kProcessPerTab. | 1097 // kProcessPerTab. |
1019 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1098 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
1020 switches::kSitePerProcess)) | 1099 switches::kSitePerProcess)) |
1021 return true; | 1100 return true; |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1548 if (proxy && proxy->render_frame_host()) { | 1627 if (proxy && proxy->render_frame_host()) { |
1549 CHECK(!swapped_out_forbidden); | 1628 CHECK(!swapped_out_forbidden); |
1550 if (view_routing_id_ptr) | 1629 if (view_routing_id_ptr) |
1551 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); | 1630 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); |
1552 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. | 1631 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. |
1553 // Prevent the process from exiting while we're trying to use it. | 1632 // Prevent the process from exiting while we're trying to use it. |
1554 if (!swapped_out) { | 1633 if (!swapped_out) { |
1555 new_render_frame_host = proxy->PassFrameHostOwnership(); | 1634 new_render_frame_host = proxy->PassFrameHostOwnership(); |
1556 new_render_frame_host->GetProcess()->AddPendingView(); | 1635 new_render_frame_host->GetProcess()->AddPendingView(); |
1557 | 1636 |
1558 proxy_hosts_.erase(instance->GetId()); | 1637 proxy_hosts_->Remove(instance->GetId()); |
1559 delete proxy; | 1638 // NB |proxy| is deleted at this point. |
1560 } | 1639 } |
1561 } else { | 1640 } else { |
1562 // Create a new RenderFrameHost if we don't find an existing one. | 1641 // Create a new RenderFrameHost if we don't find an existing one. |
1563 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE, | 1642 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE, |
1564 MSG_ROUTING_NONE, flags); | 1643 MSG_ROUTING_NONE, flags); |
1565 RenderViewHostImpl* render_view_host = | 1644 RenderViewHostImpl* render_view_host = |
1566 new_render_frame_host->render_view_host(); | 1645 new_render_frame_host->render_view_host(); |
1567 int proxy_routing_id = MSG_ROUTING_NONE; | 1646 int proxy_routing_id = MSG_ROUTING_NONE; |
1568 | 1647 |
1569 // Prevent the process from exiting while we're trying to navigate in it. | 1648 // 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. | 1649 // Otherwise, if the new RFH is swapped out already, store it. |
1571 if (!swapped_out) { | 1650 if (!swapped_out) { |
1572 new_render_frame_host->GetProcess()->AddPendingView(); | 1651 new_render_frame_host->GetProcess()->AddPendingView(); |
1573 } else { | 1652 } else { |
1574 proxy = new RenderFrameProxyHost( | 1653 proxy = new RenderFrameProxyHost( |
1575 new_render_frame_host->GetSiteInstance(), | 1654 new_render_frame_host->GetSiteInstance(), |
1576 new_render_frame_host->render_view_host(), frame_tree_node_); | 1655 new_render_frame_host->render_view_host(), frame_tree_node_); |
1577 proxy_hosts_[instance->GetId()] = proxy; | 1656 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
1578 proxy_routing_id = proxy->GetRoutingID(); | 1657 proxy_routing_id = proxy->GetRoutingID(); |
1579 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1658 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1580 } | 1659 } |
1581 | 1660 |
1582 success = InitRenderView(render_view_host, proxy_routing_id, | 1661 success = InitRenderView(render_view_host, proxy_routing_id, |
1583 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); | 1662 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); |
1584 if (success) { | 1663 if (success) { |
1585 // Remember that InitRenderView also created the RenderFrameProxy. | 1664 // Remember that InitRenderView also created the RenderFrameProxy. |
1586 if (swapped_out) | 1665 if (swapped_out) |
1587 proxy->set_render_frame_proxy_created(true); | 1666 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( | 1730 render_view_host = frame_tree_node_->frame_tree()->CreateRenderViewHost( |
1652 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, true, true); | 1731 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, true, true); |
1653 } | 1732 } |
1654 } | 1733 } |
1655 | 1734 |
1656 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1735 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
1657 if (proxy && proxy->is_render_frame_proxy_live()) | 1736 if (proxy && proxy->is_render_frame_proxy_live()) |
1658 return proxy->GetRoutingID(); | 1737 return proxy->GetRoutingID(); |
1659 | 1738 |
1660 if (!proxy) { | 1739 if (!proxy) { |
1661 proxy = new RenderFrameProxyHost( | 1740 proxy = |
1662 instance, render_view_host, frame_tree_node_); | 1741 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); |
1663 proxy_hosts_[instance->GetId()] = proxy; | 1742 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
1664 } | 1743 } |
1665 | 1744 |
1666 if (RenderFrameHostManager::IsSwappedOutStateForbidden() && | 1745 if (RenderFrameHostManager::IsSwappedOutStateForbidden() && |
1667 frame_tree_node_->IsMainFrame()) { | 1746 frame_tree_node_->IsMainFrame()) { |
1668 InitRenderView(render_view_host, proxy->GetRoutingID(), true); | 1747 InitRenderView(render_view_host, proxy->GetRoutingID(), true); |
1669 proxy->set_render_frame_proxy_created(true); | 1748 proxy->set_render_frame_proxy_created(true); |
1670 } else { | 1749 } else { |
1671 proxy->InitRenderFrameProxy(); | 1750 proxy->InitRenderFrameProxy(); |
1672 } | 1751 } |
1673 | 1752 |
1674 return proxy->GetRoutingID(); | 1753 return proxy->GetRoutingID(); |
1675 } | 1754 } |
1676 | 1755 |
1677 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { | 1756 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { |
1678 for (const auto& pair : proxy_hosts_) { | 1757 for (const auto& pair : *proxy_hosts_) { |
1679 child->render_manager()->CreateRenderFrameProxy( | 1758 child->render_manager()->CreateRenderFrameProxy( |
1680 pair.second->GetSiteInstance()); | 1759 pair.second->GetSiteInstance()); |
1681 } | 1760 } |
1682 } | 1761 } |
1683 | 1762 |
1684 void RenderFrameHostManager::EnsureRenderViewInitialized( | 1763 void RenderFrameHostManager::EnsureRenderViewInitialized( |
1685 RenderViewHostImpl* render_view_host, | 1764 RenderViewHostImpl* render_view_host, |
1686 SiteInstance* instance) { | 1765 SiteInstance* instance) { |
1687 DCHECK(frame_tree_node_->IsMainFrame()); | 1766 DCHECK(frame_tree_node_->IsMainFrame()); |
1688 | 1767 |
(...skipping 13 matching lines...) Expand all Loading... |
1702 proxy->set_render_frame_proxy_created(true); | 1781 proxy->set_render_frame_proxy_created(true); |
1703 } | 1782 } |
1704 | 1783 |
1705 void RenderFrameHostManager::CreateOuterDelegateProxy( | 1784 void RenderFrameHostManager::CreateOuterDelegateProxy( |
1706 SiteInstance* outer_contents_site_instance, | 1785 SiteInstance* outer_contents_site_instance, |
1707 RenderFrameHostImpl* render_frame_host) { | 1786 RenderFrameHostImpl* render_frame_host) { |
1708 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1787 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
1709 switches::kSitePerProcess)); | 1788 switches::kSitePerProcess)); |
1710 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 1789 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( |
1711 outer_contents_site_instance, nullptr, frame_tree_node_); | 1790 outer_contents_site_instance, nullptr, frame_tree_node_); |
1712 proxy_hosts_[outer_contents_site_instance->GetId()] = proxy; | 1791 proxy_hosts_->Add(outer_contents_site_instance->GetId(), |
| 1792 make_scoped_ptr(proxy)); |
1713 | 1793 |
1714 // Swap the outer WebContents's frame with the proxy to inner WebContents. | 1794 // Swap the outer WebContents's frame with the proxy to inner WebContents. |
1715 // | 1795 // |
1716 // We are in the outer WebContents, and its FrameTree would never see | 1796 // 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 | 1797 // 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 | 1798 // the FrameTree never see the matching load stop. Therefore, we always pass |
1719 // false to |is_loading| below. | 1799 // false to |is_loading| below. |
1720 // TODO(lazyboy): This |is_loading| behavior might not be what we want, | 1800 // TODO(lazyboy): This |is_loading| behavior might not be what we want, |
1721 // investigate and fix. | 1801 // investigate and fix. |
1722 render_frame_host->Send(new FrameMsg_SwapOut( | 1802 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 | 2045 // 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 | 2046 // 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). | 2047 // 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 | 2048 // In the --site-per-process case, old subframe RFHs are not kept alive inside |
1969 // the proxy. | 2049 // the proxy. |
1970 SwapOutOldFrame(old_render_frame_host.Pass()); | 2050 SwapOutOldFrame(old_render_frame_host.Pass()); |
1971 | 2051 |
1972 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { | 2052 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { |
1973 // Since the new RenderFrameHost is now committed, there must be no proxies | 2053 // Since the new RenderFrameHost is now committed, there must be no proxies |
1974 // for its SiteInstance. Delete any existing ones. | 2054 // for its SiteInstance. Delete any existing ones. |
1975 RenderFrameProxyHostMap::iterator iter = | 2055 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 } | 2056 } |
1982 | 2057 |
1983 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 2058 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
1984 switches::kSitePerProcess)) { | 2059 switches::kSitePerProcess)) { |
1985 // If this is a subframe, it should have a CrossProcessFrameConnector | 2060 // 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 | 2061 // 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 | 2062 // 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 | 2063 // 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. | 2064 // proxy would have been removed from proxy_hosts_ above. |
1990 // Note: We do this after swapping out the old RFH because that may create | 2065 // Note: We do this after swapping out the old RFH because that may create |
1991 // the proxy we're looking for. | 2066 // the proxy we're looking for. |
1992 RenderFrameProxyHost* proxy_to_parent = GetProxyToParent(); | 2067 RenderFrameProxyHost* proxy_to_parent = GetProxyToParent(); |
1993 if (proxy_to_parent) | 2068 if (proxy_to_parent) |
1994 proxy_to_parent->SetChildRWHView(render_frame_host_->GetView()); | 2069 proxy_to_parent->SetChildRWHView(render_frame_host_->GetView()); |
1995 } | 2070 } |
1996 | 2071 |
1997 // After all is done, there must never be a proxy in the list which has the | 2072 // After all is done, there must never be a proxy in the list which has the |
1998 // same SiteInstance as the current RenderFrameHost. | 2073 // same SiteInstance as the current RenderFrameHost. |
1999 CHECK(proxy_hosts_.find(render_frame_host_->GetSiteInstance()->GetId()) == | 2074 CHECK(!proxy_hosts_->Get(render_frame_host_->GetSiteInstance()->GetId())); |
2000 proxy_hosts_.end()); | |
2001 } | 2075 } |
2002 | 2076 |
2003 void RenderFrameHostManager::ShutdownProxiesIfLastActiveFrameInSiteInstance( | 2077 void RenderFrameHostManager::ShutdownProxiesIfLastActiveFrameInSiteInstance( |
2004 RenderFrameHostImpl* render_frame_host) { | 2078 RenderFrameHostImpl* render_frame_host) { |
2005 if (!render_frame_host) | 2079 if (!render_frame_host) |
2006 return; | 2080 return; |
2007 if (!RenderFrameHostImpl::IsRFHStateActive(render_frame_host->rfh_state())) | 2081 if (!RenderFrameHostImpl::IsRFHStateActive(render_frame_host->rfh_state())) |
2008 return; | 2082 return; |
2009 if (render_frame_host->GetSiteInstance()->active_frame_count() > 1U) | 2083 if (render_frame_host->GetSiteInstance()->active_frame_count() > 1U) |
2010 return; | 2084 return; |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2140 return pending_render_frame_host_.get(); | 2214 return pending_render_frame_host_.get(); |
2141 } | 2215 } |
2142 | 2216 |
2143 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. | 2217 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. |
2144 | 2218 |
2145 // It's possible to swap out the current RFH and then decide to navigate in it | 2219 // 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 | 2220 // 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 | 2221 // 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 | 2222 // haven't deleted it yet. The new navigation will swap it back in, so we can |
2149 // delete the proxy. | 2223 // delete the proxy. |
2150 DeleteRenderFrameProxyHost(new_instance.get()); | 2224 proxy_hosts_->Remove(new_instance.get()->GetId()); |
2151 | 2225 |
2152 if (ShouldReuseWebUI(current_entry, dest_url)) { | 2226 if (ShouldReuseWebUI(current_entry, dest_url)) { |
2153 pending_web_ui_.reset(); | 2227 pending_web_ui_.reset(); |
2154 pending_and_current_web_ui_ = web_ui_->AsWeakPtr(); | 2228 pending_and_current_web_ui_ = web_ui_->AsWeakPtr(); |
2155 } else { | 2229 } else { |
2156 SetPendingWebUI(dest_url, bindings); | 2230 SetPendingWebUI(dest_url, bindings); |
2157 // Make sure the new RenderViewHost has the right bindings. | 2231 // Make sure the new RenderViewHost has the right bindings. |
2158 if (pending_web_ui() && | 2232 if (pending_web_ui() && |
2159 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { | 2233 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { |
2160 render_frame_host_->render_view_host()->AllowBindings( | 2234 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()) | 2312 if (!proxy->render_frame_host()) |
2239 return false; | 2313 return false; |
2240 return IsOnSwappedOutList(proxy->render_frame_host()); | 2314 return IsOnSwappedOutList(proxy->render_frame_host()); |
2241 } | 2315 } |
2242 | 2316 |
2243 bool RenderFrameHostManager::IsOnSwappedOutList( | 2317 bool RenderFrameHostManager::IsOnSwappedOutList( |
2244 RenderFrameHostImpl* rfh) const { | 2318 RenderFrameHostImpl* rfh) const { |
2245 if (!rfh->GetSiteInstance()) | 2319 if (!rfh->GetSiteInstance()) |
2246 return false; | 2320 return false; |
2247 | 2321 |
2248 RenderFrameProxyHostMap::const_iterator iter = proxy_hosts_.find( | 2322 RenderFrameProxyHost* host = |
2249 rfh->GetSiteInstance()->GetId()); | 2323 proxy_hosts_->Get(rfh->GetSiteInstance()->GetId()); |
2250 if (iter == proxy_hosts_.end()) | 2324 if (!host) |
2251 return false; | 2325 return false; |
2252 | 2326 |
2253 return iter->second->render_frame_host() == rfh; | 2327 return host->render_frame_host() == rfh; |
2254 } | 2328 } |
2255 | 2329 |
2256 RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost( | 2330 RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost( |
2257 SiteInstance* instance) const { | 2331 SiteInstance* instance) const { |
2258 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 2332 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
2259 if (proxy) | 2333 if (proxy) |
2260 return proxy->GetRenderViewHost(); | 2334 return proxy->GetRenderViewHost(); |
2261 return NULL; | 2335 return nullptr; |
2262 } | 2336 } |
2263 | 2337 |
2264 RenderFrameProxyHost* RenderFrameHostManager::GetRenderFrameProxyHost( | 2338 RenderFrameProxyHost* RenderFrameHostManager::GetRenderFrameProxyHost( |
2265 SiteInstance* instance) const { | 2339 SiteInstance* instance) const { |
2266 RenderFrameProxyHostMap::const_iterator iter = | 2340 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 } | 2341 } |
2273 | 2342 |
2274 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 2343 std::map<int, RenderFrameProxyHost*> |
2275 SiteInstance* instance) { | 2344 RenderFrameHostManager::GetAllProxyHostsForTesting() { |
2276 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 2345 std::map<int, RenderFrameProxyHost*> result; |
2277 if (iter != proxy_hosts_.end()) { | 2346 result.insert(proxy_hosts_->begin(), proxy_hosts_->end()); |
2278 delete iter->second; | 2347 return result; |
2279 proxy_hosts_.erase(iter); | |
2280 } | |
2281 } | 2348 } |
2282 | 2349 |
2283 void RenderFrameHostManager::CreateOpenerProxiesIfNeeded( | 2350 void RenderFrameHostManager::CreateOpenerProxiesIfNeeded( |
2284 SiteInstance* instance) { | 2351 SiteInstance* instance) { |
2285 FrameTreeNode* opener = frame_tree_node_->opener(); | 2352 FrameTreeNode* opener = frame_tree_node_->opener(); |
2286 if (!opener) | 2353 if (!opener) |
2287 return; | 2354 return; |
2288 | 2355 |
2289 // Create proxies for the opener chain. | 2356 // Create proxies for the opener chain. |
2290 opener->render_manager()->CreateOpenerProxies(instance); | 2357 opener->render_manager()->CreateOpenerProxies(instance); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2339 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { | 2406 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
2340 if (!frame_tree_node_->opener()) | 2407 if (!frame_tree_node_->opener()) |
2341 return MSG_ROUTING_NONE; | 2408 return MSG_ROUTING_NONE; |
2342 | 2409 |
2343 return frame_tree_node_->opener() | 2410 return frame_tree_node_->opener() |
2344 ->render_manager() | 2411 ->render_manager() |
2345 ->GetRoutingIdForSiteInstance(instance); | 2412 ->GetRoutingIdForSiteInstance(instance); |
2346 } | 2413 } |
2347 | 2414 |
2348 } // namespace content | 2415 } // namespace content |
OLD | NEW |