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 <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 12 matching lines...) Expand all Loading... | |
23 #include "content/browser/frame_host/navigation_request.h" | 23 #include "content/browser/frame_host/navigation_request.h" |
24 #include "content/browser/frame_host/navigator.h" | 24 #include "content/browser/frame_host/navigator.h" |
25 #include "content/browser/frame_host/render_frame_host_factory.h" | 25 #include "content/browser/frame_host/render_frame_host_factory.h" |
26 #include "content/browser/frame_host/render_frame_host_impl.h" | 26 #include "content/browser/frame_host/render_frame_host_impl.h" |
27 #include "content/browser/frame_host/render_frame_proxy_host.h" | 27 #include "content/browser/frame_host/render_frame_proxy_host.h" |
28 #include "content/browser/renderer_host/render_process_host_impl.h" | 28 #include "content/browser/renderer_host/render_process_host_impl.h" |
29 #include "content/browser/renderer_host/render_view_host_factory.h" | 29 #include "content/browser/renderer_host/render_view_host_factory.h" |
30 #include "content/browser/renderer_host/render_view_host_impl.h" | 30 #include "content/browser/renderer_host/render_view_host_impl.h" |
31 #include "content/browser/site_instance_impl.h" | 31 #include "content/browser/site_instance_impl.h" |
32 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 32 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
33 #include "content/browser/webui/web_ui_impl.h" | |
34 #include "content/common/frame_messages.h" | 33 #include "content/common/frame_messages.h" |
35 #include "content/common/site_isolation_policy.h" | 34 #include "content/common/site_isolation_policy.h" |
36 #include "content/common/view_messages.h" | 35 #include "content/common/view_messages.h" |
37 #include "content/public/browser/content_browser_client.h" | 36 #include "content/public/browser/content_browser_client.h" |
38 #include "content/public/browser/render_process_host_observer.h" | 37 #include "content/public/browser/render_process_host_observer.h" |
39 #include "content/public/browser/render_widget_host_iterator.h" | 38 #include "content/public/browser/render_widget_host_iterator.h" |
40 #include "content/public/browser/render_widget_host_view.h" | 39 #include "content/public/browser/render_widget_host_view.h" |
41 #include "content/public/browser/user_metrics.h" | 40 #include "content/public/browser/user_metrics.h" |
42 #include "content/public/browser/web_ui_controller.h" | |
43 #include "content/public/common/browser_plugin_guest_mode.h" | 41 #include "content/public/common/browser_plugin_guest_mode.h" |
44 #include "content/public/common/content_switches.h" | 42 #include "content/public/common/content_switches.h" |
45 #include "content/public/common/referrer.h" | 43 #include "content/public/common/referrer.h" |
46 #include "content/public/common/url_constants.h" | 44 #include "content/public/common/url_constants.h" |
47 | 45 |
48 namespace content { | 46 namespace content { |
49 | 47 |
50 namespace { | 48 namespace { |
51 | 49 |
52 // Helper function to add the FrameTree of the given node's opener to the list | 50 // Helper function to add the FrameTree of the given node's opener to the list |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
213 RenderViewHostDelegate* render_view_delegate, | 211 RenderViewHostDelegate* render_view_delegate, |
214 RenderWidgetHostDelegate* render_widget_delegate, | 212 RenderWidgetHostDelegate* render_widget_delegate, |
215 Delegate* delegate) | 213 Delegate* delegate) |
216 : frame_tree_node_(frame_tree_node), | 214 : frame_tree_node_(frame_tree_node), |
217 delegate_(delegate), | 215 delegate_(delegate), |
218 render_frame_delegate_(render_frame_delegate), | 216 render_frame_delegate_(render_frame_delegate), |
219 render_view_delegate_(render_view_delegate), | 217 render_view_delegate_(render_view_delegate), |
220 render_widget_delegate_(render_widget_delegate), | 218 render_widget_delegate_(render_widget_delegate), |
221 proxy_hosts_(new RenderFrameProxyHostMap(this)), | 219 proxy_hosts_(new RenderFrameProxyHostMap(this)), |
222 interstitial_page_(nullptr), | 220 interstitial_page_(nullptr), |
223 should_reuse_web_ui_(false), | |
224 weak_factory_(this) { | 221 weak_factory_(this) { |
225 DCHECK(frame_tree_node_); | 222 DCHECK(frame_tree_node_); |
226 } | 223 } |
227 | 224 |
228 RenderFrameHostManager::~RenderFrameHostManager() { | 225 RenderFrameHostManager::~RenderFrameHostManager() { |
229 if (pending_render_frame_host_) { | 226 if (pending_render_frame_host_) { |
230 scoped_ptr<RenderFrameHostImpl> relic = UnsetPendingRenderFrameHost(); | 227 scoped_ptr<RenderFrameHostImpl> relic = UnsetPendingRenderFrameHost(); |
231 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); | 228 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); |
232 } | 229 } |
233 | 230 |
234 if (speculative_render_frame_host_) { | 231 if (speculative_render_frame_host_) { |
235 scoped_ptr<RenderFrameHostImpl> relic = UnsetSpeculativeRenderFrameHost(); | 232 scoped_ptr<RenderFrameHostImpl> relic = UnsetSpeculativeRenderFrameHost(); |
236 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); | 233 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); |
237 } | 234 } |
238 | 235 |
239 ShutdownProxiesIfLastActiveFrameInSiteInstance(render_frame_host_.get()); | 236 ShutdownProxiesIfLastActiveFrameInSiteInstance(render_frame_host_.get()); |
240 | 237 |
241 // Delete any RenderFrameProxyHosts and swapped out RenderFrameHosts. | 238 // Delete any RenderFrameProxyHosts and swapped out RenderFrameHosts. |
242 // It is important to delete those prior to deleting the current | 239 // It is important to delete those prior to deleting the current |
243 // RenderFrameHost, since the CrossProcessFrameConnector (owned by | 240 // RenderFrameHost, since the CrossProcessFrameConnector (owned by |
244 // RenderFrameProxyHost) points to the RenderWidgetHostView associated with | 241 // RenderFrameProxyHost) points to the RenderWidgetHostView associated with |
245 // the current RenderFrameHost and uses it during its destructor. | 242 // the current RenderFrameHost and uses it during its destructor. |
246 ResetProxyHosts(); | 243 ResetProxyHosts(); |
247 | 244 |
248 // Release the WebUI prior to resetting the current RenderFrameHost, as the | |
249 // WebUI accesses the RenderFrameHost during cleanup. | |
250 web_ui_.reset(); | |
251 | |
252 // We should always have a current RenderFrameHost except in some tests. | 245 // We should always have a current RenderFrameHost except in some tests. |
253 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); | 246 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); |
254 } | 247 } |
255 | 248 |
256 void RenderFrameHostManager::Init(BrowserContext* browser_context, | 249 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
257 SiteInstance* site_instance, | 250 SiteInstance* site_instance, |
258 int32 view_routing_id, | 251 int32 view_routing_id, |
259 int32 frame_routing_id, | 252 int32 frame_routing_id, |
260 int32 widget_routing_id) { | 253 int32 widget_routing_id) { |
261 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It | 254 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It |
262 // is important to immediately give this SiteInstance to a RenderViewHost so | 255 // is important to immediately give this SiteInstance to a RenderViewHost so |
263 // that the SiteInstance is ref counted. | 256 // that the SiteInstance is ref counted. |
264 if (!site_instance) | 257 if (!site_instance) |
265 site_instance = SiteInstance::Create(browser_context); | 258 site_instance = SiteInstance::Create(browser_context); |
266 | 259 |
267 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; | 260 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; |
268 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, | 261 SetRenderFrameHost(CreateRenderFrameHost( |
269 frame_routing_id, widget_routing_id, | 262 site_instance, view_routing_id, frame_routing_id, widget_routing_id, |
270 flags)); | 263 flags, GURL(), NavigationEntryImpl::kInvalidBindings)); |
271 | 264 |
272 // Notify the delegate of the creation of the current RenderFrameHost. | 265 // Notify the delegate of the creation of the current RenderFrameHost. |
273 // Do this only for subframes, as the main frame case is taken care of by | 266 // Do this only for subframes, as the main frame case is taken care of by |
274 // WebContentsImpl::Init. | 267 // WebContentsImpl::Init. |
275 if (!frame_tree_node_->IsMainFrame()) { | 268 if (!frame_tree_node_->IsMainFrame()) { |
276 delegate_->NotifySwappedFromRenderManager( | 269 delegate_->NotifySwappedFromRenderManager( |
277 nullptr, render_frame_host_.get(), false); | 270 nullptr, render_frame_host_.get(), false); |
278 } | 271 } |
279 } | 272 } |
280 | 273 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
344 | 337 |
345 void RenderFrameHostManager::RemoveOuterDelegateFrame() { | 338 void RenderFrameHostManager::RemoveOuterDelegateFrame() { |
346 FrameTreeNode* outer_delegate_frame_tree_node = | 339 FrameTreeNode* outer_delegate_frame_tree_node = |
347 FrameTreeNode::GloballyFindByID( | 340 FrameTreeNode::GloballyFindByID( |
348 delegate_->GetOuterDelegateFrameTreeNodeID()); | 341 delegate_->GetOuterDelegateFrameTreeNodeID()); |
349 DCHECK(outer_delegate_frame_tree_node->parent()); | 342 DCHECK(outer_delegate_frame_tree_node->parent()); |
350 outer_delegate_frame_tree_node->frame_tree()->RemoveFrame( | 343 outer_delegate_frame_tree_node->frame_tree()->RemoveFrame( |
351 outer_delegate_frame_tree_node); | 344 outer_delegate_frame_tree_node); |
352 } | 345 } |
353 | 346 |
354 void RenderFrameHostManager::SetPendingWebUI(const GURL& url, int bindings) { | |
355 pending_web_ui_ = CreateWebUI(url, bindings); | |
356 pending_and_current_web_ui_.reset(); | |
357 } | |
358 | |
359 scoped_ptr<WebUIImpl> RenderFrameHostManager::CreateWebUI(const GURL& url, | |
360 int bindings) { | |
361 scoped_ptr<WebUIImpl> new_web_ui(delegate_->CreateWebUIForRenderManager(url)); | |
362 | |
363 // If we have assigned (zero or more) bindings to this NavigationEntry in the | |
364 // past, make sure we're not granting it different bindings than it had | |
365 // before. If so, note it and don't give it any bindings, to avoid a | |
366 // potential privilege escalation. | |
367 if (new_web_ui && bindings != NavigationEntryImpl::kInvalidBindings && | |
368 new_web_ui->GetBindings() != bindings) { | |
369 RecordAction(base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); | |
370 return nullptr; | |
371 } | |
372 return new_web_ui.Pass(); | |
373 } | |
374 | |
375 RenderFrameHostImpl* RenderFrameHostManager::Navigate( | 347 RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
376 const GURL& dest_url, | 348 const GURL& dest_url, |
377 const FrameNavigationEntry& frame_entry, | 349 const FrameNavigationEntry& frame_entry, |
378 const NavigationEntryImpl& entry) { | 350 const NavigationEntryImpl& entry) { |
379 TRACE_EVENT1("navigation", "RenderFrameHostManager:Navigate", | 351 TRACE_EVENT1("navigation", "RenderFrameHostManager:Navigate", |
380 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 352 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
381 // Create a pending RenderFrameHost to use for the navigation. | 353 // Create a pending RenderFrameHost to use for the navigation. |
382 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( | 354 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( |
383 dest_url, | 355 dest_url, |
384 // TODO(creis): Move source_site_instance to FNE. | 356 // TODO(creis): Move source_site_instance to FNE. |
(...skipping 26 matching lines...) Expand all Loading... | |
411 // RenderView can cause browser-side code to execute that expects the this | 383 // RenderView can cause browser-side code to execute that expects the this |
412 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI | 384 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI |
413 // site that is handled via Mojo, then Mojo WebUI code in //chrome will | 385 // site that is handled via Mojo, then Mojo WebUI code in //chrome will |
414 // add a service to this RFH's ServiceRegistry). | 386 // add a service to this RFH's ServiceRegistry). |
415 dest_render_frame_host->SetUpMojoIfNeeded(); | 387 dest_render_frame_host->SetUpMojoIfNeeded(); |
416 | 388 |
417 // Recreate the opener chain. | 389 // Recreate the opener chain. |
418 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), | 390 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), |
419 frame_tree_node_); | 391 frame_tree_node_); |
420 if (!InitRenderView(dest_render_frame_host->render_view_host(), | 392 if (!InitRenderView(dest_render_frame_host->render_view_host(), |
421 MSG_ROUTING_NONE)) | 393 MSG_ROUTING_NONE, pending_web_ui())) |
422 return nullptr; | 394 return nullptr; |
423 | 395 |
424 // Now that we've created a new renderer, be sure to hide it if it isn't | 396 // Now that we've created a new renderer, be sure to hide it if it isn't |
425 // our primary one. Otherwise, we might crash if we try to call Show() | 397 // our primary one. Otherwise, we might crash if we try to call Show() |
426 // on it later. | 398 // on it later. |
427 if (dest_render_frame_host != render_frame_host_) { | 399 if (dest_render_frame_host != render_frame_host_) { |
428 if (dest_render_frame_host->GetView()) | 400 if (dest_render_frame_host->GetView()) |
429 dest_render_frame_host->GetView()->Hide(); | 401 dest_render_frame_host->GetView()->Hide(); |
430 } else { | 402 } else { |
431 // After a renderer crash we'd have marked the host as invisible, so we | 403 // After a renderer crash we'd have marked the host as invisible, so we |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
663 | 635 |
664 // Make sure any dynamic changes to this frame's sandbox flags that were made | 636 // Make sure any dynamic changes to this frame's sandbox flags that were made |
665 // prior to navigation take effect. | 637 // prior to navigation take effect. |
666 CommitPendingSandboxFlags(); | 638 CommitPendingSandboxFlags(); |
667 } | 639 } |
668 | 640 |
669 void RenderFrameHostManager::CommitPendingIfNecessary( | 641 void RenderFrameHostManager::CommitPendingIfNecessary( |
670 RenderFrameHostImpl* render_frame_host, | 642 RenderFrameHostImpl* render_frame_host, |
671 bool was_caused_by_user_gesture) { | 643 bool was_caused_by_user_gesture) { |
672 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { | 644 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { |
673 DCHECK_IMPLIES(should_reuse_web_ui_, web_ui_); | |
674 | 645 |
675 // We should only hear this from our current renderer. | 646 // We should only hear this from our current renderer. |
676 DCHECK_EQ(render_frame_host_, render_frame_host); | 647 DCHECK_EQ(render_frame_host_, render_frame_host); |
677 | 648 |
678 // Even when there is no pending RVH, there may be a pending Web UI. | 649 // If current RenderFrameHost has a pending Web UI, commit it. |
679 if (pending_web_ui() || speculative_web_ui_) | 650 if (render_frame_host_->pending_web_ui()) |
680 CommitPending(); | 651 CommitPending(); |
681 return; | 652 return; |
682 } | 653 } |
683 | 654 |
684 if (render_frame_host == pending_render_frame_host_ || | 655 if (render_frame_host == pending_render_frame_host_ || |
685 render_frame_host == speculative_render_frame_host_) { | 656 render_frame_host == speculative_render_frame_host_) { |
686 // The pending cross-process navigation completed, so show the renderer. | 657 // The pending cross-process navigation completed, so show the renderer. |
687 CommitPending(); | 658 CommitPending(); |
688 } else if (render_frame_host == render_frame_host_) { | 659 } else if (render_frame_host == render_frame_host_) { |
689 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 660 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1002 if (current_site_instance == dest_site_instance.get() || | 973 if (current_site_instance == dest_site_instance.get() || |
1003 (!request.browser_initiated() && is_main_frame) || | 974 (!request.browser_initiated() && is_main_frame) || |
1004 (!is_main_frame && !dest_site_instance->RequiresDedicatedProcess() && | 975 (!is_main_frame && !dest_site_instance->RequiresDedicatedProcess() && |
1005 !current_site_instance->RequiresDedicatedProcess())) { | 976 !current_site_instance->RequiresDedicatedProcess())) { |
1006 // Reuse the current RFH if its SiteInstance matches the the navigation's | 977 // Reuse the current RFH if its SiteInstance matches the the navigation's |
1007 // or if this is a subframe navigation. We only swap RFHs for subframes when | 978 // or if this is a subframe navigation. We only swap RFHs for subframes when |
1008 // --site-per-process is enabled. | 979 // --site-per-process is enabled. |
1009 CleanUpNavigation(); | 980 CleanUpNavigation(); |
1010 navigation_rfh = render_frame_host_.get(); | 981 navigation_rfh = render_frame_host_.get(); |
1011 | 982 |
1012 // As SiteInstances are the same, check if the WebUI should be reused. | 983 // As SiteInstances are the same, make the RFH update its possible pending |
1013 const NavigationEntry* current_navigation_entry = | 984 // WebUI. |
1014 delegate_->GetLastCommittedNavigationEntryForRenderManager(); | 985 render_frame_host_->UpdatePendingWebUI(request.common_params().url, |
1015 should_reuse_web_ui_ = ShouldReuseWebUI(current_navigation_entry, | 986 request.bindings()); |
1016 request.common_params().url); | 987 DCHECK(!speculative_render_frame_host_); |
1017 if (!should_reuse_web_ui_) { | 988 DCHECK(speculative_web_ui() == render_frame_host_->pending_web_ui()); |
1018 speculative_web_ui_ = CreateWebUI(request.common_params().url, | |
1019 request.bindings()); | |
1020 // Make sure the current RenderViewHost has the right bindings. | |
1021 if (speculative_web_ui() && | |
1022 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { | |
1023 render_frame_host_->render_view_host()->AllowBindings( | |
1024 speculative_web_ui()->GetBindings()); | |
1025 } | |
1026 } | |
1027 } else { | 989 } else { |
1028 // If the SiteInstance for the final URL doesn't match the one from the | 990 // If the SiteInstance for the final URL doesn't match the one from the |
1029 // speculatively created RenderFrameHost, create a new RenderFrameHost using | 991 // speculatively created RenderFrameHost, create a new RenderFrameHost using |
1030 // this new SiteInstance. | 992 // this new SiteInstance. |
1031 if (!speculative_render_frame_host_ || | 993 if (!speculative_render_frame_host_ || |
1032 speculative_render_frame_host_->GetSiteInstance() != | 994 speculative_render_frame_host_->GetSiteInstance() != |
1033 dest_site_instance.get()) { | 995 dest_site_instance.get()) { |
1034 CleanUpNavigation(); | 996 CleanUpNavigation(); |
1035 bool success = CreateSpeculativeRenderFrameHost( | 997 bool success = CreateSpeculativeRenderFrameHost( |
1036 request.common_params().url, current_site_instance, | 998 request.common_params().url, current_site_instance, |
1037 dest_site_instance.get(), request.bindings()); | 999 dest_site_instance.get(), request.bindings()); |
1038 DCHECK(success); | 1000 DCHECK(success); |
1001 } else { | |
1002 // When reusing an existing speculative RenderFrameHost its active WebUI | |
1003 // must be updated to make sure it matches the current URL. As it is not a | |
1004 // new RenderFrameHost instance it must be done by updating the pending | |
1005 // WebUI and immediately making it active. | |
1006 speculative_render_frame_host_->UpdatePendingWebUI( | |
1007 request.common_params().url, request.bindings()); | |
1008 speculative_render_frame_host_->CommitPendingWebUI(); | |
1039 } | 1009 } |
1040 DCHECK(speculative_render_frame_host_); | 1010 DCHECK(speculative_render_frame_host_); |
1011 DCHECK_EQ(speculative_web_ui(), speculative_render_frame_host_->web_ui()); | |
1012 | |
1041 navigation_rfh = speculative_render_frame_host_.get(); | 1013 navigation_rfh = speculative_render_frame_host_.get(); |
1042 | 1014 |
1043 // Check if our current RFH is live. | 1015 // Check if our current RFH is live. |
1044 if (!render_frame_host_->IsRenderFrameLive()) { | 1016 if (!render_frame_host_->IsRenderFrameLive()) { |
1045 // The current RFH is not live. There's no reason to sit around with a | 1017 // The current RFH is not live. There's no reason to sit around with a |
1046 // sad tab or a newly created RFH while we wait for the navigation to | 1018 // sad tab or a newly created RFH while we wait for the navigation to |
1047 // complete. Just switch to the speculative RFH now and go back to normal. | 1019 // complete. Just switch to the speculative RFH now and go back to normal. |
1048 // (Note that we don't care about on{before}unload handlers if the current | 1020 // (Note that we don't care about on{before}unload handlers if the current |
1049 // RFH isn't live.) | 1021 // RFH isn't live.) |
1050 CommitPending(); | 1022 CommitPending(); |
1051 } | 1023 } |
1052 } | 1024 } |
1053 DCHECK(navigation_rfh && | 1025 DCHECK(navigation_rfh && |
1054 (navigation_rfh == render_frame_host_.get() || | 1026 (navigation_rfh == render_frame_host_.get() || |
1055 navigation_rfh == speculative_render_frame_host_.get())); | 1027 navigation_rfh == speculative_render_frame_host_.get())); |
1056 | 1028 |
1057 // If the RenderFrame that needs to navigate is not live (its process was just | 1029 // If the RenderFrame that needs to navigate is not live (its process was just |
1058 // created or has crashed), initialize it. | 1030 // created or has crashed), initialize it. |
1059 if (!navigation_rfh->IsRenderFrameLive()) { | 1031 if (!navigation_rfh->IsRenderFrameLive()) { |
1060 // Recreate the opener chain. | 1032 // Recreate the opener chain. |
1061 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); | 1033 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); |
1062 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) { | 1034 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE, |
1035 speculative_web_ui())) { | |
1063 return nullptr; | 1036 return nullptr; |
1064 } | 1037 } |
1065 | 1038 |
1066 if (navigation_rfh == render_frame_host_) { | 1039 if (navigation_rfh == render_frame_host_) { |
1067 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 1040 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
1068 // manager still uses NotificationService and expects to see a | 1041 // manager still uses NotificationService and expects to see a |
1069 // RenderViewHost changed notification after WebContents and | 1042 // RenderViewHost changed notification after WebContents and |
1070 // RenderFrameHostManager are completely initialized. This should be | 1043 // RenderFrameHostManager are completely initialized. This should be |
1071 // removed once the process manager moves away from NotificationService. | 1044 // removed once the process manager moves away from NotificationService. |
1072 // See https://crbug.com/462682. | 1045 // See https://crbug.com/462682. |
1073 delegate_->NotifyMainFrameSwappedFromRenderManager( | 1046 delegate_->NotifyMainFrameSwappedFromRenderManager( |
1074 nullptr, render_frame_host_->render_view_host()); | 1047 nullptr, render_frame_host_->render_view_host()); |
1075 } | 1048 } |
1076 } | 1049 } |
1077 | 1050 |
1078 return navigation_rfh; | 1051 return navigation_rfh; |
1079 } | 1052 } |
1080 | 1053 |
1081 // PlzNavigate | 1054 // PlzNavigate |
1082 void RenderFrameHostManager::CleanUpNavigation() { | 1055 void RenderFrameHostManager::CleanUpNavigation() { |
1083 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1056 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
1084 switches::kEnableBrowserSideNavigation)); | 1057 switches::kEnableBrowserSideNavigation)); |
1085 speculative_web_ui_.reset(); | 1058 render_frame_host_->DiscardPendingWebUI(); |
nasko
2015/10/01 20:05:16
Why are we touching the pending WebUI of the curre
carlosk
2015/10/05 16:59:58
For *both* navigation implementations, when the cu
| |
1086 should_reuse_web_ui_ = false; | |
1087 if (speculative_render_frame_host_) | 1059 if (speculative_render_frame_host_) |
1088 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); | 1060 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); |
1089 } | 1061 } |
1090 | 1062 |
1091 // PlzNavigate | 1063 // PlzNavigate |
1092 scoped_ptr<RenderFrameHostImpl> | 1064 scoped_ptr<RenderFrameHostImpl> |
1093 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { | 1065 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { |
1094 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1066 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
1095 switches::kEnableBrowserSideNavigation)); | 1067 switches::kEnableBrowserSideNavigation)); |
1096 speculative_render_frame_host_->GetProcess()->RemovePendingView(); | 1068 speculative_render_frame_host_->GetProcess()->RemovePendingView(); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1260 // We can't switch a RenderView between view source and non-view source mode | 1232 // We can't switch a RenderView between view source and non-view source mode |
1261 // without screwing up the session history sometimes (when navigating between | 1233 // without screwing up the session history sometimes (when navigating between |
1262 // "view-source:http://foo.com/" and "http://foo.com/", Blink doesn't treat | 1234 // "view-source:http://foo.com/" and "http://foo.com/", Blink doesn't treat |
1263 // it as a new navigation). So require a BrowsingInstance switch. | 1235 // it as a new navigation). So require a BrowsingInstance switch. |
1264 if (current_is_view_source_mode != new_is_view_source_mode) | 1236 if (current_is_view_source_mode != new_is_view_source_mode) |
1265 return true; | 1237 return true; |
1266 | 1238 |
1267 return false; | 1239 return false; |
1268 } | 1240 } |
1269 | 1241 |
1270 bool RenderFrameHostManager::ShouldReuseWebUI( | |
1271 const NavigationEntry* current_entry, | |
1272 const GURL& new_url) const { | |
1273 NavigationControllerImpl& controller = | |
1274 delegate_->GetControllerForRenderManager(); | |
1275 return current_entry && web_ui_ && | |
1276 (WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( | |
1277 controller.GetBrowserContext(), current_entry->GetURL()) == | |
1278 WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( | |
1279 controller.GetBrowserContext(), new_url)); | |
1280 } | |
1281 | |
1282 SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( | 1242 SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( |
1283 const GURL& dest_url, | 1243 const GURL& dest_url, |
1284 SiteInstance* source_instance, | 1244 SiteInstance* source_instance, |
1285 SiteInstance* dest_instance, | 1245 SiteInstance* dest_instance, |
1286 SiteInstance* candidate_instance, | 1246 SiteInstance* candidate_instance, |
1287 ui::PageTransition transition, | 1247 ui::PageTransition transition, |
1288 bool dest_is_restore, | 1248 bool dest_is_restore, |
1289 bool dest_is_view_source_mode) { | 1249 bool dest_is_view_source_mode) { |
1290 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); | 1250 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
1291 | 1251 |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1555 // to open a new tab to an interstitial-inducing URL, and then navigates | 1515 // to open a new tab to an interstitial-inducing URL, and then navigates |
1556 // the page to a different same-site URL. (This seems very unlikely in | 1516 // the page to a different same-site URL. (This seems very unlikely in |
1557 // practice.) | 1517 // practice.) |
1558 if (current_entry) | 1518 if (current_entry) |
1559 return current_entry->GetURL(); | 1519 return current_entry->GetURL(); |
1560 return current_instance->GetSiteURL(); | 1520 return current_instance->GetSiteURL(); |
1561 } | 1521 } |
1562 | 1522 |
1563 void RenderFrameHostManager::CreatePendingRenderFrameHost( | 1523 void RenderFrameHostManager::CreatePendingRenderFrameHost( |
1564 SiteInstance* old_instance, | 1524 SiteInstance* old_instance, |
1565 SiteInstance* new_instance) { | 1525 SiteInstance* new_instance, |
1526 const GURL& url, | |
1527 int bindings) { | |
1566 int create_render_frame_flags = 0; | 1528 int create_render_frame_flags = 0; |
1567 if (delegate_->IsHidden()) | 1529 if (delegate_->IsHidden()) |
1568 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1530 create_render_frame_flags |= CREATE_RF_HIDDEN; |
1569 | 1531 |
1570 if (pending_render_frame_host_) | 1532 if (pending_render_frame_host_) |
1571 CancelPending(); | 1533 CancelPending(); |
1572 | 1534 |
1573 // The process for the new SiteInstance may (if we're sharing a process with | 1535 // The process for the new SiteInstance may (if we're sharing a process with |
1574 // another host that already initialized it) or may not (we have our own | 1536 // another host that already initialized it) or may not (we have our own |
1575 // process or the existing process crashed) have been initialized. Calling | 1537 // process or the existing process crashed) have been initialized. Calling |
1576 // Init multiple times will be ignored, so this is safe. | 1538 // Init multiple times will be ignored, so this is safe. |
1577 if (!new_instance->GetProcess()->Init()) | 1539 if (!new_instance->GetProcess()->Init()) |
1578 return; | 1540 return; |
1579 | 1541 |
1580 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1542 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
1581 | 1543 |
1582 // Create a non-swapped-out RFH with the given opener. | 1544 // Create a non-swapped-out RFH with the given opener. |
1583 pending_render_frame_host_ = CreateRenderFrame( | 1545 pending_render_frame_host_ = CreateRenderFrameInternal( |
1584 new_instance, pending_web_ui(), create_render_frame_flags, nullptr); | 1546 new_instance, url, bindings, create_render_frame_flags, nullptr); |
1585 } | 1547 } |
1586 | 1548 |
1587 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( | 1549 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( |
1588 SiteInstance* old_instance, | 1550 SiteInstance* old_instance, |
1589 SiteInstance* new_instance) { | 1551 SiteInstance* new_instance) { |
1590 // Only create opener proxies if they are in the same BrowsingInstance. | 1552 // Only create opener proxies if they are in the same BrowsingInstance. |
1591 if (new_instance->IsRelatedSiteInstance(old_instance)) { | 1553 if (new_instance->IsRelatedSiteInstance(old_instance)) { |
1592 CreateOpenerProxies(new_instance, frame_tree_node_); | 1554 CreateOpenerProxies(new_instance, frame_tree_node_); |
1593 } else if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) { | 1555 } else if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) { |
1594 // Ensure that the frame tree has RenderFrameProxyHosts for the | 1556 // Ensure that the frame tree has RenderFrameProxyHosts for the |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1630 if (ancestor_rfh->GetSiteInstance() != current_instance) | 1592 if (ancestor_rfh->GetSiteInstance() != current_instance) |
1631 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); | 1593 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); |
1632 } | 1594 } |
1633 } | 1595 } |
1634 | 1596 |
1635 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 1597 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
1636 SiteInstance* site_instance, | 1598 SiteInstance* site_instance, |
1637 int32 view_routing_id, | 1599 int32 view_routing_id, |
1638 int32 frame_routing_id, | 1600 int32 frame_routing_id, |
1639 int32 widget_routing_id, | 1601 int32 widget_routing_id, |
1640 int flags) { | 1602 int flags, |
1603 const GURL& dest_url, | |
1604 int past_bindings) { | |
1641 if (frame_routing_id == MSG_ROUTING_NONE) | 1605 if (frame_routing_id == MSG_ROUTING_NONE) |
1642 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1606 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
1643 | 1607 |
1644 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 1608 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
1645 bool hidden = !!(flags & CREATE_RF_HIDDEN); | 1609 bool hidden = !!(flags & CREATE_RF_HIDDEN); |
1646 | 1610 |
1647 // Create a RVH for main frames, or find the existing one for subframes. | 1611 // Create a RVH for main frames, or find the existing one for subframes. |
1648 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 1612 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
1649 RenderViewHostImpl* render_view_host = nullptr; | 1613 RenderViewHostImpl* render_view_host = nullptr; |
1650 if (frame_tree_node_->IsMainFrame()) { | 1614 if (frame_tree_node_->IsMainFrame()) { |
1651 render_view_host = frame_tree->CreateRenderViewHost( | 1615 render_view_host = frame_tree->CreateRenderViewHost( |
1652 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); | 1616 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); |
1653 } else { | 1617 } else { |
1654 render_view_host = frame_tree->GetRenderViewHost(site_instance); | 1618 render_view_host = frame_tree->GetRenderViewHost(site_instance); |
1655 CHECK(render_view_host); | 1619 CHECK(render_view_host); |
1656 } | 1620 } |
1657 | 1621 |
1658 return RenderFrameHostFactory::Create( | 1622 return RenderFrameHostFactory::Create( |
1659 site_instance, render_view_host, render_frame_delegate_, | 1623 site_instance, render_view_host, render_frame_delegate_, |
1660 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, | 1624 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, |
1661 widget_routing_id, flags); | 1625 widget_routing_id, flags, dest_url, past_bindings); |
1662 } | 1626 } |
1663 | 1627 |
1664 // PlzNavigate | 1628 // PlzNavigate |
1665 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( | 1629 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
1666 const GURL& url, | 1630 const GURL& url, |
1667 SiteInstance* old_instance, | 1631 SiteInstance* old_instance, |
1668 SiteInstance* new_instance, | 1632 SiteInstance* new_instance, |
1669 int bindings) { | 1633 int bindings) { |
1670 CHECK(new_instance); | 1634 CHECK(new_instance); |
1671 CHECK_NE(old_instance, new_instance); | 1635 CHECK_NE(old_instance, new_instance); |
1672 CHECK(!should_reuse_web_ui_); | |
1673 | |
1674 // Note: |speculative_web_ui_| must be initialized before starting the | |
1675 // |speculative_render_frame_host_| creation steps otherwise the WebUI | |
1676 // won't be properly initialized. | |
1677 speculative_web_ui_ = CreateWebUI(url, bindings); | |
1678 | 1636 |
1679 // The process for the new SiteInstance may (if we're sharing a process with | 1637 // The process for the new SiteInstance may (if we're sharing a process with |
1680 // another host that already initialized it) or may not (we have our own | 1638 // another host that already initialized it) or may not (we have our own |
1681 // process or the existing process crashed) have been initialized. Calling | 1639 // process or the existing process crashed) have been initialized. Calling |
1682 // Init multiple times will be ignored, so this is safe. | 1640 // Init multiple times will be ignored, so this is safe. |
1683 if (!new_instance->GetProcess()->Init()) | 1641 if (!new_instance->GetProcess()->Init()) |
1684 return false; | 1642 return false; |
1685 | 1643 |
1686 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1644 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
1687 | 1645 |
1688 int create_render_frame_flags = 0; | 1646 int create_render_frame_flags = 0; |
1689 if (delegate_->IsHidden()) | 1647 if (delegate_->IsHidden()) |
1690 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1648 create_render_frame_flags |= CREATE_RF_HIDDEN; |
1691 speculative_render_frame_host_ = | 1649 speculative_render_frame_host_ = CreateRenderFrameInternal( |
1692 CreateRenderFrame(new_instance, speculative_web_ui_.get(), | 1650 new_instance, url, bindings, create_render_frame_flags, nullptr); |
1693 create_render_frame_flags, nullptr); | |
1694 | 1651 |
1695 if (!speculative_render_frame_host_) { | |
1696 speculative_web_ui_.reset(); | |
1697 return false; | |
1698 } | |
1699 return true; | 1652 return true; |
1700 } | 1653 } |
1701 | 1654 |
1702 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( | 1655 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
1703 SiteInstance* instance, | 1656 SiteInstance* instance, |
1704 WebUIImpl* web_ui, | |
1705 int flags, | 1657 int flags, |
1706 int* view_routing_id_ptr) { | 1658 int* view_routing_id_ptr) { |
1659 return CreateRenderFrameInternal(instance, GURL(), | |
1660 NavigationEntryImpl::kInvalidBindings, flags, | |
1661 view_routing_id_ptr); | |
1662 } | |
1663 | |
1664 scoped_ptr<RenderFrameHostImpl> | |
1665 RenderFrameHostManager::CreateRenderFrameInternal(SiteInstance* instance, | |
1666 const GURL& url, | |
1667 int bindings, | |
nasko
2015/10/01 20:05:16
I wonder if we can avoid creating this extra metho
carlosk
2015/10/05 16:59:58
That's the solution I had before. PTAL at the disc
nasko
2015/10/07 23:49:32
The argument that we always have to call the extra
carlosk
2015/10/09 17:29:10
OK, I'll ping cresi@.
Passing the extra parameter
carlosk
2015/10/13 14:40:26
After a VC with Nasko I reverted to having the RFH
Charlie Reis
2015/10/13 17:03:27
I chatted with Nasko to get the context, and it so
| |
1668 int flags, | |
1669 int* view_routing_id_ptr) { | |
1707 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 1670 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
1708 bool swapped_out_forbidden = | 1671 bool swapped_out_forbidden = |
1709 SiteIsolationPolicy::IsSwappedOutStateForbidden(); | 1672 SiteIsolationPolicy::IsSwappedOutStateForbidden(); |
1710 | 1673 |
1711 CHECK(instance); | 1674 CHECK(instance); |
1712 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out); | 1675 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out); |
1713 CHECK_IMPLIES(!SiteIsolationPolicy::AreCrossProcessFramesPossible(), | 1676 CHECK_IMPLIES(!SiteIsolationPolicy::AreCrossProcessFramesPossible(), |
1714 frame_tree_node_->IsMainFrame()); | 1677 frame_tree_node_->IsMainFrame()); |
1715 | 1678 |
1716 // Swapped out views should always be hidden. | 1679 // Swapped out views should always be hidden. |
(...skipping 14 matching lines...) Expand all Loading... | |
1731 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1694 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
1732 if (proxy && proxy->render_frame_host()) { | 1695 if (proxy && proxy->render_frame_host()) { |
1733 RenderViewHost* render_view_host = proxy->GetRenderViewHost(); | 1696 RenderViewHost* render_view_host = proxy->GetRenderViewHost(); |
1734 CHECK(!swapped_out_forbidden); | 1697 CHECK(!swapped_out_forbidden); |
1735 if (view_routing_id_ptr) | 1698 if (view_routing_id_ptr) |
1736 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); | 1699 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); |
1737 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. | 1700 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. |
1738 // Prevent the process from exiting while we're trying to use it. | 1701 // Prevent the process from exiting while we're trying to use it. |
1739 if (!swapped_out) { | 1702 if (!swapped_out) { |
1740 new_render_frame_host = proxy->PassFrameHostOwnership(); | 1703 new_render_frame_host = proxy->PassFrameHostOwnership(); |
1704 new_render_frame_host->UpdatePendingWebUI(url, bindings); | |
1705 new_render_frame_host->CommitPendingWebUI(); | |
1741 new_render_frame_host->GetProcess()->AddPendingView(); | 1706 new_render_frame_host->GetProcess()->AddPendingView(); |
1742 | 1707 |
1743 proxy_hosts_->Remove(instance->GetId()); | 1708 proxy_hosts_->Remove(instance->GetId()); |
1744 // NB |proxy| is deleted at this point. | 1709 // NB |proxy| is deleted at this point. |
1745 | 1710 |
1746 // If we are reusing the RenderViewHost and it doesn't already have a | 1711 // If we are reusing the RenderViewHost and it doesn't already have a |
1747 // RenderWidgetHostView, we need to create one if this is the main frame. | 1712 // RenderWidgetHostView, we need to create one if this is the main frame. |
1748 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) | 1713 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) |
1749 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | 1714 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); |
1750 } | 1715 } |
1751 } else { | 1716 } else { |
1752 // Create a new RenderFrameHost if we don't find an existing one. | 1717 // Create a new RenderFrameHost if we don't find an existing one. |
1753 | 1718 |
1754 int32 widget_routing_id = MSG_ROUTING_NONE; | 1719 int32 widget_routing_id = MSG_ROUTING_NONE; |
1755 // A RenderFrame in a different process from its parent RenderFrame | 1720 // A RenderFrame in a different process from its parent RenderFrame |
1756 // requires a RenderWidget for input/layout/painting. | 1721 // requires a RenderWidget for input/layout/painting. |
1757 if (frame_tree_node_->parent() && | 1722 if (frame_tree_node_->parent() && |
1758 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 1723 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
1759 instance) { | 1724 instance) { |
1760 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 1725 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); |
1761 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); | 1726 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); |
1762 } | 1727 } |
1763 | 1728 |
1764 new_render_frame_host = CreateRenderFrameHost( | 1729 new_render_frame_host = |
1765 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); | 1730 CreateRenderFrameHost(instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, |
1731 widget_routing_id, flags, url, bindings); | |
1766 RenderViewHostImpl* render_view_host = | 1732 RenderViewHostImpl* render_view_host = |
1767 new_render_frame_host->render_view_host(); | 1733 new_render_frame_host->render_view_host(); |
1768 int proxy_routing_id = MSG_ROUTING_NONE; | 1734 int proxy_routing_id = MSG_ROUTING_NONE; |
1769 | 1735 |
1770 // Prevent the process from exiting while we're trying to navigate in it. | 1736 // Prevent the process from exiting while we're trying to navigate in it. |
1771 // Otherwise, if the new RFH is swapped out already, store it. | 1737 // Otherwise, if the new RFH is swapped out already, store it. |
1772 if (!swapped_out) { | 1738 if (!swapped_out) { |
1773 new_render_frame_host->GetProcess()->AddPendingView(); | 1739 new_render_frame_host->GetProcess()->AddPendingView(); |
1774 } else { | 1740 } else { |
1775 proxy = new RenderFrameProxyHost( | 1741 proxy = new RenderFrameProxyHost( |
1776 new_render_frame_host->GetSiteInstance(), | 1742 new_render_frame_host->GetSiteInstance(), |
1777 new_render_frame_host->render_view_host(), frame_tree_node_); | 1743 new_render_frame_host->render_view_host(), frame_tree_node_); |
1778 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); | 1744 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
1779 proxy_routing_id = proxy->GetRoutingID(); | 1745 proxy_routing_id = proxy->GetRoutingID(); |
1780 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1746 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1781 } | 1747 } |
1782 | 1748 |
1783 if (frame_tree_node_->IsMainFrame()) { | 1749 if (frame_tree_node_->IsMainFrame()) { |
1784 success = InitRenderView(render_view_host, proxy_routing_id); | 1750 success = InitRenderView( |
1751 render_view_host, proxy_routing_id, | |
1752 swapped_out ? nullptr : new_render_frame_host->web_ui()); | |
1785 | 1753 |
1786 // If we are reusing the RenderViewHost and it doesn't already have a | 1754 // If we are reusing the RenderViewHost and it doesn't already have a |
1787 // RenderWidgetHostView, we need to create one if this is the main frame. | 1755 // RenderWidgetHostView, we need to create one if this is the main frame. |
1788 if (!swapped_out && !render_view_host->GetView()) | 1756 if (!swapped_out && !render_view_host->GetView()) |
1789 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | 1757 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); |
1790 } else { | 1758 } else { |
1791 DCHECK(render_view_host->IsRenderViewLive()); | 1759 DCHECK(render_view_host->IsRenderViewLive()); |
1792 } | 1760 } |
1793 | 1761 |
1794 if (success) { | 1762 if (success) { |
(...skipping 18 matching lines...) Expand all Loading... | |
1813 success = InitRenderFrame(new_render_frame_host.get()); | 1781 success = InitRenderFrame(new_render_frame_host.get()); |
1814 } | 1782 } |
1815 } | 1783 } |
1816 | 1784 |
1817 if (success) { | 1785 if (success) { |
1818 if (view_routing_id_ptr) | 1786 if (view_routing_id_ptr) |
1819 *view_routing_id_ptr = render_view_host->GetRoutingID(); | 1787 *view_routing_id_ptr = render_view_host->GetRoutingID(); |
1820 } | 1788 } |
1821 } | 1789 } |
1822 | 1790 |
1823 // When a new RenderView is created by the renderer process, the new | |
1824 // WebContents gets a RenderViewHost in the SiteInstance of its opener | |
1825 // WebContents. If not used in the first navigation, this RVH is swapped out | |
1826 // and is not granted bindings, so we may need to grant them when swapping it | |
1827 // in. | |
1828 if (web_ui && !new_render_frame_host->GetProcess()->IsForGuestsOnly()) { | |
1829 int required_bindings = web_ui->GetBindings(); | |
1830 RenderViewHost* render_view_host = | |
1831 new_render_frame_host->render_view_host(); | |
1832 if ((render_view_host->GetEnabledBindings() & required_bindings) != | |
1833 required_bindings) { | |
1834 render_view_host->AllowBindings(required_bindings); | |
1835 } | |
1836 } | |
1837 | |
1838 // Returns the new RFH if it isn't swapped out. | 1791 // Returns the new RFH if it isn't swapped out. |
1839 if (success && !swapped_out) { | 1792 if (success && !swapped_out) { |
1840 DCHECK(new_render_frame_host->GetSiteInstance() == instance); | 1793 DCHECK(new_render_frame_host->GetSiteInstance() == instance); |
1841 return new_render_frame_host.Pass(); | 1794 return new_render_frame_host.Pass(); |
1842 } | 1795 } |
1843 return nullptr; | 1796 return nullptr; |
1844 } | 1797 } |
1845 | 1798 |
1846 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { | 1799 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { |
1847 // A RenderFrameProxyHost should never be created in the same SiteInstance as | 1800 // A RenderFrameProxyHost should never be created in the same SiteInstance as |
(...skipping 20 matching lines...) Expand all Loading... | |
1868 return proxy->GetRoutingID(); | 1821 return proxy->GetRoutingID(); |
1869 | 1822 |
1870 if (!proxy) { | 1823 if (!proxy) { |
1871 proxy = | 1824 proxy = |
1872 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); | 1825 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); |
1873 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); | 1826 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
1874 } | 1827 } |
1875 | 1828 |
1876 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && | 1829 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && |
1877 frame_tree_node_->IsMainFrame()) { | 1830 frame_tree_node_->IsMainFrame()) { |
1878 InitRenderView(render_view_host, proxy->GetRoutingID()); | 1831 InitRenderView(render_view_host, proxy->GetRoutingID(), nullptr); |
1879 proxy->set_render_frame_proxy_created(true); | 1832 proxy->set_render_frame_proxy_created(true); |
1880 } else { | 1833 } else { |
1881 proxy->InitRenderFrameProxy(); | 1834 proxy->InitRenderFrameProxy(); |
1882 } | 1835 } |
1883 | 1836 |
1884 return proxy->GetRoutingID(); | 1837 return proxy->GetRoutingID(); |
1885 } | 1838 } |
1886 | 1839 |
1887 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { | 1840 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { |
1888 for (const auto& pair : *proxy_hosts_) { | 1841 for (const auto& pair : *proxy_hosts_) { |
(...skipping 14 matching lines...) Expand all Loading... | |
1903 | 1856 |
1904 if (render_view_host->IsRenderViewLive()) | 1857 if (render_view_host->IsRenderViewLive()) |
1905 return; | 1858 return; |
1906 | 1859 |
1907 // If the proxy in |instance| doesn't exist, this RenderView is not swapped | 1860 // If the proxy in |instance| doesn't exist, this RenderView is not swapped |
1908 // out and shouldn't be reinitialized here. | 1861 // out and shouldn't be reinitialized here. |
1909 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1862 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
1910 if (!proxy) | 1863 if (!proxy) |
1911 return; | 1864 return; |
1912 | 1865 |
1913 InitRenderView(render_view_host, proxy->GetRoutingID()); | 1866 InitRenderView(render_view_host, proxy->GetRoutingID(), nullptr); |
1914 proxy->set_render_frame_proxy_created(true); | 1867 proxy->set_render_frame_proxy_created(true); |
1915 } | 1868 } |
1916 | 1869 |
1917 void RenderFrameHostManager::CreateOuterDelegateProxy( | 1870 void RenderFrameHostManager::CreateOuterDelegateProxy( |
1918 SiteInstance* outer_contents_site_instance, | 1871 SiteInstance* outer_contents_site_instance, |
1919 RenderFrameHostImpl* render_frame_host) { | 1872 RenderFrameHostImpl* render_frame_host) { |
1920 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); | 1873 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); |
1921 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 1874 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( |
1922 outer_contents_site_instance, nullptr, frame_tree_node_); | 1875 outer_contents_site_instance, nullptr, frame_tree_node_); |
1923 proxy_hosts_->Add(outer_contents_site_instance->GetId(), | 1876 proxy_hosts_->Add(outer_contents_site_instance->GetId(), |
(...skipping 14 matching lines...) Expand all Loading... | |
1938 } | 1891 } |
1939 | 1892 |
1940 void RenderFrameHostManager::SetRWHViewForInnerContents( | 1893 void RenderFrameHostManager::SetRWHViewForInnerContents( |
1941 RenderWidgetHostView* child_rwhv) { | 1894 RenderWidgetHostView* child_rwhv) { |
1942 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); | 1895 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); |
1943 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); | 1896 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); |
1944 } | 1897 } |
1945 | 1898 |
1946 bool RenderFrameHostManager::InitRenderView( | 1899 bool RenderFrameHostManager::InitRenderView( |
1947 RenderViewHostImpl* render_view_host, | 1900 RenderViewHostImpl* render_view_host, |
1948 int proxy_routing_id) { | 1901 int proxy_routing_id, |
1902 WebUIImpl* dest_web_ui) { | |
nasko
2015/10/01 20:05:16
Why pass this as a parameter? Can't we just get it
carlosk
2015/10/05 16:59:58
No, because the RFH is not yet set as current/pend
nasko
2015/10/07 23:49:32
I think we can do better, but let's revisit this i
carlosk
2015/10/09 17:29:10
Acknowledged. Let's talk and figure out what can b
| |
1949 // Ensure the renderer process is initialized before creating the | 1903 // Ensure the renderer process is initialized before creating the |
1950 // RenderView. | 1904 // RenderView. |
1951 if (!render_view_host->GetProcess()->Init()) | 1905 if (!render_view_host->GetProcess()->Init()) |
1952 return false; | 1906 return false; |
1953 | 1907 |
1954 // We may have initialized this RenderViewHost for another RenderFrameHost. | 1908 // We may have initialized this RenderViewHost for another RenderFrameHost. |
1955 if (render_view_host->IsRenderViewLive()) | 1909 if (render_view_host->IsRenderViewLive()) |
1956 return true; | 1910 return true; |
1957 | 1911 |
1958 // If the ongoing navigation is to a WebUI and the RenderView is not in a | 1912 // If the ongoing navigation is not to a WebUI or the RenderView is in a |
1959 // guest process, tell the RenderViewHost about any bindings it will need | 1913 // guest process, ensure that we don't create an unprivileged RenderView in a |
1960 // enabled. | 1914 // WebUI-enabled process unless it's swapped out. |
1961 WebUIImpl* dest_web_ui = nullptr; | 1915 if ((!dest_web_ui || render_view_host->GetProcess()->IsForGuestsOnly()) && |
1962 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1916 render_view_host->is_active()) { |
1963 switches::kEnableBrowserSideNavigation)) { | 1917 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
1964 dest_web_ui = | 1918 render_view_host->GetProcess()->GetID())); |
1965 should_reuse_web_ui_ ? web_ui_.get() : speculative_web_ui_.get(); | |
1966 } else { | |
1967 dest_web_ui = pending_web_ui(); | |
1968 } | |
1969 if (dest_web_ui && !render_view_host->GetProcess()->IsForGuestsOnly()) { | |
1970 render_view_host->AllowBindings(dest_web_ui->GetBindings()); | |
1971 } else { | |
1972 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled | |
1973 // process unless it's swapped out. | |
1974 if (render_view_host->is_active()) { | |
1975 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | |
1976 render_view_host->GetProcess()->GetID())); | |
1977 } | |
1978 } | 1919 } |
1979 | 1920 |
1980 int opener_frame_routing_id = | 1921 int opener_frame_routing_id = |
1981 GetOpenerRoutingID(render_view_host->GetSiteInstance()); | 1922 GetOpenerRoutingID(render_view_host->GetSiteInstance()); |
1982 | 1923 |
1983 return delegate_->CreateRenderViewForRenderManager( | 1924 return delegate_->CreateRenderViewForRenderManager( |
1984 render_view_host, opener_frame_routing_id, proxy_routing_id, | 1925 render_view_host, opener_frame_routing_id, proxy_routing_id, |
1985 frame_tree_node_->current_replication_state()); | 1926 frame_tree_node_->current_replication_state()); |
1986 } | 1927 } |
1987 | 1928 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2055 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); | 1996 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); |
2056 if (proxy) | 1997 if (proxy) |
2057 return proxy->GetRoutingID(); | 1998 return proxy->GetRoutingID(); |
2058 | 1999 |
2059 return MSG_ROUTING_NONE; | 2000 return MSG_ROUTING_NONE; |
2060 } | 2001 } |
2061 | 2002 |
2062 void RenderFrameHostManager::CommitPending() { | 2003 void RenderFrameHostManager::CommitPending() { |
2063 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", | 2004 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", |
2064 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 2005 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
2065 bool browser_side_navigation = | |
2066 base::CommandLine::ForCurrentProcess()->HasSwitch( | |
2067 switches::kEnableBrowserSideNavigation); | |
2068 | |
2069 // First check whether we're going to want to focus the location bar after | 2006 // First check whether we're going to want to focus the location bar after |
2070 // this commit. We do this now because the navigation hasn't formally | 2007 // this commit. We do this now because the navigation hasn't formally |
2071 // committed yet, so if we've already cleared |pending_web_ui_| the call chain | 2008 // committed yet, so if we've already cleared the pending WebUI the call chain |
2072 // this triggers won't be able to figure out what's going on. | 2009 // this triggers won't be able to figure out what's going on. |
2073 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); | 2010 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); |
2074 | 2011 |
2075 // Next commit the Web UI, if any. Either replace |web_ui_| with | 2012 // If the current RenderFrameHost has a pending Web UI then just commit it and |
2076 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or | 2013 // return (there should be nothing else to commit). |
2077 // leave |web_ui_| as is if reusing it. | 2014 if (render_frame_host_->pending_web_ui()) { |
2078 DCHECK(!(pending_web_ui_ && pending_and_current_web_ui_)); | 2015 DCHECK(!pending_render_frame_host_ && !speculative_render_frame_host_); |
2079 if (pending_web_ui_ || speculative_web_ui_) { | 2016 render_frame_host_->CommitPendingWebUI(); |
2080 DCHECK(!should_reuse_web_ui_); | |
2081 web_ui_.reset(browser_side_navigation ? speculative_web_ui_.release() | |
2082 : pending_web_ui_.release()); | |
2083 } else if (pending_and_current_web_ui_ || should_reuse_web_ui_) { | |
2084 if (browser_side_navigation) { | |
2085 DCHECK(web_ui_); | |
2086 should_reuse_web_ui_ = false; | |
2087 } else { | |
2088 DCHECK_EQ(pending_and_current_web_ui_.get(), web_ui_.get()); | |
2089 pending_and_current_web_ui_.reset(); | |
2090 } | |
2091 } else { | |
2092 web_ui_.reset(); | |
2093 } | |
2094 DCHECK(!speculative_web_ui_); | |
2095 DCHECK(!should_reuse_web_ui_); | |
2096 | |
2097 // It's possible for the pending_render_frame_host_ to be nullptr when we | |
2098 // aren't crossing process boundaries. If so, we just needed to handle the Web | |
2099 // UI committing above and we're done. | |
2100 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { | |
2101 if (will_focus_location_bar) | 2017 if (will_focus_location_bar) |
2102 delegate_->SetFocusToLocationBar(false); | 2018 delegate_->SetFocusToLocationBar(false); |
2103 return; | 2019 return; |
2104 } | 2020 } |
2105 | 2021 |
2106 // Remember if the page was focused so we can focus the new renderer in | 2022 // Remember if the page was focused so we can focus the new renderer in |
2107 // that case. | 2023 // that case. |
2108 bool focus_render_view = !will_focus_location_bar && | 2024 bool focus_render_view = !will_focus_location_bar && |
2109 render_frame_host_->GetView() && | 2025 render_frame_host_->GetView() && |
2110 render_frame_host_->GetView()->HasFocus(); | 2026 render_frame_host_->GetView()->HasFocus(); |
2111 | 2027 |
2112 bool is_main_frame = frame_tree_node_->IsMainFrame(); | 2028 bool is_main_frame = frame_tree_node_->IsMainFrame(); |
2113 | 2029 |
2114 // Swap in the pending or speculative frame and make it active. Also ensure | 2030 // Swap in the pending or speculative frame and make it active. Also ensure |
2115 // the FrameTree stays in sync. | 2031 // the FrameTree stays in sync. |
2116 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; | 2032 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; |
2117 if (!browser_side_navigation) { | 2033 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
2034 switches::kEnableBrowserSideNavigation)) { | |
2118 DCHECK(!speculative_render_frame_host_); | 2035 DCHECK(!speculative_render_frame_host_); |
2119 old_render_frame_host = | 2036 old_render_frame_host = |
2120 SetRenderFrameHost(pending_render_frame_host_.Pass()); | 2037 SetRenderFrameHost(pending_render_frame_host_.Pass()); |
2121 } else { | 2038 } else { |
2122 // PlzNavigate | 2039 // PlzNavigate |
2123 DCHECK(speculative_render_frame_host_); | 2040 DCHECK(speculative_render_frame_host_); |
2124 old_render_frame_host = | 2041 old_render_frame_host = |
2125 SetRenderFrameHost(speculative_render_frame_host_.Pass()); | 2042 SetRenderFrameHost(speculative_render_frame_host_.Pass()); |
2126 } | 2043 } |
2127 | 2044 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2269 // If we are currently navigating cross-process, we want to get back to normal | 2186 // If we are currently navigating cross-process, we want to get back to normal |
2270 // and then navigate as usual. | 2187 // and then navigate as usual. |
2271 if (pending_render_frame_host_) | 2188 if (pending_render_frame_host_) |
2272 CancelPending(); | 2189 CancelPending(); |
2273 | 2190 |
2274 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); | 2191 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
2275 scoped_refptr<SiteInstance> new_instance = GetSiteInstanceForNavigation( | 2192 scoped_refptr<SiteInstance> new_instance = GetSiteInstanceForNavigation( |
2276 dest_url, source_instance, dest_instance, nullptr, transition, | 2193 dest_url, source_instance, dest_instance, nullptr, transition, |
2277 dest_is_restore, dest_is_view_source_mode); | 2194 dest_is_restore, dest_is_view_source_mode); |
2278 | 2195 |
2279 const NavigationEntry* current_entry = | |
2280 delegate_->GetLastCommittedNavigationEntryForRenderManager(); | |
2281 | |
2282 DCHECK(!pending_render_frame_host_); | 2196 DCHECK(!pending_render_frame_host_); |
2283 | 2197 |
2284 if (new_instance.get() != current_instance) { | 2198 if (new_instance.get() != current_instance) { |
2285 TRACE_EVENT_INSTANT2( | 2199 TRACE_EVENT_INSTANT2( |
2286 "navigation", | 2200 "navigation", |
2287 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance", | 2201 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance", |
2288 TRACE_EVENT_SCOPE_THREAD, | 2202 TRACE_EVENT_SCOPE_THREAD, |
2289 "current_instance id", current_instance->GetId(), | 2203 "current_instance id", current_instance->GetId(), |
2290 "new_instance id", new_instance->GetId()); | 2204 "new_instance id", new_instance->GetId()); |
2291 | 2205 |
2292 // New SiteInstance: create a pending RFH to navigate. | 2206 // New SiteInstance: create a pending RFH to navigate. |
2293 | 2207 |
2294 // This will possibly create (set to nullptr) a Web UI object for the | 2208 CreatePendingRenderFrameHost(current_instance, new_instance.get(), dest_url, |
2295 // pending page. We'll use this later to give the page special access. This | 2209 bindings); |
2296 // must happen before the new renderer is created below so it will get | |
2297 // bindings. It must also happen after the above conditional call to | |
2298 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_ | |
2299 // and the page will not have its bindings set appropriately. | |
2300 SetPendingWebUI(dest_url, bindings); | |
2301 CreatePendingRenderFrameHost(current_instance, new_instance.get()); | |
2302 if (!pending_render_frame_host_) | 2210 if (!pending_render_frame_host_) |
2303 return nullptr; | 2211 return nullptr; |
2304 | 2212 |
2305 // Check if our current RFH is live before we set up a transition. | 2213 // Check if our current RFH is live before we set up a transition. |
2306 if (!render_frame_host_->IsRenderFrameLive()) { | 2214 if (!render_frame_host_->IsRenderFrameLive()) { |
2307 // The current RFH is not live. There's no reason to sit around with a | 2215 // The current RFH is not live. There's no reason to sit around with a |
2308 // sad tab or a newly created RFH while we wait for the pending RFH to | 2216 // sad tab or a newly created RFH while we wait for the pending RFH to |
2309 // navigate. Just switch to the pending RFH now and go back to normal. | 2217 // navigate. Just switch to the pending RFH now and go back to normal. |
2310 // (Note that we don't care about on{before}unload handlers if the current | 2218 // (Note that we don't care about on{before}unload handlers if the current |
2311 // RFH isn't live.) | 2219 // RFH isn't live.) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2351 | 2259 |
2352 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. | 2260 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. |
2353 | 2261 |
2354 // It's possible to swap out the current RFH and then decide to navigate in it | 2262 // It's possible to swap out the current RFH and then decide to navigate in it |
2355 // anyway (e.g., a cross-process navigation that redirects back to the | 2263 // anyway (e.g., a cross-process navigation that redirects back to the |
2356 // original site). In that case, we have a proxy for the current RFH but | 2264 // original site). In that case, we have a proxy for the current RFH but |
2357 // haven't deleted it yet. The new navigation will swap it back in, so we can | 2265 // haven't deleted it yet. The new navigation will swap it back in, so we can |
2358 // delete the proxy. | 2266 // delete the proxy. |
2359 proxy_hosts_->Remove(new_instance.get()->GetId()); | 2267 proxy_hosts_->Remove(new_instance.get()->GetId()); |
2360 | 2268 |
2361 if (ShouldReuseWebUI(current_entry, dest_url)) { | 2269 render_frame_host_->UpdatePendingWebUI(dest_url, bindings); |
2362 pending_web_ui_.reset(); | |
2363 pending_and_current_web_ui_ = web_ui_->AsWeakPtr(); | |
2364 } else { | |
2365 SetPendingWebUI(dest_url, bindings); | |
2366 // Make sure the new RenderViewHost has the right bindings. | |
2367 if (pending_web_ui() && | |
2368 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { | |
2369 render_frame_host_->render_view_host()->AllowBindings( | |
2370 pending_web_ui()->GetBindings()); | |
2371 } | |
2372 } | |
2373 | |
2374 if (pending_web_ui() && render_frame_host_->IsRenderFrameLive()) { | |
2375 pending_web_ui()->RenderViewReused(render_frame_host_->render_view_host(), | |
2376 frame_tree_node_->IsMainFrame()); | |
2377 } | |
2378 | 2270 |
2379 // The renderer can exit view source mode when any error or cancellation | 2271 // The renderer can exit view source mode when any error or cancellation |
2380 // happen. We must overwrite to recover the mode. | 2272 // happen. We must overwrite to recover the mode. |
2381 if (dest_is_view_source_mode) { | 2273 if (dest_is_view_source_mode) { |
2382 render_frame_host_->render_view_host()->Send( | 2274 render_frame_host_->render_view_host()->Send( |
2383 new ViewMsg_EnableViewSourceMode( | 2275 new ViewMsg_EnableViewSourceMode( |
2384 render_frame_host_->render_view_host()->GetRoutingID())); | 2276 render_frame_host_->render_view_host()->GetRoutingID())); |
2385 } | 2277 } |
2386 | 2278 |
2387 return render_frame_host_.get(); | 2279 return render_frame_host_.get(); |
2388 } | 2280 } |
2389 | 2281 |
2390 void RenderFrameHostManager::CancelPending() { | 2282 void RenderFrameHostManager::CancelPending() { |
2391 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", | 2283 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", |
2392 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 2284 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
2393 DiscardUnusedFrame(UnsetPendingRenderFrameHost()); | 2285 DiscardUnusedFrame(UnsetPendingRenderFrameHost()); |
2286 render_frame_host_->DiscardPendingWebUI(); | |
2394 } | 2287 } |
2395 | 2288 |
2396 scoped_ptr<RenderFrameHostImpl> | 2289 scoped_ptr<RenderFrameHostImpl> |
2397 RenderFrameHostManager::UnsetPendingRenderFrameHost() { | 2290 RenderFrameHostManager::UnsetPendingRenderFrameHost() { |
2398 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = | 2291 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = |
2399 pending_render_frame_host_.Pass(); | 2292 pending_render_frame_host_.Pass(); |
2400 | 2293 |
2401 RenderFrameDevToolsAgentHost::OnCancelPendingNavigation( | 2294 RenderFrameDevToolsAgentHost::OnCancelPendingNavigation( |
2402 pending_render_frame_host.get(), | 2295 pending_render_frame_host.get(), |
2403 render_frame_host_.get()); | 2296 render_frame_host_.get()); |
2404 | 2297 |
2405 // We no longer need to prevent the process from exiting. | 2298 // We no longer need to prevent the process from exiting. |
2406 pending_render_frame_host->GetProcess()->RemovePendingView(); | 2299 pending_render_frame_host->GetProcess()->RemovePendingView(); |
2407 | 2300 |
2408 pending_web_ui_.reset(); | |
2409 pending_and_current_web_ui_.reset(); | |
2410 | |
2411 return pending_render_frame_host.Pass(); | 2301 return pending_render_frame_host.Pass(); |
2412 } | 2302 } |
2413 | 2303 |
2414 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( | 2304 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( |
2415 scoped_ptr<RenderFrameHostImpl> render_frame_host) { | 2305 scoped_ptr<RenderFrameHostImpl> render_frame_host) { |
2416 // Swap the two. | 2306 // Swap the two. |
2417 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = | 2307 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
2418 render_frame_host_.Pass(); | 2308 render_frame_host_.Pass(); |
2419 render_frame_host_ = render_frame_host.Pass(); | 2309 render_frame_host_ = render_frame_host.Pass(); |
2420 | 2310 |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2575 if (rvh && !rvh->IsRenderViewLive()) { | 2465 if (rvh && !rvh->IsRenderViewLive()) { |
2576 EnsureRenderViewInitialized(rvh, instance); | 2466 EnsureRenderViewInitialized(rvh, instance); |
2577 } else { | 2467 } else { |
2578 // Create a swapped out RenderView in the given SiteInstance if none | 2468 // Create a swapped out RenderView in the given SiteInstance if none |
2579 // exists. Since an opener can point to a subframe, do this on the root | 2469 // exists. Since an opener can point to a subframe, do this on the root |
2580 // frame of the current opener's frame tree. | 2470 // frame of the current opener's frame tree. |
2581 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 2471 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { |
2582 frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance); | 2472 frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance); |
2583 } else { | 2473 } else { |
2584 frame_tree->root()->render_manager()->CreateRenderFrame( | 2474 frame_tree->root()->render_manager()->CreateRenderFrame( |
2585 instance, nullptr, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, | 2475 instance, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, nullptr); |
2586 nullptr); | |
2587 } | 2476 } |
2588 } | 2477 } |
2589 } | 2478 } |
2590 } | 2479 } |
2591 | 2480 |
2592 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { | 2481 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
2593 if (!frame_tree_node_->opener()) | 2482 if (!frame_tree_node_->opener()) |
2594 return MSG_ROUTING_NONE; | 2483 return MSG_ROUTING_NONE; |
2595 | 2484 |
2596 return frame_tree_node_->opener() | 2485 return frame_tree_node_->opener() |
2597 ->render_manager() | 2486 ->render_manager() |
2598 ->GetRoutingIdForSiteInstance(instance); | 2487 ->GetRoutingIdForSiteInstance(instance); |
2599 } | 2488 } |
2600 | 2489 |
2601 } // namespace content | 2490 } // namespace content |
OLD | NEW |