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

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: Doesn't try to create a WebUI if URL is invalid (fixes unit_tests). 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
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
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 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698