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

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

Powered by Google App Engine
This is Rietveld 408576698