| 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 WebUI, 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 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1005 if (current_site_instance == dest_site_instance.get() || | 976 if (current_site_instance == dest_site_instance.get() || |
| 1006 (!request.browser_initiated() && is_main_frame) || | 977 (!request.browser_initiated() && is_main_frame) || |
| 1007 (!is_main_frame && !dest_site_instance->RequiresDedicatedProcess() && | 978 (!is_main_frame && !dest_site_instance->RequiresDedicatedProcess() && |
| 1008 !current_site_instance->RequiresDedicatedProcess())) { | 979 !current_site_instance->RequiresDedicatedProcess())) { |
| 1009 // Reuse the current RFH if its SiteInstance matches the the navigation's | 980 // Reuse the current RFH if its SiteInstance matches the the navigation's |
| 1010 // or if this is a subframe navigation. We only swap RFHs for subframes when | 981 // or if this is a subframe navigation. We only swap RFHs for subframes when |
| 1011 // --site-per-process is enabled. | 982 // --site-per-process is enabled. |
| 1012 CleanUpNavigation(); | 983 CleanUpNavigation(); |
| 1013 navigation_rfh = render_frame_host_.get(); | 984 navigation_rfh = render_frame_host_.get(); |
| 1014 | 985 |
| 1015 // As SiteInstances are the same, check if the WebUI should be reused. | 986 // As SiteInstances are the same, make the RFH update its possible pending |
| 1016 const NavigationEntry* current_navigation_entry = | 987 // WebUI. |
| 1017 delegate_->GetLastCommittedNavigationEntryForRenderManager(); | 988 render_frame_host_->UpdatePendingWebUI(request.common_params().url, |
| 1018 should_reuse_web_ui_ = ShouldReuseWebUI(current_navigation_entry, | 989 request.bindings()); |
| 1019 request.common_params().url); | 990 DCHECK(!speculative_render_frame_host_); |
| 1020 if (!should_reuse_web_ui_) { | 991 DCHECK(speculative_web_ui() == render_frame_host_->pending_web_ui()); |
| 1021 speculative_web_ui_ = CreateWebUI(request.common_params().url, | |
| 1022 request.bindings()); | |
| 1023 // Make sure the current RenderViewHost has the right bindings. | |
| 1024 if (speculative_web_ui() && | |
| 1025 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { | |
| 1026 render_frame_host_->render_view_host()->AllowBindings( | |
| 1027 speculative_web_ui()->GetBindings()); | |
| 1028 } | |
| 1029 } | |
| 1030 } else { | 992 } else { |
| 1031 // If the SiteInstance for the final URL doesn't match the one from the | 993 // If the SiteInstance for the final URL doesn't match the one from the |
| 1032 // speculatively created RenderFrameHost, create a new RenderFrameHost using | 994 // speculatively created RenderFrameHost, create a new RenderFrameHost using |
| 1033 // this new SiteInstance. | 995 // this new SiteInstance. |
| 1034 if (!speculative_render_frame_host_ || | 996 if (!speculative_render_frame_host_ || |
| 1035 speculative_render_frame_host_->GetSiteInstance() != | 997 speculative_render_frame_host_->GetSiteInstance() != |
| 1036 dest_site_instance.get()) { | 998 dest_site_instance.get()) { |
| 1037 CleanUpNavigation(); | 999 CleanUpNavigation(); |
| 1038 bool success = CreateSpeculativeRenderFrameHost( | 1000 bool success = CreateSpeculativeRenderFrameHost( |
| 1039 request.common_params().url, current_site_instance, | 1001 request.common_params().url, current_site_instance, |
| 1040 dest_site_instance.get(), request.bindings()); | 1002 dest_site_instance.get(), request.bindings()); |
| 1041 DCHECK(success); | 1003 DCHECK(success); |
| 1004 } else { |
| 1005 // When reusing an existing speculative RenderFrameHost its active WebUI |
| 1006 // must be updated to make sure it matches the current URL. As it is not a |
| 1007 // new RenderFrameHost instance it must be done by updating the pending |
| 1008 // WebUI and immediately making it active. |
| 1009 speculative_render_frame_host_->UpdatePendingWebUI( |
| 1010 request.common_params().url, request.bindings()); |
| 1011 speculative_render_frame_host_->CommitPendingWebUI(); |
| 1042 } | 1012 } |
| 1043 DCHECK(speculative_render_frame_host_); | 1013 DCHECK(speculative_render_frame_host_); |
| 1014 DCHECK_EQ(speculative_web_ui(), speculative_render_frame_host_->web_ui()); |
| 1015 |
| 1044 navigation_rfh = speculative_render_frame_host_.get(); | 1016 navigation_rfh = speculative_render_frame_host_.get(); |
| 1045 | 1017 |
| 1046 // Check if our current RFH is live. | 1018 // Check if our current RFH is live. |
| 1047 if (!render_frame_host_->IsRenderFrameLive()) { | 1019 if (!render_frame_host_->IsRenderFrameLive()) { |
| 1048 // The current RFH is not live. There's no reason to sit around with a | 1020 // The current RFH is not live. There's no reason to sit around with a |
| 1049 // sad tab or a newly created RFH while we wait for the navigation to | 1021 // sad tab or a newly created RFH while we wait for the navigation to |
| 1050 // complete. Just switch to the speculative RFH now and go back to normal. | 1022 // complete. Just switch to the speculative RFH now and go back to normal. |
| 1051 // (Note that we don't care about on{before}unload handlers if the current | 1023 // (Note that we don't care about on{before}unload handlers if the current |
| 1052 // RFH isn't live.) | 1024 // RFH isn't live.) |
| 1053 CommitPending(); | 1025 CommitPending(); |
| 1054 } | 1026 } |
| 1055 } | 1027 } |
| 1056 DCHECK(navigation_rfh && | 1028 DCHECK(navigation_rfh && |
| 1057 (navigation_rfh == render_frame_host_.get() || | 1029 (navigation_rfh == render_frame_host_.get() || |
| 1058 navigation_rfh == speculative_render_frame_host_.get())); | 1030 navigation_rfh == speculative_render_frame_host_.get())); |
| 1059 | 1031 |
| 1060 // If the RenderFrame that needs to navigate is not live (its process was just | 1032 // If the RenderFrame that needs to navigate is not live (its process was just |
| 1061 // created or has crashed), initialize it. | 1033 // created or has crashed), initialize it. |
| 1062 if (!navigation_rfh->IsRenderFrameLive()) { | 1034 if (!navigation_rfh->IsRenderFrameLive()) { |
| 1063 // Recreate the opener chain. | 1035 // Recreate the opener chain. |
| 1064 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); | 1036 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); |
| 1065 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) { | 1037 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE, |
| 1038 speculative_web_ui())) { |
| 1066 return nullptr; | 1039 return nullptr; |
| 1067 } | 1040 } |
| 1068 | 1041 |
| 1069 if (navigation_rfh == render_frame_host_) { | 1042 if (navigation_rfh == render_frame_host_) { |
| 1070 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 1043 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
| 1071 // manager still uses NotificationService and expects to see a | 1044 // manager still uses NotificationService and expects to see a |
| 1072 // RenderViewHost changed notification after WebContents and | 1045 // RenderViewHost changed notification after WebContents and |
| 1073 // RenderFrameHostManager are completely initialized. This should be | 1046 // RenderFrameHostManager are completely initialized. This should be |
| 1074 // removed once the process manager moves away from NotificationService. | 1047 // removed once the process manager moves away from NotificationService. |
| 1075 // See https://crbug.com/462682. | 1048 // See https://crbug.com/462682. |
| 1076 delegate_->NotifyMainFrameSwappedFromRenderManager( | 1049 delegate_->NotifyMainFrameSwappedFromRenderManager( |
| 1077 nullptr, render_frame_host_->render_view_host()); | 1050 nullptr, render_frame_host_->render_view_host()); |
| 1078 } | 1051 } |
| 1079 } | 1052 } |
| 1080 | 1053 |
| 1081 return navigation_rfh; | 1054 return navigation_rfh; |
| 1082 } | 1055 } |
| 1083 | 1056 |
| 1084 // PlzNavigate | 1057 // PlzNavigate |
| 1085 void RenderFrameHostManager::CleanUpNavigation() { | 1058 void RenderFrameHostManager::CleanUpNavigation() { |
| 1086 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1059 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1087 switches::kEnableBrowserSideNavigation)); | 1060 switches::kEnableBrowserSideNavigation)); |
| 1088 speculative_web_ui_.reset(); | 1061 render_frame_host_->DiscardPendingWebUI(); |
| 1089 should_reuse_web_ui_ = false; | |
| 1090 if (speculative_render_frame_host_) | 1062 if (speculative_render_frame_host_) |
| 1091 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); | 1063 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); |
| 1092 } | 1064 } |
| 1093 | 1065 |
| 1094 // PlzNavigate | 1066 // PlzNavigate |
| 1095 scoped_ptr<RenderFrameHostImpl> | 1067 scoped_ptr<RenderFrameHostImpl> |
| 1096 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { | 1068 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { |
| 1097 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1069 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1098 switches::kEnableBrowserSideNavigation)); | 1070 switches::kEnableBrowserSideNavigation)); |
| 1099 speculative_render_frame_host_->GetProcess()->RemovePendingView(); | 1071 speculative_render_frame_host_->GetProcess()->RemovePendingView(); |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1263 // We can't switch a RenderView between view source and non-view source mode | 1235 // We can't switch a RenderView between view source and non-view source mode |
| 1264 // without screwing up the session history sometimes (when navigating between | 1236 // without screwing up the session history sometimes (when navigating between |
| 1265 // "view-source:http://foo.com/" and "http://foo.com/", Blink doesn't treat | 1237 // "view-source:http://foo.com/" and "http://foo.com/", Blink doesn't treat |
| 1266 // it as a new navigation). So require a BrowsingInstance switch. | 1238 // it as a new navigation). So require a BrowsingInstance switch. |
| 1267 if (current_is_view_source_mode != new_is_view_source_mode) | 1239 if (current_is_view_source_mode != new_is_view_source_mode) |
| 1268 return true; | 1240 return true; |
| 1269 | 1241 |
| 1270 return false; | 1242 return false; |
| 1271 } | 1243 } |
| 1272 | 1244 |
| 1273 bool RenderFrameHostManager::ShouldReuseWebUI( | |
| 1274 const NavigationEntry* current_entry, | |
| 1275 const GURL& new_url) const { | |
| 1276 NavigationControllerImpl& controller = | |
| 1277 delegate_->GetControllerForRenderManager(); | |
| 1278 return current_entry && web_ui_ && | |
| 1279 (WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( | |
| 1280 controller.GetBrowserContext(), current_entry->GetURL()) == | |
| 1281 WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( | |
| 1282 controller.GetBrowserContext(), new_url)); | |
| 1283 } | |
| 1284 | |
| 1285 SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( | 1245 SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( |
| 1286 const GURL& dest_url, | 1246 const GURL& dest_url, |
| 1287 SiteInstance* source_instance, | 1247 SiteInstance* source_instance, |
| 1288 SiteInstance* dest_instance, | 1248 SiteInstance* dest_instance, |
| 1289 SiteInstance* candidate_instance, | 1249 SiteInstance* candidate_instance, |
| 1290 ui::PageTransition transition, | 1250 ui::PageTransition transition, |
| 1291 bool dest_is_restore, | 1251 bool dest_is_restore, |
| 1292 bool dest_is_view_source_mode) { | 1252 bool dest_is_view_source_mode) { |
| 1293 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); | 1253 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
| 1294 | 1254 |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1588 // to open a new tab to an interstitial-inducing URL, and then navigates | 1548 // to open a new tab to an interstitial-inducing URL, and then navigates |
| 1589 // the page to a different same-site URL. (This seems very unlikely in | 1549 // the page to a different same-site URL. (This seems very unlikely in |
| 1590 // practice.) | 1550 // practice.) |
| 1591 if (current_entry) | 1551 if (current_entry) |
| 1592 return current_entry->GetURL(); | 1552 return current_entry->GetURL(); |
| 1593 return current_instance->GetSiteURL(); | 1553 return current_instance->GetSiteURL(); |
| 1594 } | 1554 } |
| 1595 | 1555 |
| 1596 void RenderFrameHostManager::CreatePendingRenderFrameHost( | 1556 void RenderFrameHostManager::CreatePendingRenderFrameHost( |
| 1597 SiteInstance* old_instance, | 1557 SiteInstance* old_instance, |
| 1598 SiteInstance* new_instance) { | 1558 SiteInstance* new_instance, |
| 1559 const GURL& url, |
| 1560 int bindings) { |
| 1599 int create_render_frame_flags = 0; | 1561 int create_render_frame_flags = 0; |
| 1600 if (delegate_->IsHidden()) | 1562 if (delegate_->IsHidden()) |
| 1601 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1563 create_render_frame_flags |= CREATE_RF_HIDDEN; |
| 1602 | 1564 |
| 1603 if (pending_render_frame_host_) | 1565 if (pending_render_frame_host_) |
| 1604 CancelPending(); | 1566 CancelPending(); |
| 1605 | 1567 |
| 1606 // The process for the new SiteInstance may (if we're sharing a process with | 1568 // The process for the new SiteInstance may (if we're sharing a process with |
| 1607 // another host that already initialized it) or may not (we have our own | 1569 // another host that already initialized it) or may not (we have our own |
| 1608 // process or the existing process crashed) have been initialized. Calling | 1570 // process or the existing process crashed) have been initialized. Calling |
| 1609 // Init multiple times will be ignored, so this is safe. | 1571 // Init multiple times will be ignored, so this is safe. |
| 1610 if (!new_instance->GetProcess()->Init()) | 1572 if (!new_instance->GetProcess()->Init()) |
| 1611 return; | 1573 return; |
| 1612 | 1574 |
| 1613 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1575 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
| 1614 | 1576 |
| 1615 // Create a non-swapped-out RFH with the given opener. | 1577 // Create a non-swapped-out RFH with the given opener. |
| 1616 pending_render_frame_host_ = CreateRenderFrame( | 1578 pending_render_frame_host_ = CreateRenderFrameInternal( |
| 1617 new_instance, pending_web_ui(), create_render_frame_flags, nullptr); | 1579 new_instance, url, bindings, create_render_frame_flags, nullptr); |
| 1618 } | 1580 } |
| 1619 | 1581 |
| 1620 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( | 1582 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( |
| 1621 SiteInstance* old_instance, | 1583 SiteInstance* old_instance, |
| 1622 SiteInstance* new_instance) { | 1584 SiteInstance* new_instance) { |
| 1623 // Only create opener proxies if they are in the same BrowsingInstance. | 1585 // Only create opener proxies if they are in the same BrowsingInstance. |
| 1624 if (new_instance->IsRelatedSiteInstance(old_instance)) { | 1586 if (new_instance->IsRelatedSiteInstance(old_instance)) { |
| 1625 CreateOpenerProxies(new_instance, frame_tree_node_); | 1587 CreateOpenerProxies(new_instance, frame_tree_node_); |
| 1626 } else if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) { | 1588 } else if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) { |
| 1627 // Ensure that the frame tree has RenderFrameProxyHosts for the | 1589 // Ensure that the frame tree has RenderFrameProxyHosts for the |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1663 if (ancestor_rfh->GetSiteInstance() != current_instance) | 1625 if (ancestor_rfh->GetSiteInstance() != current_instance) |
| 1664 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); | 1626 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); |
| 1665 } | 1627 } |
| 1666 } | 1628 } |
| 1667 | 1629 |
| 1668 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 1630 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
| 1669 SiteInstance* site_instance, | 1631 SiteInstance* site_instance, |
| 1670 int32 view_routing_id, | 1632 int32 view_routing_id, |
| 1671 int32 frame_routing_id, | 1633 int32 frame_routing_id, |
| 1672 int32 widget_routing_id, | 1634 int32 widget_routing_id, |
| 1673 int flags) { | 1635 int flags, |
| 1636 const GURL& dest_url, |
| 1637 int entry_bindings) { |
| 1674 if (frame_routing_id == MSG_ROUTING_NONE) | 1638 if (frame_routing_id == MSG_ROUTING_NONE) |
| 1675 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1639 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
| 1676 | 1640 |
| 1677 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 1641 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
| 1678 bool hidden = !!(flags & CREATE_RF_HIDDEN); | 1642 bool hidden = !!(flags & CREATE_RF_HIDDEN); |
| 1679 | 1643 |
| 1680 // Create a RVH for main frames, or find the existing one for subframes. | 1644 // Create a RVH for main frames, or find the existing one for subframes. |
| 1681 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 1645 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
| 1682 RenderViewHostImpl* render_view_host = nullptr; | 1646 RenderViewHostImpl* render_view_host = nullptr; |
| 1683 if (frame_tree_node_->IsMainFrame()) { | 1647 if (frame_tree_node_->IsMainFrame()) { |
| 1684 render_view_host = frame_tree->CreateRenderViewHost( | 1648 render_view_host = frame_tree->CreateRenderViewHost( |
| 1685 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); | 1649 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); |
| 1686 } else { | 1650 } else { |
| 1687 render_view_host = frame_tree->GetRenderViewHost(site_instance); | 1651 render_view_host = frame_tree->GetRenderViewHost(site_instance); |
| 1688 CHECK(render_view_host); | 1652 CHECK(render_view_host); |
| 1689 } | 1653 } |
| 1690 | 1654 |
| 1691 return RenderFrameHostFactory::Create( | 1655 return RenderFrameHostFactory::Create( |
| 1692 site_instance, render_view_host, render_frame_delegate_, | 1656 site_instance, render_view_host, render_frame_delegate_, |
| 1693 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, | 1657 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, |
| 1694 widget_routing_id, flags); | 1658 widget_routing_id, flags, dest_url, entry_bindings); |
| 1695 } | 1659 } |
| 1696 | 1660 |
| 1697 // PlzNavigate | 1661 // PlzNavigate |
| 1698 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( | 1662 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
| 1699 const GURL& url, | 1663 const GURL& url, |
| 1700 SiteInstance* old_instance, | 1664 SiteInstance* old_instance, |
| 1701 SiteInstance* new_instance, | 1665 SiteInstance* new_instance, |
| 1702 int bindings) { | 1666 int bindings) { |
| 1703 CHECK(new_instance); | 1667 CHECK(new_instance); |
| 1704 CHECK_NE(old_instance, new_instance); | 1668 CHECK_NE(old_instance, new_instance); |
| 1705 CHECK(!should_reuse_web_ui_); | |
| 1706 | |
| 1707 // Note: |speculative_web_ui_| must be initialized before starting the | |
| 1708 // |speculative_render_frame_host_| creation steps otherwise the WebUI | |
| 1709 // won't be properly initialized. | |
| 1710 speculative_web_ui_ = CreateWebUI(url, bindings); | |
| 1711 | 1669 |
| 1712 // The process for the new SiteInstance may (if we're sharing a process with | 1670 // The process for the new SiteInstance may (if we're sharing a process with |
| 1713 // another host that already initialized it) or may not (we have our own | 1671 // another host that already initialized it) or may not (we have our own |
| 1714 // process or the existing process crashed) have been initialized. Calling | 1672 // process or the existing process crashed) have been initialized. Calling |
| 1715 // Init multiple times will be ignored, so this is safe. | 1673 // Init multiple times will be ignored, so this is safe. |
| 1716 if (!new_instance->GetProcess()->Init()) | 1674 if (!new_instance->GetProcess()->Init()) |
| 1717 return false; | 1675 return false; |
| 1718 | 1676 |
| 1719 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1677 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
| 1720 | 1678 |
| 1721 int create_render_frame_flags = 0; | 1679 int create_render_frame_flags = 0; |
| 1722 if (delegate_->IsHidden()) | 1680 if (delegate_->IsHidden()) |
| 1723 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1681 create_render_frame_flags |= CREATE_RF_HIDDEN; |
| 1724 speculative_render_frame_host_ = | 1682 speculative_render_frame_host_ = CreateRenderFrameInternal( |
| 1725 CreateRenderFrame(new_instance, speculative_web_ui_.get(), | 1683 new_instance, url, bindings, create_render_frame_flags, nullptr); |
| 1726 create_render_frame_flags, nullptr); | |
| 1727 | 1684 |
| 1728 if (!speculative_render_frame_host_) { | |
| 1729 speculative_web_ui_.reset(); | |
| 1730 return false; | |
| 1731 } | |
| 1732 return true; | 1685 return true; |
| 1733 } | 1686 } |
| 1734 | 1687 |
| 1735 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( | 1688 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
| 1736 SiteInstance* instance, | 1689 SiteInstance* instance, |
| 1737 WebUIImpl* web_ui, | |
| 1738 int flags, | 1690 int flags, |
| 1739 int* view_routing_id_ptr) { | 1691 int* view_routing_id_ptr) { |
| 1692 return CreateRenderFrameInternal(instance, GURL(), |
| 1693 NavigationEntryImpl::kInvalidBindings, flags, |
| 1694 view_routing_id_ptr); |
| 1695 } |
| 1696 |
| 1697 scoped_ptr<RenderFrameHostImpl> |
| 1698 RenderFrameHostManager::CreateRenderFrameInternal(SiteInstance* instance, |
| 1699 const GURL& url, |
| 1700 int bindings, |
| 1701 int flags, |
| 1702 int* view_routing_id_ptr) { |
| 1740 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 1703 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
| 1741 bool swapped_out_forbidden = | 1704 bool swapped_out_forbidden = |
| 1742 SiteIsolationPolicy::IsSwappedOutStateForbidden(); | 1705 SiteIsolationPolicy::IsSwappedOutStateForbidden(); |
| 1743 | 1706 |
| 1744 CHECK(instance); | 1707 CHECK(instance); |
| 1745 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out); | 1708 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out); |
| 1746 CHECK_IMPLIES(!SiteIsolationPolicy::AreCrossProcessFramesPossible(), | 1709 CHECK_IMPLIES(!SiteIsolationPolicy::AreCrossProcessFramesPossible(), |
| 1747 frame_tree_node_->IsMainFrame()); | 1710 frame_tree_node_->IsMainFrame()); |
| 1748 | 1711 |
| 1749 // Swapped out views should always be hidden. | 1712 // Swapped out views should always be hidden. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1764 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1727 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
| 1765 if (proxy && proxy->render_frame_host()) { | 1728 if (proxy && proxy->render_frame_host()) { |
| 1766 RenderViewHost* render_view_host = proxy->GetRenderViewHost(); | 1729 RenderViewHost* render_view_host = proxy->GetRenderViewHost(); |
| 1767 CHECK(!swapped_out_forbidden); | 1730 CHECK(!swapped_out_forbidden); |
| 1768 if (view_routing_id_ptr) | 1731 if (view_routing_id_ptr) |
| 1769 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); | 1732 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); |
| 1770 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. | 1733 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. |
| 1771 // Prevent the process from exiting while we're trying to use it. | 1734 // Prevent the process from exiting while we're trying to use it. |
| 1772 if (!swapped_out) { | 1735 if (!swapped_out) { |
| 1773 new_render_frame_host = proxy->PassFrameHostOwnership(); | 1736 new_render_frame_host = proxy->PassFrameHostOwnership(); |
| 1737 new_render_frame_host->UpdatePendingWebUI(url, bindings); |
| 1738 new_render_frame_host->CommitPendingWebUI(); |
| 1774 new_render_frame_host->GetProcess()->AddPendingView(); | 1739 new_render_frame_host->GetProcess()->AddPendingView(); |
| 1775 | 1740 |
| 1776 proxy_hosts_->Remove(instance->GetId()); | 1741 proxy_hosts_->Remove(instance->GetId()); |
| 1777 // NB |proxy| is deleted at this point. | 1742 // NB |proxy| is deleted at this point. |
| 1778 | 1743 |
| 1779 // If we are reusing the RenderViewHost and it doesn't already have a | 1744 // If we are reusing the RenderViewHost and it doesn't already have a |
| 1780 // RenderWidgetHostView, we need to create one if this is the main frame. | 1745 // RenderWidgetHostView, we need to create one if this is the main frame. |
| 1781 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) | 1746 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) |
| 1782 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | 1747 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); |
| 1783 } | 1748 } |
| 1784 } else { | 1749 } else { |
| 1785 // Create a new RenderFrameHost if we don't find an existing one. | 1750 // Create a new RenderFrameHost if we don't find an existing one. |
| 1786 | 1751 |
| 1787 int32 widget_routing_id = MSG_ROUTING_NONE; | 1752 int32 widget_routing_id = MSG_ROUTING_NONE; |
| 1788 // A RenderFrame in a different process from its parent RenderFrame | 1753 // A RenderFrame in a different process from its parent RenderFrame |
| 1789 // requires a RenderWidget for input/layout/painting. | 1754 // requires a RenderWidget for input/layout/painting. |
| 1790 if (frame_tree_node_->parent() && | 1755 if (frame_tree_node_->parent() && |
| 1791 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 1756 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
| 1792 instance) { | 1757 instance) { |
| 1793 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 1758 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); |
| 1794 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); | 1759 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); |
| 1795 } | 1760 } |
| 1796 | 1761 |
| 1797 new_render_frame_host = CreateRenderFrameHost( | 1762 new_render_frame_host = |
| 1798 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); | 1763 CreateRenderFrameHost(instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, |
| 1764 widget_routing_id, flags, url, bindings); |
| 1799 RenderViewHostImpl* render_view_host = | 1765 RenderViewHostImpl* render_view_host = |
| 1800 new_render_frame_host->render_view_host(); | 1766 new_render_frame_host->render_view_host(); |
| 1801 int proxy_routing_id = MSG_ROUTING_NONE; | 1767 int proxy_routing_id = MSG_ROUTING_NONE; |
| 1802 | 1768 |
| 1803 // Prevent the process from exiting while we're trying to navigate in it. | 1769 // Prevent the process from exiting while we're trying to navigate in it. |
| 1804 // Otherwise, if the new RFH is swapped out already, store it. | 1770 // Otherwise, if the new RFH is swapped out already, store it. |
| 1805 if (!swapped_out) { | 1771 if (!swapped_out) { |
| 1806 new_render_frame_host->GetProcess()->AddPendingView(); | 1772 new_render_frame_host->GetProcess()->AddPendingView(); |
| 1807 } else { | 1773 } else { |
| 1808 proxy = new RenderFrameProxyHost( | 1774 proxy = new RenderFrameProxyHost( |
| 1809 new_render_frame_host->GetSiteInstance(), | 1775 new_render_frame_host->GetSiteInstance(), |
| 1810 new_render_frame_host->render_view_host(), frame_tree_node_); | 1776 new_render_frame_host->render_view_host(), frame_tree_node_); |
| 1811 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); | 1777 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
| 1812 proxy_routing_id = proxy->GetRoutingID(); | 1778 proxy_routing_id = proxy->GetRoutingID(); |
| 1813 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1779 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
| 1814 } | 1780 } |
| 1815 | 1781 |
| 1816 if (frame_tree_node_->IsMainFrame()) { | 1782 if (frame_tree_node_->IsMainFrame()) { |
| 1817 success = InitRenderView(render_view_host, proxy_routing_id); | 1783 success = InitRenderView( |
| 1784 render_view_host, proxy_routing_id, |
| 1785 swapped_out ? nullptr : new_render_frame_host->web_ui()); |
| 1818 | 1786 |
| 1819 // If we are reusing the RenderViewHost and it doesn't already have a | 1787 // If we are reusing the RenderViewHost and it doesn't already have a |
| 1820 // RenderWidgetHostView, we need to create one if this is the main frame. | 1788 // RenderWidgetHostView, we need to create one if this is the main frame. |
| 1821 if (!swapped_out && !render_view_host->GetView()) | 1789 if (!swapped_out && !render_view_host->GetView()) |
| 1822 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | 1790 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); |
| 1823 } else { | 1791 } else { |
| 1824 DCHECK(render_view_host->IsRenderViewLive()); | 1792 DCHECK(render_view_host->IsRenderViewLive()); |
| 1825 } | 1793 } |
| 1826 | 1794 |
| 1827 if (success) { | 1795 if (success) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1846 success = InitRenderFrame(new_render_frame_host.get()); | 1814 success = InitRenderFrame(new_render_frame_host.get()); |
| 1847 } | 1815 } |
| 1848 } | 1816 } |
| 1849 | 1817 |
| 1850 if (success) { | 1818 if (success) { |
| 1851 if (view_routing_id_ptr) | 1819 if (view_routing_id_ptr) |
| 1852 *view_routing_id_ptr = render_view_host->GetRoutingID(); | 1820 *view_routing_id_ptr = render_view_host->GetRoutingID(); |
| 1853 } | 1821 } |
| 1854 } | 1822 } |
| 1855 | 1823 |
| 1856 // When a new RenderView is created by the renderer process, the new | |
| 1857 // WebContents gets a RenderViewHost in the SiteInstance of its opener | |
| 1858 // WebContents. If not used in the first navigation, this RVH is swapped out | |
| 1859 // and is not granted bindings, so we may need to grant them when swapping it | |
| 1860 // in. | |
| 1861 if (web_ui && !new_render_frame_host->GetProcess()->IsForGuestsOnly()) { | |
| 1862 int required_bindings = web_ui->GetBindings(); | |
| 1863 RenderViewHost* render_view_host = | |
| 1864 new_render_frame_host->render_view_host(); | |
| 1865 if ((render_view_host->GetEnabledBindings() & required_bindings) != | |
| 1866 required_bindings) { | |
| 1867 render_view_host->AllowBindings(required_bindings); | |
| 1868 } | |
| 1869 } | |
| 1870 | |
| 1871 // Returns the new RFH if it isn't swapped out. | 1824 // Returns the new RFH if it isn't swapped out. |
| 1872 if (success && !swapped_out) { | 1825 if (success && !swapped_out) { |
| 1873 DCHECK(new_render_frame_host->GetSiteInstance() == instance); | 1826 DCHECK(new_render_frame_host->GetSiteInstance() == instance); |
| 1874 return new_render_frame_host.Pass(); | 1827 return new_render_frame_host.Pass(); |
| 1875 } | 1828 } |
| 1876 return nullptr; | 1829 return nullptr; |
| 1877 } | 1830 } |
| 1878 | 1831 |
| 1879 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { | 1832 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { |
| 1880 // A RenderFrameProxyHost should never be created in the same SiteInstance as | 1833 // A RenderFrameProxyHost should never be created in the same SiteInstance as |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1901 return proxy->GetRoutingID(); | 1854 return proxy->GetRoutingID(); |
| 1902 | 1855 |
| 1903 if (!proxy) { | 1856 if (!proxy) { |
| 1904 proxy = | 1857 proxy = |
| 1905 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); | 1858 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); |
| 1906 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); | 1859 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
| 1907 } | 1860 } |
| 1908 | 1861 |
| 1909 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && | 1862 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && |
| 1910 frame_tree_node_->IsMainFrame()) { | 1863 frame_tree_node_->IsMainFrame()) { |
| 1911 InitRenderView(render_view_host, proxy->GetRoutingID()); | 1864 InitRenderView(render_view_host, proxy->GetRoutingID(), nullptr); |
| 1912 proxy->set_render_frame_proxy_created(true); | 1865 proxy->set_render_frame_proxy_created(true); |
| 1913 } else { | 1866 } else { |
| 1914 proxy->InitRenderFrameProxy(); | 1867 proxy->InitRenderFrameProxy(); |
| 1915 } | 1868 } |
| 1916 | 1869 |
| 1917 return proxy->GetRoutingID(); | 1870 return proxy->GetRoutingID(); |
| 1918 } | 1871 } |
| 1919 | 1872 |
| 1920 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { | 1873 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { |
| 1921 for (const auto& pair : *proxy_hosts_) { | 1874 for (const auto& pair : *proxy_hosts_) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1936 | 1889 |
| 1937 if (render_view_host->IsRenderViewLive()) | 1890 if (render_view_host->IsRenderViewLive()) |
| 1938 return; | 1891 return; |
| 1939 | 1892 |
| 1940 // If the proxy in |instance| doesn't exist, this RenderView is not swapped | 1893 // If the proxy in |instance| doesn't exist, this RenderView is not swapped |
| 1941 // out and shouldn't be reinitialized here. | 1894 // out and shouldn't be reinitialized here. |
| 1942 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1895 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
| 1943 if (!proxy) | 1896 if (!proxy) |
| 1944 return; | 1897 return; |
| 1945 | 1898 |
| 1946 InitRenderView(render_view_host, proxy->GetRoutingID()); | 1899 InitRenderView(render_view_host, proxy->GetRoutingID(), nullptr); |
| 1947 proxy->set_render_frame_proxy_created(true); | 1900 proxy->set_render_frame_proxy_created(true); |
| 1948 } | 1901 } |
| 1949 | 1902 |
| 1950 void RenderFrameHostManager::CreateOuterDelegateProxy( | 1903 void RenderFrameHostManager::CreateOuterDelegateProxy( |
| 1951 SiteInstance* outer_contents_site_instance, | 1904 SiteInstance* outer_contents_site_instance, |
| 1952 RenderFrameHostImpl* render_frame_host) { | 1905 RenderFrameHostImpl* render_frame_host) { |
| 1953 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); | 1906 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); |
| 1954 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 1907 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( |
| 1955 outer_contents_site_instance, nullptr, frame_tree_node_); | 1908 outer_contents_site_instance, nullptr, frame_tree_node_); |
| 1956 proxy_hosts_->Add(outer_contents_site_instance->GetId(), | 1909 proxy_hosts_->Add(outer_contents_site_instance->GetId(), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1971 } | 1924 } |
| 1972 | 1925 |
| 1973 void RenderFrameHostManager::SetRWHViewForInnerContents( | 1926 void RenderFrameHostManager::SetRWHViewForInnerContents( |
| 1974 RenderWidgetHostView* child_rwhv) { | 1927 RenderWidgetHostView* child_rwhv) { |
| 1975 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); | 1928 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); |
| 1976 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); | 1929 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); |
| 1977 } | 1930 } |
| 1978 | 1931 |
| 1979 bool RenderFrameHostManager::InitRenderView( | 1932 bool RenderFrameHostManager::InitRenderView( |
| 1980 RenderViewHostImpl* render_view_host, | 1933 RenderViewHostImpl* render_view_host, |
| 1981 int proxy_routing_id) { | 1934 int proxy_routing_id, |
| 1935 WebUIImpl* dest_web_ui) { |
| 1982 // Ensure the renderer process is initialized before creating the | 1936 // Ensure the renderer process is initialized before creating the |
| 1983 // RenderView. | 1937 // RenderView. |
| 1984 if (!render_view_host->GetProcess()->Init()) | 1938 if (!render_view_host->GetProcess()->Init()) |
| 1985 return false; | 1939 return false; |
| 1986 | 1940 |
| 1987 // We may have initialized this RenderViewHost for another RenderFrameHost. | 1941 // We may have initialized this RenderViewHost for another RenderFrameHost. |
| 1988 if (render_view_host->IsRenderViewLive()) | 1942 if (render_view_host->IsRenderViewLive()) |
| 1989 return true; | 1943 return true; |
| 1990 | 1944 |
| 1991 // If the ongoing navigation is to a WebUI and the RenderView is not in a | 1945 // If the ongoing navigation is not to a WebUI or the RenderView is in a |
| 1992 // guest process, tell the RenderViewHost about any bindings it will need | 1946 // guest process, ensure that we don't create an unprivileged RenderView in a |
| 1993 // enabled. | 1947 // WebUI-enabled process unless it's swapped out. |
| 1994 WebUIImpl* dest_web_ui = nullptr; | 1948 if ((!dest_web_ui || render_view_host->GetProcess()->IsForGuestsOnly()) && |
| 1995 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1949 render_view_host->is_active()) { |
| 1996 switches::kEnableBrowserSideNavigation)) { | 1950 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
| 1997 dest_web_ui = | 1951 render_view_host->GetProcess()->GetID())); |
| 1998 should_reuse_web_ui_ ? web_ui_.get() : speculative_web_ui_.get(); | |
| 1999 } else { | |
| 2000 dest_web_ui = pending_web_ui(); | |
| 2001 } | |
| 2002 if (dest_web_ui && !render_view_host->GetProcess()->IsForGuestsOnly()) { | |
| 2003 render_view_host->AllowBindings(dest_web_ui->GetBindings()); | |
| 2004 } else { | |
| 2005 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled | |
| 2006 // process unless it's swapped out. | |
| 2007 if (render_view_host->is_active()) { | |
| 2008 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | |
| 2009 render_view_host->GetProcess()->GetID())); | |
| 2010 } | |
| 2011 } | 1952 } |
| 2012 | 1953 |
| 2013 int opener_frame_routing_id = | 1954 int opener_frame_routing_id = |
| 2014 GetOpenerRoutingID(render_view_host->GetSiteInstance()); | 1955 GetOpenerRoutingID(render_view_host->GetSiteInstance()); |
| 2015 | 1956 |
| 2016 return delegate_->CreateRenderViewForRenderManager( | 1957 return delegate_->CreateRenderViewForRenderManager( |
| 2017 render_view_host, opener_frame_routing_id, proxy_routing_id, | 1958 render_view_host, opener_frame_routing_id, proxy_routing_id, |
| 2018 frame_tree_node_->current_replication_state()); | 1959 frame_tree_node_->current_replication_state()); |
| 2019 } | 1960 } |
| 2020 | 1961 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2088 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); | 2029 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); |
| 2089 if (proxy) | 2030 if (proxy) |
| 2090 return proxy->GetRoutingID(); | 2031 return proxy->GetRoutingID(); |
| 2091 | 2032 |
| 2092 return MSG_ROUTING_NONE; | 2033 return MSG_ROUTING_NONE; |
| 2093 } | 2034 } |
| 2094 | 2035 |
| 2095 void RenderFrameHostManager::CommitPending() { | 2036 void RenderFrameHostManager::CommitPending() { |
| 2096 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", | 2037 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", |
| 2097 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 2038 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
| 2098 bool browser_side_navigation = | |
| 2099 base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 2100 switches::kEnableBrowserSideNavigation); | |
| 2101 | |
| 2102 // First check whether we're going to want to focus the location bar after | 2039 // First check whether we're going to want to focus the location bar after |
| 2103 // this commit. We do this now because the navigation hasn't formally | 2040 // this commit. We do this now because the navigation hasn't formally |
| 2104 // committed yet, so if we've already cleared |pending_web_ui_| the call chain | 2041 // committed yet, so if we've already cleared the pending WebUI the call chain |
| 2105 // this triggers won't be able to figure out what's going on. | 2042 // this triggers won't be able to figure out what's going on. |
| 2106 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); | 2043 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); |
| 2107 | 2044 |
| 2108 // Next commit the Web UI, if any. Either replace |web_ui_| with | 2045 // If the current RenderFrameHost has a pending WebUI then just commit it and |
| 2109 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or | 2046 // return (there should be nothing else to commit). |
| 2110 // leave |web_ui_| as is if reusing it. | 2047 if (render_frame_host_->pending_web_ui()) { |
| 2111 DCHECK(!(pending_web_ui_ && pending_and_current_web_ui_)); | 2048 DCHECK(!pending_render_frame_host_ && !speculative_render_frame_host_); |
| 2112 if (pending_web_ui_ || speculative_web_ui_) { | 2049 render_frame_host_->CommitPendingWebUI(); |
| 2113 DCHECK(!should_reuse_web_ui_); | |
| 2114 web_ui_.reset(browser_side_navigation ? speculative_web_ui_.release() | |
| 2115 : pending_web_ui_.release()); | |
| 2116 } else if (pending_and_current_web_ui_ || should_reuse_web_ui_) { | |
| 2117 if (browser_side_navigation) { | |
| 2118 DCHECK(web_ui_); | |
| 2119 should_reuse_web_ui_ = false; | |
| 2120 } else { | |
| 2121 DCHECK_EQ(pending_and_current_web_ui_.get(), web_ui_.get()); | |
| 2122 pending_and_current_web_ui_.reset(); | |
| 2123 } | |
| 2124 } else { | |
| 2125 web_ui_.reset(); | |
| 2126 } | |
| 2127 DCHECK(!speculative_web_ui_); | |
| 2128 DCHECK(!should_reuse_web_ui_); | |
| 2129 | |
| 2130 // It's possible for the pending_render_frame_host_ to be nullptr when we | |
| 2131 // aren't crossing process boundaries. If so, we just needed to handle the Web | |
| 2132 // UI committing above and we're done. | |
| 2133 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { | |
| 2134 if (will_focus_location_bar) | 2050 if (will_focus_location_bar) |
| 2135 delegate_->SetFocusToLocationBar(false); | 2051 delegate_->SetFocusToLocationBar(false); |
| 2136 return; | 2052 return; |
| 2137 } | 2053 } |
| 2138 | 2054 |
| 2139 // Remember if the page was focused so we can focus the new renderer in | 2055 // Remember if the page was focused so we can focus the new renderer in |
| 2140 // that case. | 2056 // that case. |
| 2141 bool focus_render_view = !will_focus_location_bar && | 2057 bool focus_render_view = !will_focus_location_bar && |
| 2142 render_frame_host_->GetView() && | 2058 render_frame_host_->GetView() && |
| 2143 render_frame_host_->GetView()->HasFocus(); | 2059 render_frame_host_->GetView()->HasFocus(); |
| 2144 | 2060 |
| 2145 bool is_main_frame = frame_tree_node_->IsMainFrame(); | 2061 bool is_main_frame = frame_tree_node_->IsMainFrame(); |
| 2146 | 2062 |
| 2147 // Swap in the pending or speculative frame and make it active. Also ensure | 2063 // Swap in the pending or speculative frame and make it active. Also ensure |
| 2148 // the FrameTree stays in sync. | 2064 // the FrameTree stays in sync. |
| 2149 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; | 2065 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; |
| 2150 if (!browser_side_navigation) { | 2066 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 2067 switches::kEnableBrowserSideNavigation)) { |
| 2151 DCHECK(!speculative_render_frame_host_); | 2068 DCHECK(!speculative_render_frame_host_); |
| 2152 old_render_frame_host = | 2069 old_render_frame_host = |
| 2153 SetRenderFrameHost(pending_render_frame_host_.Pass()); | 2070 SetRenderFrameHost(pending_render_frame_host_.Pass()); |
| 2154 } else { | 2071 } else { |
| 2155 // PlzNavigate | 2072 // PlzNavigate |
| 2156 DCHECK(speculative_render_frame_host_); | 2073 DCHECK(speculative_render_frame_host_); |
| 2157 old_render_frame_host = | 2074 old_render_frame_host = |
| 2158 SetRenderFrameHost(speculative_render_frame_host_.Pass()); | 2075 SetRenderFrameHost(speculative_render_frame_host_.Pass()); |
| 2159 } | 2076 } |
| 2160 | 2077 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2302 // If we are currently navigating cross-process, we want to get back to normal | 2219 // If we are currently navigating cross-process, we want to get back to normal |
| 2303 // and then navigate as usual. | 2220 // and then navigate as usual. |
| 2304 if (pending_render_frame_host_) | 2221 if (pending_render_frame_host_) |
| 2305 CancelPending(); | 2222 CancelPending(); |
| 2306 | 2223 |
| 2307 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); | 2224 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
| 2308 scoped_refptr<SiteInstance> new_instance = GetSiteInstanceForNavigation( | 2225 scoped_refptr<SiteInstance> new_instance = GetSiteInstanceForNavigation( |
| 2309 dest_url, source_instance, dest_instance, nullptr, transition, | 2226 dest_url, source_instance, dest_instance, nullptr, transition, |
| 2310 dest_is_restore, dest_is_view_source_mode); | 2227 dest_is_restore, dest_is_view_source_mode); |
| 2311 | 2228 |
| 2312 const NavigationEntry* current_entry = | |
| 2313 delegate_->GetLastCommittedNavigationEntryForRenderManager(); | |
| 2314 | |
| 2315 DCHECK(!pending_render_frame_host_); | 2229 DCHECK(!pending_render_frame_host_); |
| 2316 | 2230 |
| 2317 if (new_instance.get() != current_instance) { | 2231 if (new_instance.get() != current_instance) { |
| 2318 TRACE_EVENT_INSTANT2( | 2232 TRACE_EVENT_INSTANT2( |
| 2319 "navigation", | 2233 "navigation", |
| 2320 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance", | 2234 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance", |
| 2321 TRACE_EVENT_SCOPE_THREAD, | 2235 TRACE_EVENT_SCOPE_THREAD, |
| 2322 "current_instance id", current_instance->GetId(), | 2236 "current_instance id", current_instance->GetId(), |
| 2323 "new_instance id", new_instance->GetId()); | 2237 "new_instance id", new_instance->GetId()); |
| 2324 | 2238 |
| 2325 // New SiteInstance: create a pending RFH to navigate. | 2239 // New SiteInstance: create a pending RFH to navigate. |
| 2326 | 2240 |
| 2327 // This will possibly create (set to nullptr) a Web UI object for the | 2241 CreatePendingRenderFrameHost(current_instance, new_instance.get(), dest_url, |
| 2328 // pending page. We'll use this later to give the page special access. This | 2242 bindings); |
| 2329 // must happen before the new renderer is created below so it will get | |
| 2330 // bindings. It must also happen after the above conditional call to | |
| 2331 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_ | |
| 2332 // and the page will not have its bindings set appropriately. | |
| 2333 SetPendingWebUI(dest_url, bindings); | |
| 2334 CreatePendingRenderFrameHost(current_instance, new_instance.get()); | |
| 2335 if (!pending_render_frame_host_) | 2243 if (!pending_render_frame_host_) |
| 2336 return nullptr; | 2244 return nullptr; |
| 2337 | 2245 |
| 2338 // Check if our current RFH is live before we set up a transition. | 2246 // Check if our current RFH is live before we set up a transition. |
| 2339 if (!render_frame_host_->IsRenderFrameLive()) { | 2247 if (!render_frame_host_->IsRenderFrameLive()) { |
| 2340 // The current RFH is not live. There's no reason to sit around with a | 2248 // The current RFH is not live. There's no reason to sit around with a |
| 2341 // sad tab or a newly created RFH while we wait for the pending RFH to | 2249 // sad tab or a newly created RFH while we wait for the pending RFH to |
| 2342 // navigate. Just switch to the pending RFH now and go back to normal. | 2250 // navigate. Just switch to the pending RFH now and go back to normal. |
| 2343 // (Note that we don't care about on{before}unload handlers if the current | 2251 // (Note that we don't care about on{before}unload handlers if the current |
| 2344 // RFH isn't live.) | 2252 // RFH isn't live.) |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2384 | 2292 |
| 2385 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. | 2293 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. |
| 2386 | 2294 |
| 2387 // It's possible to swap out the current RFH and then decide to navigate in it | 2295 // It's possible to swap out the current RFH and then decide to navigate in it |
| 2388 // anyway (e.g., a cross-process navigation that redirects back to the | 2296 // anyway (e.g., a cross-process navigation that redirects back to the |
| 2389 // original site). In that case, we have a proxy for the current RFH but | 2297 // original site). In that case, we have a proxy for the current RFH but |
| 2390 // haven't deleted it yet. The new navigation will swap it back in, so we can | 2298 // haven't deleted it yet. The new navigation will swap it back in, so we can |
| 2391 // delete the proxy. | 2299 // delete the proxy. |
| 2392 proxy_hosts_->Remove(new_instance.get()->GetId()); | 2300 proxy_hosts_->Remove(new_instance.get()->GetId()); |
| 2393 | 2301 |
| 2394 if (ShouldReuseWebUI(current_entry, dest_url)) { | 2302 render_frame_host_->UpdatePendingWebUI(dest_url, bindings); |
| 2395 pending_web_ui_.reset(); | |
| 2396 pending_and_current_web_ui_ = web_ui_->AsWeakPtr(); | |
| 2397 } else { | |
| 2398 SetPendingWebUI(dest_url, bindings); | |
| 2399 // Make sure the new RenderViewHost has the right bindings. | |
| 2400 if (pending_web_ui() && | |
| 2401 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { | |
| 2402 render_frame_host_->render_view_host()->AllowBindings( | |
| 2403 pending_web_ui()->GetBindings()); | |
| 2404 } | |
| 2405 } | |
| 2406 | |
| 2407 if (pending_web_ui() && render_frame_host_->IsRenderFrameLive()) { | |
| 2408 pending_web_ui()->RenderViewReused(render_frame_host_->render_view_host(), | |
| 2409 frame_tree_node_->IsMainFrame()); | |
| 2410 } | |
| 2411 | 2303 |
| 2412 // The renderer can exit view source mode when any error or cancellation | 2304 // The renderer can exit view source mode when any error or cancellation |
| 2413 // happen. We must overwrite to recover the mode. | 2305 // happen. We must overwrite to recover the mode. |
| 2414 if (dest_is_view_source_mode) { | 2306 if (dest_is_view_source_mode) { |
| 2415 render_frame_host_->render_view_host()->Send( | 2307 render_frame_host_->render_view_host()->Send( |
| 2416 new ViewMsg_EnableViewSourceMode( | 2308 new ViewMsg_EnableViewSourceMode( |
| 2417 render_frame_host_->render_view_host()->GetRoutingID())); | 2309 render_frame_host_->render_view_host()->GetRoutingID())); |
| 2418 } | 2310 } |
| 2419 | 2311 |
| 2420 return render_frame_host_.get(); | 2312 return render_frame_host_.get(); |
| 2421 } | 2313 } |
| 2422 | 2314 |
| 2423 void RenderFrameHostManager::CancelPending() { | 2315 void RenderFrameHostManager::CancelPending() { |
| 2424 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", | 2316 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", |
| 2425 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 2317 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
| 2426 DiscardUnusedFrame(UnsetPendingRenderFrameHost()); | 2318 DiscardUnusedFrame(UnsetPendingRenderFrameHost()); |
| 2319 render_frame_host_->DiscardPendingWebUI(); |
| 2427 } | 2320 } |
| 2428 | 2321 |
| 2429 scoped_ptr<RenderFrameHostImpl> | 2322 scoped_ptr<RenderFrameHostImpl> |
| 2430 RenderFrameHostManager::UnsetPendingRenderFrameHost() { | 2323 RenderFrameHostManager::UnsetPendingRenderFrameHost() { |
| 2431 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = | 2324 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = |
| 2432 pending_render_frame_host_.Pass(); | 2325 pending_render_frame_host_.Pass(); |
| 2433 | 2326 |
| 2434 RenderFrameDevToolsAgentHost::OnCancelPendingNavigation( | 2327 RenderFrameDevToolsAgentHost::OnCancelPendingNavigation( |
| 2435 pending_render_frame_host.get(), | 2328 pending_render_frame_host.get(), |
| 2436 render_frame_host_.get()); | 2329 render_frame_host_.get()); |
| 2437 | 2330 |
| 2438 // We no longer need to prevent the process from exiting. | 2331 // We no longer need to prevent the process from exiting. |
| 2439 pending_render_frame_host->GetProcess()->RemovePendingView(); | 2332 pending_render_frame_host->GetProcess()->RemovePendingView(); |
| 2440 | 2333 |
| 2441 pending_web_ui_.reset(); | |
| 2442 pending_and_current_web_ui_.reset(); | |
| 2443 | |
| 2444 return pending_render_frame_host.Pass(); | 2334 return pending_render_frame_host.Pass(); |
| 2445 } | 2335 } |
| 2446 | 2336 |
| 2447 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( | 2337 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( |
| 2448 scoped_ptr<RenderFrameHostImpl> render_frame_host) { | 2338 scoped_ptr<RenderFrameHostImpl> render_frame_host) { |
| 2449 // Swap the two. | 2339 // Swap the two. |
| 2450 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = | 2340 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
| 2451 render_frame_host_.Pass(); | 2341 render_frame_host_.Pass(); |
| 2452 render_frame_host_ = render_frame_host.Pass(); | 2342 render_frame_host_ = render_frame_host.Pass(); |
| 2453 | 2343 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2608 if (rvh && !rvh->IsRenderViewLive()) { | 2498 if (rvh && !rvh->IsRenderViewLive()) { |
| 2609 EnsureRenderViewInitialized(rvh, instance); | 2499 EnsureRenderViewInitialized(rvh, instance); |
| 2610 } else { | 2500 } else { |
| 2611 // Create a swapped out RenderView in the given SiteInstance if none | 2501 // Create a swapped out RenderView in the given SiteInstance if none |
| 2612 // exists. Since an opener can point to a subframe, do this on the root | 2502 // exists. Since an opener can point to a subframe, do this on the root |
| 2613 // frame of the current opener's frame tree. | 2503 // frame of the current opener's frame tree. |
| 2614 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 2504 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { |
| 2615 frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance); | 2505 frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance); |
| 2616 } else { | 2506 } else { |
| 2617 frame_tree->root()->render_manager()->CreateRenderFrame( | 2507 frame_tree->root()->render_manager()->CreateRenderFrame( |
| 2618 instance, nullptr, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, | 2508 instance, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, nullptr); |
| 2619 nullptr); | |
| 2620 } | 2509 } |
| 2621 } | 2510 } |
| 2622 } | 2511 } |
| 2623 } | 2512 } |
| 2624 | 2513 |
| 2625 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { | 2514 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
| 2626 if (!frame_tree_node_->opener()) | 2515 if (!frame_tree_node_->opener()) |
| 2627 return MSG_ROUTING_NONE; | 2516 return MSG_ROUTING_NONE; |
| 2628 | 2517 |
| 2629 return frame_tree_node_->opener() | 2518 return frame_tree_node_->opener() |
| 2630 ->render_manager() | 2519 ->render_manager() |
| 2631 ->GetRoutingIdForSiteInstance(instance); | 2520 ->GetRoutingIdForSiteInstance(instance); |
| 2632 } | 2521 } |
| 2633 | 2522 |
| 2634 } // namespace content | 2523 } // namespace content |
| OLD | NEW |