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