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

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

Issue 1352813006: Move WebUI ownership from the RenderFrameHostManager to the RenderFrameHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed ChromeOS errors caused by improper timing of RenderView(Created|Reused) calls. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/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
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
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
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 if (current_site_instance == dest_site_instance.get() || 989 if (current_site_instance == dest_site_instance.get() ||
1019 (!request.browser_initiated() && is_main_frame) || 990 (!request.browser_initiated() && is_main_frame) ||
1020 (!is_main_frame && !dest_site_instance->RequiresDedicatedProcess() && 991 (!is_main_frame && !dest_site_instance->RequiresDedicatedProcess() &&
1021 !current_site_instance->RequiresDedicatedProcess())) { 992 !current_site_instance->RequiresDedicatedProcess())) {
1022 // Reuse the current RFH if its SiteInstance matches the the navigation's 993 // Reuse the current RFH if its SiteInstance matches the the navigation's
1023 // or if this is a subframe navigation. We only swap RFHs for subframes when 994 // or if this is a subframe navigation. We only swap RFHs for subframes when
1024 // --site-per-process is enabled. 995 // --site-per-process is enabled.
1025 CleanUpNavigation(); 996 CleanUpNavigation();
1026 navigation_rfh = render_frame_host_.get(); 997 navigation_rfh = render_frame_host_.get();
1027 998
1028 // As SiteInstances are the same, check if the WebUI should be reused. 999 // As SiteInstances are the same, make the RFH update its possible pending
1029 const NavigationEntry* current_navigation_entry = 1000 // WebUI.
1030 delegate_->GetLastCommittedNavigationEntryForRenderManager(); 1001 render_frame_host_->UpdatePendingWebUI(request.common_params().url,
1031 should_reuse_web_ui_ = ShouldReuseWebUI(current_navigation_entry, 1002 request.bindings());
1032 request.common_params().url); 1003 DCHECK(speculative_web_ui() == render_frame_host_->pending_web_ui());
1033 if (!should_reuse_web_ui_) { 1004
1034 speculative_web_ui_ = CreateWebUI(request.common_params().url, 1005 // If a pending WebUI was set on the current RenderFrameHost (be it a new
1035 request.bindings()); 1006 // one or the reused current one) and the associated RenderFrame is alive,
1036 // Make sure the current RenderViewHost has the right bindings. 1007 // notify the WebUI the RenderView is being reused.
1037 if (speculative_web_ui() && 1008 if (pending_web_ui() && render_frame_host_->IsRenderFrameLive()) {
1038 !render_frame_host_->GetProcess()->IsForGuestsOnly()) { 1009 pending_web_ui()->RenderViewReused(render_frame_host_->render_view_host(),
1039 render_frame_host_->render_view_host()->AllowBindings( 1010 frame_tree_node_->IsMainFrame());
1040 speculative_web_ui()->GetBindings());
1041 }
1042 } 1011 }
1012
1013 DCHECK(!speculative_render_frame_host_);
1043 } else { 1014 } else {
1044 // If the SiteInstance for the final URL doesn't match the one from the 1015 // If the SiteInstance for the final URL doesn't match the one from the
1045 // speculatively created RenderFrameHost, create a new RenderFrameHost using 1016 // speculatively created RenderFrameHost, create a new RenderFrameHost using
1046 // this new SiteInstance. 1017 // this new SiteInstance.
1047 if (!speculative_render_frame_host_ || 1018 if (!speculative_render_frame_host_ ||
1048 speculative_render_frame_host_->GetSiteInstance() != 1019 speculative_render_frame_host_->GetSiteInstance() !=
1049 dest_site_instance.get()) { 1020 dest_site_instance.get()) {
1050 CleanUpNavigation(); 1021 CleanUpNavigation();
1051 bool success = CreateSpeculativeRenderFrameHost( 1022 bool success = CreateSpeculativeRenderFrameHost(
1052 request.common_params().url, current_site_instance, 1023 request.common_params().url, current_site_instance,
1053 dest_site_instance.get(), request.bindings()); 1024 dest_site_instance.get(), request.bindings());
1054 DCHECK(success); 1025 DCHECK(success);
1026 } else {
1027 // When reusing an existing speculative RenderFrameHost its active WebUI
1028 // must be updated to make sure it matches the current URL. As it is not a
1029 // new RenderFrameHost instance it must be done by updating the pending
1030 // WebUI and immediately making it active.
1031 speculative_render_frame_host_->UpdatePendingWebUI(
1032 request.common_params().url, request.bindings());
1033 speculative_render_frame_host_->CommitPendingWebUI();
1055 } 1034 }
1056 DCHECK(speculative_render_frame_host_); 1035 DCHECK(speculative_render_frame_host_);
1036 DCHECK_EQ(speculative_web_ui(), speculative_render_frame_host_->web_ui());
1037 DCHECK(!speculative_render_frame_host_->pending_web_ui());
1038 DCHECK(!render_frame_host_->pending_web_ui());
1039
1057 navigation_rfh = speculative_render_frame_host_.get(); 1040 navigation_rfh = speculative_render_frame_host_.get();
1058 1041
1059 // Check if our current RFH is live. 1042 // Check if our current RFH is live.
1060 if (!render_frame_host_->IsRenderFrameLive()) { 1043 if (!render_frame_host_->IsRenderFrameLive()) {
1061 // The current RFH is not live. There's no reason to sit around with a 1044 // The current RFH is not live. There's no reason to sit around with a
1062 // sad tab or a newly created RFH while we wait for the navigation to 1045 // sad tab or a newly created RFH while we wait for the navigation to
1063 // complete. Just switch to the speculative RFH now and go back to normal. 1046 // complete. Just switch to the speculative RFH now and go back to normal.
1064 // (Note that we don't care about on{before}unload handlers if the current 1047 // (Note that we don't care about on{before}unload handlers if the current
1065 // RFH isn't live.) 1048 // RFH isn't live.)
1066 CommitPending(); 1049 CommitPending();
1067 } 1050 }
1068 } 1051 }
1069 DCHECK(navigation_rfh && 1052 DCHECK(navigation_rfh &&
1070 (navigation_rfh == render_frame_host_.get() || 1053 (navigation_rfh == render_frame_host_.get() ||
1071 navigation_rfh == speculative_render_frame_host_.get())); 1054 navigation_rfh == speculative_render_frame_host_.get()));
1072 1055
1073 // If the RenderFrame that needs to navigate is not live (its process was just 1056 // If the RenderFrame that needs to navigate is not live (its process was just
1074 // created or has crashed), initialize it. 1057 // created or has crashed), initialize it.
1075 if (!navigation_rfh->IsRenderFrameLive()) { 1058 if (!navigation_rfh->IsRenderFrameLive()) {
1076 // Recreate the opener chain. 1059 // Recreate the opener chain.
1077 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); 1060 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_);
1078 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) { 1061 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE,
1062 speculative_web_ui())) {
1079 return nullptr; 1063 return nullptr;
1080 } 1064 }
1081 1065
1082 if (navigation_rfh == render_frame_host_) { 1066 if (navigation_rfh == render_frame_host_) {
1083 // TODO(nasko): This is a very ugly hack. The Chrome extensions process 1067 // TODO(nasko): This is a very ugly hack. The Chrome extensions process
1084 // manager still uses NotificationService and expects to see a 1068 // manager still uses NotificationService and expects to see a
1085 // RenderViewHost changed notification after WebContents and 1069 // RenderViewHost changed notification after WebContents and
1086 // RenderFrameHostManager are completely initialized. This should be 1070 // RenderFrameHostManager are completely initialized. This should be
1087 // removed once the process manager moves away from NotificationService. 1071 // removed once the process manager moves away from NotificationService.
1088 // See https://crbug.com/462682. 1072 // See https://crbug.com/462682.
1089 delegate_->NotifyMainFrameSwappedFromRenderManager( 1073 delegate_->NotifyMainFrameSwappedFromRenderManager(
1090 nullptr, render_frame_host_->render_view_host()); 1074 nullptr, render_frame_host_->render_view_host());
1091 } 1075 }
1092 } 1076 }
1093 1077
1094 return navigation_rfh; 1078 return navigation_rfh;
1095 } 1079 }
1096 1080
1097 // PlzNavigate 1081 // PlzNavigate
1098 void RenderFrameHostManager::CleanUpNavigation() { 1082 void RenderFrameHostManager::CleanUpNavigation() {
1099 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 1083 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
1100 switches::kEnableBrowserSideNavigation)); 1084 switches::kEnableBrowserSideNavigation));
1101 speculative_web_ui_.reset(); 1085 render_frame_host_->DiscardPendingWebUI();
1102 should_reuse_web_ui_ = false;
1103 if (speculative_render_frame_host_) 1086 if (speculative_render_frame_host_)
1104 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); 1087 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost());
1105 } 1088 }
1106 1089
1107 // PlzNavigate 1090 // PlzNavigate
1108 scoped_ptr<RenderFrameHostImpl> 1091 scoped_ptr<RenderFrameHostImpl>
1109 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { 1092 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() {
1110 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 1093 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
1111 switches::kEnableBrowserSideNavigation)); 1094 switches::kEnableBrowserSideNavigation));
1112 speculative_render_frame_host_->GetProcess()->RemovePendingView(); 1095 speculative_render_frame_host_->GetProcess()->RemovePendingView();
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 // We can't switch a RenderView between view source and non-view source mode 1259 // We can't switch a RenderView between view source and non-view source mode
1277 // without screwing up the session history sometimes (when navigating between 1260 // without screwing up the session history sometimes (when navigating between
1278 // "view-source:http://foo.com/" and "http://foo.com/", Blink doesn't treat 1261 // "view-source:http://foo.com/" and "http://foo.com/", Blink doesn't treat
1279 // it as a new navigation). So require a BrowsingInstance switch. 1262 // it as a new navigation). So require a BrowsingInstance switch.
1280 if (current_is_view_source_mode != new_is_view_source_mode) 1263 if (current_is_view_source_mode != new_is_view_source_mode)
1281 return true; 1264 return true;
1282 1265
1283 return false; 1266 return false;
1284 } 1267 }
1285 1268
1286 bool RenderFrameHostManager::ShouldReuseWebUI(
1287 const NavigationEntry* current_entry,
1288 const GURL& new_url) const {
1289 NavigationControllerImpl& controller =
1290 delegate_->GetControllerForRenderManager();
1291 return current_entry && web_ui_ &&
1292 (WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType(
1293 controller.GetBrowserContext(), current_entry->GetURL()) ==
1294 WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType(
1295 controller.GetBrowserContext(), new_url));
1296 }
1297
1298 SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation( 1269 SiteInstance* RenderFrameHostManager::GetSiteInstanceForNavigation(
1299 const GURL& dest_url, 1270 const GURL& dest_url,
1300 SiteInstance* source_instance, 1271 SiteInstance* source_instance,
1301 SiteInstance* dest_instance, 1272 SiteInstance* dest_instance,
1302 SiteInstance* candidate_instance, 1273 SiteInstance* candidate_instance,
1303 ui::PageTransition transition, 1274 ui::PageTransition transition,
1304 bool dest_is_restore, 1275 bool dest_is_restore,
1305 bool dest_is_view_source_mode) { 1276 bool dest_is_view_source_mode) {
1306 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); 1277 SiteInstance* current_instance = render_frame_host_->GetSiteInstance();
1307 1278
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1601 // to open a new tab to an interstitial-inducing URL, and then navigates 1572 // to open a new tab to an interstitial-inducing URL, and then navigates
1602 // the page to a different same-site URL. (This seems very unlikely in 1573 // the page to a different same-site URL. (This seems very unlikely in
1603 // practice.) 1574 // practice.)
1604 if (current_entry) 1575 if (current_entry)
1605 return current_entry->GetURL(); 1576 return current_entry->GetURL();
1606 return current_instance->GetSiteURL(); 1577 return current_instance->GetSiteURL();
1607 } 1578 }
1608 1579
1609 void RenderFrameHostManager::CreatePendingRenderFrameHost( 1580 void RenderFrameHostManager::CreatePendingRenderFrameHost(
1610 SiteInstance* old_instance, 1581 SiteInstance* old_instance,
1611 SiteInstance* new_instance) { 1582 SiteInstance* new_instance,
1583 const GURL& url,
1584 int bindings) {
1612 int create_render_frame_flags = 0; 1585 int create_render_frame_flags = 0;
1613 if (delegate_->IsHidden()) 1586 if (delegate_->IsHidden())
1614 create_render_frame_flags |= CREATE_RF_HIDDEN; 1587 create_render_frame_flags |= CREATE_RF_HIDDEN;
1615 1588
1616 if (pending_render_frame_host_) 1589 if (pending_render_frame_host_)
1617 CancelPending(); 1590 CancelPending();
1618 1591
1619 // The process for the new SiteInstance may (if we're sharing a process with 1592 // The process for the new SiteInstance may (if we're sharing a process with
1620 // another host that already initialized it) or may not (we have our own 1593 // another host that already initialized it) or may not (we have our own
1621 // process or the existing process crashed) have been initialized. Calling 1594 // process or the existing process crashed) have been initialized. Calling
1622 // Init multiple times will be ignored, so this is safe. 1595 // Init multiple times will be ignored, so this is safe.
1623 if (!new_instance->GetProcess()->Init()) 1596 if (!new_instance->GetProcess()->Init())
1624 return; 1597 return;
1625 1598
1626 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); 1599 CreateProxiesForNewRenderFrameHost(old_instance, new_instance);
1627 1600
1628 // Create a non-swapped-out RFH with the given opener. 1601 // Create a non-swapped-out RFH with the given opener.
1629 pending_render_frame_host_ = CreateRenderFrame( 1602 pending_render_frame_host_ = CreateRenderFrameInternal(
1630 new_instance, pending_web_ui(), create_render_frame_flags, nullptr); 1603 new_instance, url, bindings, create_render_frame_flags, nullptr);
1631 } 1604 }
1632 1605
1633 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( 1606 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost(
1634 SiteInstance* old_instance, 1607 SiteInstance* old_instance,
1635 SiteInstance* new_instance) { 1608 SiteInstance* new_instance) {
1636 // Only create opener proxies if they are in the same BrowsingInstance. 1609 // Only create opener proxies if they are in the same BrowsingInstance.
1637 if (new_instance->IsRelatedSiteInstance(old_instance)) { 1610 if (new_instance->IsRelatedSiteInstance(old_instance)) {
1638 CreateOpenerProxies(new_instance, frame_tree_node_); 1611 CreateOpenerProxies(new_instance, frame_tree_node_);
1639 } else if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) { 1612 } else if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
1640 // Ensure that the frame tree has RenderFrameProxyHosts for the 1613 // Ensure that the frame tree has RenderFrameProxyHosts for the
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1708 } 1681 }
1709 1682
1710 // PlzNavigate 1683 // PlzNavigate
1711 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( 1684 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost(
1712 const GURL& url, 1685 const GURL& url,
1713 SiteInstance* old_instance, 1686 SiteInstance* old_instance,
1714 SiteInstance* new_instance, 1687 SiteInstance* new_instance,
1715 int bindings) { 1688 int bindings) {
1716 CHECK(new_instance); 1689 CHECK(new_instance);
1717 CHECK_NE(old_instance, new_instance); 1690 CHECK_NE(old_instance, new_instance);
1718 CHECK(!should_reuse_web_ui_);
1719
1720 // Note: |speculative_web_ui_| must be initialized before starting the
1721 // |speculative_render_frame_host_| creation steps otherwise the WebUI
1722 // won't be properly initialized.
1723 speculative_web_ui_ = CreateWebUI(url, bindings);
1724 1691
1725 // The process for the new SiteInstance may (if we're sharing a process with 1692 // The process for the new SiteInstance may (if we're sharing a process with
1726 // another host that already initialized it) or may not (we have our own 1693 // another host that already initialized it) or may not (we have our own
1727 // process or the existing process crashed) have been initialized. Calling 1694 // process or the existing process crashed) have been initialized. Calling
1728 // Init multiple times will be ignored, so this is safe. 1695 // Init multiple times will be ignored, so this is safe.
1729 if (!new_instance->GetProcess()->Init()) 1696 if (!new_instance->GetProcess()->Init())
1730 return false; 1697 return false;
1731 1698
1732 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); 1699 CreateProxiesForNewRenderFrameHost(old_instance, new_instance);
1733 1700
1734 int create_render_frame_flags = 0; 1701 int create_render_frame_flags = 0;
1735 if (delegate_->IsHidden()) 1702 if (delegate_->IsHidden())
1736 create_render_frame_flags |= CREATE_RF_HIDDEN; 1703 create_render_frame_flags |= CREATE_RF_HIDDEN;
1737 speculative_render_frame_host_ = 1704 speculative_render_frame_host_ = CreateRenderFrameInternal(
1738 CreateRenderFrame(new_instance, speculative_web_ui_.get(), 1705 new_instance, url, bindings, create_render_frame_flags, nullptr);
nasko 2015/10/14 23:54:15 Why can't this be CreateRenderFrame, then call to
carlosk 2015/10/15 16:34:07 See below.
1739 create_render_frame_flags, nullptr);
1740 1706
1741 if (!speculative_render_frame_host_) {
1742 speculative_web_ui_.reset();
1743 return false;
1744 }
1745 return true; 1707 return true;
1746 } 1708 }
1747 1709
1748 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( 1710 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame(
1749 SiteInstance* instance, 1711 SiteInstance* instance,
1750 WebUIImpl* web_ui,
1751 int flags, 1712 int flags,
1752 int* view_routing_id_ptr) { 1713 int* view_routing_id_ptr) {
1714 return CreateRenderFrameInternal(instance, GURL(),
1715 NavigationEntryImpl::kInvalidBindings, flags,
1716 view_routing_id_ptr);
1717 }
1718
1719 scoped_ptr<RenderFrameHostImpl>
1720 RenderFrameHostManager::CreateRenderFrameInternal(SiteInstance* instance,
1721 const GURL& url,
1722 int bindings,
1723 int flags,
1724 int* view_routing_id_ptr) {
1753 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); 1725 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
1754 bool swapped_out_forbidden = 1726 bool swapped_out_forbidden =
1755 SiteIsolationPolicy::IsSwappedOutStateForbidden(); 1727 SiteIsolationPolicy::IsSwappedOutStateForbidden();
1756 1728
1757 CHECK(instance); 1729 CHECK(instance);
1758 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out); 1730 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out);
1759 CHECK_IMPLIES(!SiteIsolationPolicy::AreCrossProcessFramesPossible(), 1731 CHECK_IMPLIES(!SiteIsolationPolicy::AreCrossProcessFramesPossible(),
1760 frame_tree_node_->IsMainFrame()); 1732 frame_tree_node_->IsMainFrame());
1761 1733
1762 // Swapped out views should always be hidden. 1734 // Swapped out views should always be hidden.
(...skipping 14 matching lines...) Expand all
1777 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1749 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1778 if (proxy && proxy->render_frame_host()) { 1750 if (proxy && proxy->render_frame_host()) {
1779 RenderViewHost* render_view_host = proxy->GetRenderViewHost(); 1751 RenderViewHost* render_view_host = proxy->GetRenderViewHost();
1780 CHECK(!swapped_out_forbidden); 1752 CHECK(!swapped_out_forbidden);
1781 if (view_routing_id_ptr) 1753 if (view_routing_id_ptr)
1782 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); 1754 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID();
1783 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. 1755 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost.
1784 // Prevent the process from exiting while we're trying to use it. 1756 // Prevent the process from exiting while we're trying to use it.
1785 if (!swapped_out) { 1757 if (!swapped_out) {
1786 new_render_frame_host = proxy->PassFrameHostOwnership(); 1758 new_render_frame_host = proxy->PassFrameHostOwnership();
1759 new_render_frame_host->UpdatePendingWebUI(url, bindings);
1760 new_render_frame_host->CommitPendingWebUI();
nasko 2015/10/14 23:54:14 This is only done in case of reusing existing RFH.
carlosk 2015/10/15 16:34:08 See below #2.
1787 new_render_frame_host->GetProcess()->AddPendingView(); 1761 new_render_frame_host->GetProcess()->AddPendingView();
1788 1762
1789 proxy_hosts_->Remove(instance->GetId()); 1763 proxy_hosts_->Remove(instance->GetId());
1790 // NB |proxy| is deleted at this point. 1764 // NB |proxy| is deleted at this point.
1791 1765
1792 // If we are reusing the RenderViewHost and it doesn't already have a 1766 // If we are reusing the RenderViewHost and it doesn't already have a
1793 // RenderWidgetHostView, we need to create one if this is the main frame. 1767 // RenderWidgetHostView, we need to create one if this is the main frame.
1794 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) 1768 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame())
1795 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); 1769 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host);
1796 } 1770 }
1797 } else { 1771 } else {
1798 // Create a new RenderFrameHost if we don't find an existing one. 1772 // Create a new RenderFrameHost if we don't find an existing one.
1799 1773
1800 int32 widget_routing_id = MSG_ROUTING_NONE; 1774 int32 widget_routing_id = MSG_ROUTING_NONE;
1801 // A RenderFrame in a different process from its parent RenderFrame 1775 // A RenderFrame in a different process from its parent RenderFrame
1802 // requires a RenderWidget for input/layout/painting. 1776 // requires a RenderWidget for input/layout/painting.
1803 if (frame_tree_node_->parent() && 1777 if (frame_tree_node_->parent() &&
1804 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != 1778 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() !=
1805 instance) { 1779 instance) {
1806 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); 1780 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible());
1807 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); 1781 widget_routing_id = instance->GetProcess()->GetNextRoutingID();
1808 } 1782 }
1809 1783
1810 new_render_frame_host = CreateRenderFrameHost( 1784 new_render_frame_host = CreateRenderFrameHost(
1811 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); 1785 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags);
1786 new_render_frame_host->InitializeWebUI(url, bindings);
nasko 2015/10/14 23:54:15 This is done only on new RFHs. Combined with the c
carlosk 2015/10/15 16:34:07 The problem with initializing the WebUI outside of
1812 RenderViewHostImpl* render_view_host = 1787 RenderViewHostImpl* render_view_host =
1813 new_render_frame_host->render_view_host(); 1788 new_render_frame_host->render_view_host();
1814 int proxy_routing_id = MSG_ROUTING_NONE; 1789 int proxy_routing_id = MSG_ROUTING_NONE;
1815 1790
1816 // Prevent the process from exiting while we're trying to navigate in it. 1791 // Prevent the process from exiting while we're trying to navigate in it.
1817 // Otherwise, if the new RFH is swapped out already, store it. 1792 // Otherwise, if the new RFH is swapped out already, store it.
1818 if (!swapped_out) { 1793 if (!swapped_out) {
1819 new_render_frame_host->GetProcess()->AddPendingView(); 1794 new_render_frame_host->GetProcess()->AddPendingView();
1820 } else { 1795 } else {
1821 proxy = new RenderFrameProxyHost( 1796 proxy = new RenderFrameProxyHost(
1822 new_render_frame_host->GetSiteInstance(), 1797 new_render_frame_host->GetSiteInstance(),
1823 new_render_frame_host->render_view_host(), frame_tree_node_); 1798 new_render_frame_host->render_view_host(), frame_tree_node_);
1824 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); 1799 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy));
1825 proxy_routing_id = proxy->GetRoutingID(); 1800 proxy_routing_id = proxy->GetRoutingID();
1826 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); 1801 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
1827 } 1802 }
1828 1803
1829 if (frame_tree_node_->IsMainFrame()) { 1804 if (frame_tree_node_->IsMainFrame()) {
1830 success = InitRenderView(render_view_host, proxy_routing_id); 1805 success = InitRenderView(
1806 render_view_host, proxy_routing_id,
1807 swapped_out ? nullptr : new_render_frame_host->web_ui());
1831 1808
1832 // If we are reusing the RenderViewHost and it doesn't already have a 1809 // If we are reusing the RenderViewHost and it doesn't already have a
1833 // RenderWidgetHostView, we need to create one if this is the main frame. 1810 // RenderWidgetHostView, we need to create one if this is the main frame.
1834 if (!swapped_out && !render_view_host->GetView()) 1811 if (!swapped_out && !render_view_host->GetView())
1835 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); 1812 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host);
1836 } else { 1813 } else {
1837 DCHECK(render_view_host->IsRenderViewLive()); 1814 DCHECK(render_view_host->IsRenderViewLive());
1838 } 1815 }
1839 1816
1840 if (success) { 1817 if (success) {
(...skipping 18 matching lines...) Expand all
1859 success = InitRenderFrame(new_render_frame_host.get()); 1836 success = InitRenderFrame(new_render_frame_host.get());
1860 } 1837 }
1861 } 1838 }
1862 1839
1863 if (success) { 1840 if (success) {
1864 if (view_routing_id_ptr) 1841 if (view_routing_id_ptr)
1865 *view_routing_id_ptr = render_view_host->GetRoutingID(); 1842 *view_routing_id_ptr = render_view_host->GetRoutingID();
1866 } 1843 }
1867 } 1844 }
1868 1845
1869 // When a new RenderView is created by the renderer process, the new
1870 // WebContents gets a RenderViewHost in the SiteInstance of its opener
1871 // WebContents. If not used in the first navigation, this RVH is swapped out
1872 // and is not granted bindings, so we may need to grant them when swapping it
1873 // in.
1874 if (web_ui && !new_render_frame_host->GetProcess()->IsForGuestsOnly()) {
1875 int required_bindings = web_ui->GetBindings();
1876 RenderViewHost* render_view_host =
1877 new_render_frame_host->render_view_host();
1878 if ((render_view_host->GetEnabledBindings() & required_bindings) !=
1879 required_bindings) {
1880 render_view_host->AllowBindings(required_bindings);
1881 }
1882 }
1883
1884 // Returns the new RFH if it isn't swapped out. 1846 // Returns the new RFH if it isn't swapped out.
1885 if (success && !swapped_out) { 1847 if (success && !swapped_out) {
1886 DCHECK(new_render_frame_host->GetSiteInstance() == instance); 1848 DCHECK(new_render_frame_host->GetSiteInstance() == instance);
1887 return new_render_frame_host.Pass(); 1849 return new_render_frame_host.Pass();
1888 } 1850 }
1889 return nullptr; 1851 return nullptr;
1890 } 1852 }
1891 1853
1892 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { 1854 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) {
1893 // A RenderFrameProxyHost should never be created in the same SiteInstance as 1855 // A RenderFrameProxyHost should never be created in the same SiteInstance as
(...skipping 20 matching lines...) Expand all
1914 return proxy->GetRoutingID(); 1876 return proxy->GetRoutingID();
1915 1877
1916 if (!proxy) { 1878 if (!proxy) {
1917 proxy = 1879 proxy =
1918 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); 1880 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_);
1919 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); 1881 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy));
1920 } 1882 }
1921 1883
1922 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && 1884 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() &&
1923 frame_tree_node_->IsMainFrame()) { 1885 frame_tree_node_->IsMainFrame()) {
1924 InitRenderView(render_view_host, proxy->GetRoutingID()); 1886 InitRenderView(render_view_host, proxy->GetRoutingID(), nullptr);
1925 proxy->set_render_frame_proxy_created(true); 1887 proxy->set_render_frame_proxy_created(true);
1926 } else { 1888 } else {
1927 proxy->InitRenderFrameProxy(); 1889 proxy->InitRenderFrameProxy();
1928 } 1890 }
1929 1891
1930 return proxy->GetRoutingID(); 1892 return proxy->GetRoutingID();
1931 } 1893 }
1932 1894
1933 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { 1895 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) {
1934 for (const auto& pair : *proxy_hosts_) { 1896 for (const auto& pair : *proxy_hosts_) {
(...skipping 14 matching lines...) Expand all
1949 1911
1950 if (render_view_host->IsRenderViewLive()) 1912 if (render_view_host->IsRenderViewLive())
1951 return; 1913 return;
1952 1914
1953 // If the proxy in |instance| doesn't exist, this RenderView is not swapped 1915 // If the proxy in |instance| doesn't exist, this RenderView is not swapped
1954 // out and shouldn't be reinitialized here. 1916 // out and shouldn't be reinitialized here.
1955 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1917 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1956 if (!proxy) 1918 if (!proxy)
1957 return; 1919 return;
1958 1920
1959 InitRenderView(render_view_host, proxy->GetRoutingID()); 1921 InitRenderView(render_view_host, proxy->GetRoutingID(), nullptr);
1960 proxy->set_render_frame_proxy_created(true); 1922 proxy->set_render_frame_proxy_created(true);
1961 } 1923 }
1962 1924
1963 void RenderFrameHostManager::CreateOuterDelegateProxy( 1925 void RenderFrameHostManager::CreateOuterDelegateProxy(
1964 SiteInstance* outer_contents_site_instance, 1926 SiteInstance* outer_contents_site_instance,
1965 RenderFrameHostImpl* render_frame_host) { 1927 RenderFrameHostImpl* render_frame_host) {
1966 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); 1928 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests());
1967 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( 1929 RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
1968 outer_contents_site_instance, nullptr, frame_tree_node_); 1930 outer_contents_site_instance, nullptr, frame_tree_node_);
1969 proxy_hosts_->Add(outer_contents_site_instance->GetId(), 1931 proxy_hosts_->Add(outer_contents_site_instance->GetId(),
(...skipping 14 matching lines...) Expand all
1984 } 1946 }
1985 1947
1986 void RenderFrameHostManager::SetRWHViewForInnerContents( 1948 void RenderFrameHostManager::SetRWHViewForInnerContents(
1987 RenderWidgetHostView* child_rwhv) { 1949 RenderWidgetHostView* child_rwhv) {
1988 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); 1950 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame());
1989 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); 1951 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv);
1990 } 1952 }
1991 1953
1992 bool RenderFrameHostManager::InitRenderView( 1954 bool RenderFrameHostManager::InitRenderView(
1993 RenderViewHostImpl* render_view_host, 1955 RenderViewHostImpl* render_view_host,
1994 int proxy_routing_id) { 1956 int proxy_routing_id,
1957 WebUIImpl* dest_web_ui) {
1995 // Ensure the renderer process is initialized before creating the 1958 // Ensure the renderer process is initialized before creating the
1996 // RenderView. 1959 // RenderView.
1997 if (!render_view_host->GetProcess()->Init()) 1960 if (!render_view_host->GetProcess()->Init())
1998 return false; 1961 return false;
1999 1962
2000 // We may have initialized this RenderViewHost for another RenderFrameHost. 1963 // We may have initialized this RenderViewHost for another RenderFrameHost.
2001 if (render_view_host->IsRenderViewLive()) 1964 if (render_view_host->IsRenderViewLive())
2002 return true; 1965 return true;
2003 1966
2004 // If the ongoing navigation is to a WebUI and the RenderView is not in a 1967 // If the ongoing navigation is not to a WebUI or the RenderView is in a
2005 // guest process, tell the RenderViewHost about any bindings it will need 1968 // guest process, ensure that we don't create an unprivileged RenderView in a
2006 // enabled. 1969 // WebUI-enabled process unless it's swapped out.
2007 WebUIImpl* dest_web_ui = nullptr; 1970 if ((!dest_web_ui || render_view_host->GetProcess()->IsForGuestsOnly()) &&
2008 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1971 render_view_host->is_active()) {
2009 switches::kEnableBrowserSideNavigation)) { 1972 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
2010 dest_web_ui = 1973 render_view_host->GetProcess()->GetID()));
2011 should_reuse_web_ui_ ? web_ui_.get() : speculative_web_ui_.get();
2012 } else {
2013 dest_web_ui = pending_web_ui();
2014 }
2015 if (dest_web_ui && !render_view_host->GetProcess()->IsForGuestsOnly()) {
2016 render_view_host->AllowBindings(dest_web_ui->GetBindings());
2017 } else {
2018 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled
2019 // process unless it's swapped out.
2020 if (render_view_host->is_active()) {
2021 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
2022 render_view_host->GetProcess()->GetID()));
2023 }
2024 } 1974 }
2025 1975
2026 int opener_frame_routing_id = 1976 int opener_frame_routing_id =
2027 GetOpenerRoutingID(render_view_host->GetSiteInstance()); 1977 GetOpenerRoutingID(render_view_host->GetSiteInstance());
2028 1978
2029 return delegate_->CreateRenderViewForRenderManager( 1979 if (delegate_->CreateRenderViewForRenderManager(
2030 render_view_host, opener_frame_routing_id, proxy_routing_id, 1980 render_view_host, opener_frame_routing_id, proxy_routing_id,
2031 frame_tree_node_->current_replication_state()); 1981 frame_tree_node_->current_replication_state())) {
1982 // If a RenderView was created notify the destination WebUI if one exists.
1983 if (dest_web_ui)
1984 dest_web_ui->RenderViewCreated(render_view_host);
nasko 2015/10/14 23:54:15 Why can't we move this call to right after we've c
carlosk 2015/10/15 16:34:07 That is what I had before. But this call *really*
nasko 2015/10/15 17:40:09 RenderViewCreated as a notification means exactly
carlosk 2015/10/19 17:21:01 http://crbug.com/544982
Dan Beam 2015/10/19 19:22:10 ^ this
carlosk 2015/10/20 12:58:51 Are there tests that cover these situations? Trybo
1985 return true;
1986 }
1987 return false;
2032 } 1988 }
2033 1989
2034 bool RenderFrameHostManager::InitRenderFrame( 1990 bool RenderFrameHostManager::InitRenderFrame(
2035 RenderFrameHostImpl* render_frame_host) { 1991 RenderFrameHostImpl* render_frame_host) {
2036 if (render_frame_host->IsRenderFrameLive()) 1992 if (render_frame_host->IsRenderFrameLive())
2037 return true; 1993 return true;
2038 1994
2039 SiteInstance* site_instance = render_frame_host->GetSiteInstance(); 1995 SiteInstance* site_instance = render_frame_host->GetSiteInstance();
2040 1996
2041 int opener_routing_id = MSG_ROUTING_NONE; 1997 int opener_routing_id = MSG_ROUTING_NONE;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
2101 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); 2057 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance);
2102 if (proxy) 2058 if (proxy)
2103 return proxy->GetRoutingID(); 2059 return proxy->GetRoutingID();
2104 2060
2105 return MSG_ROUTING_NONE; 2061 return MSG_ROUTING_NONE;
2106 } 2062 }
2107 2063
2108 void RenderFrameHostManager::CommitPending() { 2064 void RenderFrameHostManager::CommitPending() {
2109 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", 2065 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending",
2110 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); 2066 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
2111 bool browser_side_navigation =
2112 base::CommandLine::ForCurrentProcess()->HasSwitch(
2113 switches::kEnableBrowserSideNavigation);
2114
2115 // First check whether we're going to want to focus the location bar after 2067 // First check whether we're going to want to focus the location bar after
2116 // this commit. We do this now because the navigation hasn't formally 2068 // this commit. We do this now because the navigation hasn't formally
2117 // committed yet, so if we've already cleared |pending_web_ui_| the call chain 2069 // committed yet, so if we've already cleared the pending WebUI the call chain
2118 // this triggers won't be able to figure out what's going on. 2070 // this triggers won't be able to figure out what's going on.
2119 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); 2071 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault();
2120 2072
2121 // Next commit the Web UI, if any. Either replace |web_ui_| with 2073 // If the current RenderFrameHost has a pending WebUI then just commit it and
2122 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or 2074 // return (there should be nothing else to commit).
2123 // leave |web_ui_| as is if reusing it. 2075 if (render_frame_host_->pending_web_ui()) {
2124 DCHECK(!(pending_web_ui_ && pending_and_current_web_ui_)); 2076 DCHECK(!pending_render_frame_host_ && !speculative_render_frame_host_);
2125 if (pending_web_ui_ || speculative_web_ui_) { 2077 render_frame_host_->CommitPendingWebUI();
2126 DCHECK(!should_reuse_web_ui_);
2127 web_ui_.reset(browser_side_navigation ? speculative_web_ui_.release()
2128 : pending_web_ui_.release());
2129 } else if (pending_and_current_web_ui_ || should_reuse_web_ui_) {
2130 if (browser_side_navigation) {
2131 DCHECK(web_ui_);
2132 should_reuse_web_ui_ = false;
2133 } else {
2134 DCHECK_EQ(pending_and_current_web_ui_.get(), web_ui_.get());
2135 pending_and_current_web_ui_.reset();
2136 }
2137 } else {
2138 web_ui_.reset();
2139 }
2140 DCHECK(!speculative_web_ui_);
2141 DCHECK(!should_reuse_web_ui_);
2142
2143 // It's possible for the pending_render_frame_host_ to be nullptr when we
2144 // aren't crossing process boundaries. If so, we just needed to handle the Web
2145 // UI committing above and we're done.
2146 if (!pending_render_frame_host_ && !speculative_render_frame_host_) {
2147 if (will_focus_location_bar) 2078 if (will_focus_location_bar)
2148 delegate_->SetFocusToLocationBar(false); 2079 delegate_->SetFocusToLocationBar(false);
2149 return; 2080 return;
2150 } 2081 }
2151 2082
2152 // Remember if the page was focused so we can focus the new renderer in 2083 // Remember if the page was focused so we can focus the new renderer in
2153 // that case. 2084 // that case.
2154 bool focus_render_view = !will_focus_location_bar && 2085 bool focus_render_view = !will_focus_location_bar &&
2155 render_frame_host_->GetView() && 2086 render_frame_host_->GetView() &&
2156 render_frame_host_->GetView()->HasFocus(); 2087 render_frame_host_->GetView()->HasFocus();
2157 2088
2158 bool is_main_frame = frame_tree_node_->IsMainFrame(); 2089 bool is_main_frame = frame_tree_node_->IsMainFrame();
2159 2090
2160 // Swap in the pending or speculative frame and make it active. Also ensure 2091 // Swap in the pending or speculative frame and make it active. Also ensure
2161 // the FrameTree stays in sync. 2092 // the FrameTree stays in sync.
2162 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; 2093 scoped_ptr<RenderFrameHostImpl> old_render_frame_host;
2163 if (!browser_side_navigation) { 2094 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
2095 switches::kEnableBrowserSideNavigation)) {
2164 DCHECK(!speculative_render_frame_host_); 2096 DCHECK(!speculative_render_frame_host_);
2165 old_render_frame_host = 2097 old_render_frame_host =
2166 SetRenderFrameHost(pending_render_frame_host_.Pass()); 2098 SetRenderFrameHost(pending_render_frame_host_.Pass());
2167 } else { 2099 } else {
2168 // PlzNavigate 2100 // PlzNavigate
2169 DCHECK(speculative_render_frame_host_); 2101 DCHECK(speculative_render_frame_host_);
2170 old_render_frame_host = 2102 old_render_frame_host =
2171 SetRenderFrameHost(speculative_render_frame_host_.Pass()); 2103 SetRenderFrameHost(speculative_render_frame_host_.Pass());
2172 } 2104 }
2173 2105
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 // If we are currently navigating cross-process, we want to get back to normal 2247 // If we are currently navigating cross-process, we want to get back to normal
2316 // and then navigate as usual. 2248 // and then navigate as usual.
2317 if (pending_render_frame_host_) 2249 if (pending_render_frame_host_)
2318 CancelPending(); 2250 CancelPending();
2319 2251
2320 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); 2252 SiteInstance* current_instance = render_frame_host_->GetSiteInstance();
2321 scoped_refptr<SiteInstance> new_instance = GetSiteInstanceForNavigation( 2253 scoped_refptr<SiteInstance> new_instance = GetSiteInstanceForNavigation(
2322 dest_url, source_instance, dest_instance, nullptr, transition, 2254 dest_url, source_instance, dest_instance, nullptr, transition,
2323 dest_is_restore, dest_is_view_source_mode); 2255 dest_is_restore, dest_is_view_source_mode);
2324 2256
2325 const NavigationEntry* current_entry =
2326 delegate_->GetLastCommittedNavigationEntryForRenderManager();
2327
2328 DCHECK(!pending_render_frame_host_); 2257 DCHECK(!pending_render_frame_host_);
2329 2258
2330 if (new_instance.get() != current_instance) { 2259 if (new_instance.get() != current_instance) {
2331 TRACE_EVENT_INSTANT2( 2260 TRACE_EVENT_INSTANT2(
2332 "navigation", 2261 "navigation",
2333 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance", 2262 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance",
2334 TRACE_EVENT_SCOPE_THREAD, 2263 TRACE_EVENT_SCOPE_THREAD,
2335 "current_instance id", current_instance->GetId(), 2264 "current_instance id", current_instance->GetId(),
2336 "new_instance id", new_instance->GetId()); 2265 "new_instance id", new_instance->GetId());
2337 2266
2267 // Clear any pending WebUI on the current RenderFrameHost as it won't
2268 // be used.
2269 render_frame_host_->DiscardPendingWebUI();
2270
2338 // New SiteInstance: create a pending RFH to navigate. 2271 // New SiteInstance: create a pending RFH to navigate.
2339 2272
2340 // This will possibly create (set to nullptr) a Web UI object for the 2273 CreatePendingRenderFrameHost(current_instance, new_instance.get(), dest_url,
2341 // pending page. We'll use this later to give the page special access. This 2274 bindings);
2342 // must happen before the new renderer is created below so it will get
2343 // bindings. It must also happen after the above conditional call to
2344 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_
2345 // and the page will not have its bindings set appropriately.
2346 SetPendingWebUI(dest_url, bindings);
2347 CreatePendingRenderFrameHost(current_instance, new_instance.get());
2348 if (!pending_render_frame_host_) 2275 if (!pending_render_frame_host_)
2349 return nullptr; 2276 return nullptr;
2350 2277
2351 // Check if our current RFH is live before we set up a transition. 2278 // Check if our current RFH is live before we set up a transition.
2352 if (!render_frame_host_->IsRenderFrameLive()) { 2279 if (!render_frame_host_->IsRenderFrameLive()) {
2353 // The current RFH is not live. There's no reason to sit around with a 2280 // The current RFH is not live. There's no reason to sit around with a
2354 // sad tab or a newly created RFH while we wait for the pending RFH to 2281 // sad tab or a newly created RFH while we wait for the pending RFH to
2355 // navigate. Just switch to the pending RFH now and go back to normal. 2282 // navigate. Just switch to the pending RFH now and go back to normal.
2356 // (Note that we don't care about on{before}unload handlers if the current 2283 // (Note that we don't care about on{before}unload handlers if the current
2357 // RFH isn't live.) 2284 // RFH isn't live.)
2358 CommitPending(); 2285 CommitPending();
2359 return render_frame_host_.get(); 2286 return render_frame_host_.get();
2360 } 2287 }
2361 // Otherwise, it's safe to treat this as a pending cross-process transition. 2288 // Otherwise, it's safe to treat this as a pending cross-process transition.
2362 2289
2363 // We now have a pending RFH. 2290 // We now have a pending RFH and possibly an associated pending WebUI.
2364 DCHECK(pending_render_frame_host_); 2291 DCHECK(pending_render_frame_host_);
2292 DCHECK_EQ(pending_web_ui(), pending_render_frame_host_->web_ui());
2293 DCHECK(!pending_render_frame_host_->pending_web_ui());
2294 DCHECK(!render_frame_host_->pending_web_ui());
2365 2295
2366 // We need to wait until the beforeunload handler has run, unless we are 2296 // We need to wait until the beforeunload handler has run, unless we are
2367 // transferring an existing request (in which case it has already run). 2297 // transferring an existing request (in which case it has already run).
2368 // Suspend the new render view (i.e., don't let it send the cross-process 2298 // Suspend the new render view (i.e., don't let it send the cross-process
2369 // Navigate message) until we hear back from the old renderer's 2299 // Navigate message) until we hear back from the old renderer's
2370 // beforeunload handler. If the handler returns false, we'll have to 2300 // beforeunload handler. If the handler returns false, we'll have to
2371 // cancel the request. 2301 // cancel the request.
2372 // 2302 //
2373 DCHECK(!pending_render_frame_host_->are_navigations_suspended()); 2303 DCHECK(!pending_render_frame_host_->are_navigations_suspended());
2374 bool is_transfer = transferred_request_id != GlobalRequestID(); 2304 bool is_transfer = transferred_request_id != GlobalRequestID();
(...skipping 22 matching lines...) Expand all
2397 2327
2398 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_. 2328 // Otherwise the same SiteInstance can be used. Navigate render_frame_host_.
2399 2329
2400 // It's possible to swap out the current RFH and then decide to navigate in it 2330 // It's possible to swap out the current RFH and then decide to navigate in it
2401 // anyway (e.g., a cross-process navigation that redirects back to the 2331 // anyway (e.g., a cross-process navigation that redirects back to the
2402 // original site). In that case, we have a proxy for the current RFH but 2332 // original site). In that case, we have a proxy for the current RFH but
2403 // haven't deleted it yet. The new navigation will swap it back in, so we can 2333 // haven't deleted it yet. The new navigation will swap it back in, so we can
2404 // delete the proxy. 2334 // delete the proxy.
2405 proxy_hosts_->Remove(new_instance.get()->GetId()); 2335 proxy_hosts_->Remove(new_instance.get()->GetId());
2406 2336
2407 if (ShouldReuseWebUI(current_entry, dest_url)) { 2337 render_frame_host_->UpdatePendingWebUI(dest_url, bindings);
2408 pending_web_ui_.reset(); 2338 DCHECK(pending_web_ui() == render_frame_host_->pending_web_ui());
2409 pending_and_current_web_ui_ = web_ui_->AsWeakPtr();
2410 } else {
2411 SetPendingWebUI(dest_url, bindings);
2412 // Make sure the new RenderViewHost has the right bindings.
2413 if (pending_web_ui() &&
2414 !render_frame_host_->GetProcess()->IsForGuestsOnly()) {
2415 render_frame_host_->render_view_host()->AllowBindings(
2416 pending_web_ui()->GetBindings());
2417 }
2418 }
2419 2339
2340 // If a pending WebUI was set on the current RenderFrameHost (be it a new one
2341 // or the reused current one) and the associated RenderFrame is alive, notify
2342 // the WebUI the RenderView is being reused.
2420 if (pending_web_ui() && render_frame_host_->IsRenderFrameLive()) { 2343 if (pending_web_ui() && render_frame_host_->IsRenderFrameLive()) {
2421 pending_web_ui()->RenderViewReused(render_frame_host_->render_view_host(), 2344 pending_web_ui()->RenderViewReused(render_frame_host_->render_view_host(),
2422 frame_tree_node_->IsMainFrame()); 2345 frame_tree_node_->IsMainFrame());
2423 } 2346 }
2424 2347
2425 // The renderer can exit view source mode when any error or cancellation 2348 // The renderer can exit view source mode when any error or cancellation
2426 // happen. We must overwrite to recover the mode. 2349 // happen. We must overwrite to recover the mode.
2427 if (dest_is_view_source_mode) { 2350 if (dest_is_view_source_mode) {
2428 render_frame_host_->render_view_host()->Send( 2351 render_frame_host_->render_view_host()->Send(
2429 new ViewMsg_EnableViewSourceMode( 2352 new ViewMsg_EnableViewSourceMode(
2430 render_frame_host_->render_view_host()->GetRoutingID())); 2353 render_frame_host_->render_view_host()->GetRoutingID()));
2431 } 2354 }
2432 2355
2433 return render_frame_host_.get(); 2356 return render_frame_host_.get();
2434 } 2357 }
2435 2358
2436 void RenderFrameHostManager::CancelPending() { 2359 void RenderFrameHostManager::CancelPending() {
2437 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", 2360 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending",
2438 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); 2361 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
2362 render_frame_host_->DiscardPendingWebUI();
2439 DiscardUnusedFrame(UnsetPendingRenderFrameHost()); 2363 DiscardUnusedFrame(UnsetPendingRenderFrameHost());
2440 } 2364 }
2441 2365
2442 scoped_ptr<RenderFrameHostImpl> 2366 scoped_ptr<RenderFrameHostImpl>
2443 RenderFrameHostManager::UnsetPendingRenderFrameHost() { 2367 RenderFrameHostManager::UnsetPendingRenderFrameHost() {
2444 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = 2368 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host =
2445 pending_render_frame_host_.Pass(); 2369 pending_render_frame_host_.Pass();
2446 2370
2447 RenderFrameDevToolsAgentHost::OnCancelPendingNavigation( 2371 RenderFrameDevToolsAgentHost::OnCancelPendingNavigation(
2448 pending_render_frame_host.get(), 2372 pending_render_frame_host.get(),
2449 render_frame_host_.get()); 2373 render_frame_host_.get());
2450 2374
2451 // We no longer need to prevent the process from exiting. 2375 // We no longer need to prevent the process from exiting.
2452 pending_render_frame_host->GetProcess()->RemovePendingView(); 2376 pending_render_frame_host->GetProcess()->RemovePendingView();
2453 2377
2454 pending_web_ui_.reset();
2455 pending_and_current_web_ui_.reset();
2456
2457 return pending_render_frame_host.Pass(); 2378 return pending_render_frame_host.Pass();
2458 } 2379 }
2459 2380
2460 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( 2381 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost(
2461 scoped_ptr<RenderFrameHostImpl> render_frame_host) { 2382 scoped_ptr<RenderFrameHostImpl> render_frame_host) {
2462 // Swap the two. 2383 // Swap the two.
2463 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = 2384 scoped_ptr<RenderFrameHostImpl> old_render_frame_host =
2464 render_frame_host_.Pass(); 2385 render_frame_host_.Pass();
2465 render_frame_host_ = render_frame_host.Pass(); 2386 render_frame_host_ = render_frame_host.Pass();
2466 2387
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2621 if (rvh && !rvh->IsRenderViewLive()) { 2542 if (rvh && !rvh->IsRenderViewLive()) {
2622 EnsureRenderViewInitialized(rvh, instance); 2543 EnsureRenderViewInitialized(rvh, instance);
2623 } else { 2544 } else {
2624 // Create a swapped out RenderView in the given SiteInstance if none 2545 // Create a swapped out RenderView in the given SiteInstance if none
2625 // exists. Since an opener can point to a subframe, do this on the root 2546 // exists. Since an opener can point to a subframe, do this on the root
2626 // frame of the current opener's frame tree. 2547 // frame of the current opener's frame tree.
2627 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { 2548 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) {
2628 frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance); 2549 frame_tree->root()->render_manager()->CreateRenderFrameProxy(instance);
2629 } else { 2550 } else {
2630 frame_tree->root()->render_manager()->CreateRenderFrame( 2551 frame_tree->root()->render_manager()->CreateRenderFrame(
2631 instance, nullptr, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, 2552 instance, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, nullptr);
2632 nullptr);
2633 } 2553 }
2634 } 2554 }
2635 } 2555 }
2636 } 2556 }
2637 2557
2638 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { 2558 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) {
2639 if (!frame_tree_node_->opener()) 2559 if (!frame_tree_node_->opener())
2640 return MSG_ROUTING_NONE; 2560 return MSG_ROUTING_NONE;
2641 2561
2642 return frame_tree_node_->opener() 2562 return frame_tree_node_->opener()
2643 ->render_manager() 2563 ->render_manager()
2644 ->GetRoutingIdForSiteInstance(instance); 2564 ->GetRoutingIdForSiteInstance(instance);
2645 } 2565 }
2646 2566
2647 } // namespace content 2567 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698