Chromium Code Reviews| 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 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 RenderViewHostDelegate* render_view_delegate, | 211 RenderViewHostDelegate* render_view_delegate, |
| 212 RenderWidgetHostDelegate* render_widget_delegate, | 212 RenderWidgetHostDelegate* render_widget_delegate, |
| 213 Delegate* delegate) | 213 Delegate* delegate) |
| 214 : frame_tree_node_(frame_tree_node), | 214 : frame_tree_node_(frame_tree_node), |
| 215 delegate_(delegate), | 215 delegate_(delegate), |
| 216 render_frame_delegate_(render_frame_delegate), | 216 render_frame_delegate_(render_frame_delegate), |
| 217 render_view_delegate_(render_view_delegate), | 217 render_view_delegate_(render_view_delegate), |
| 218 render_widget_delegate_(render_widget_delegate), | 218 render_widget_delegate_(render_widget_delegate), |
| 219 proxy_hosts_(new RenderFrameProxyHostMap(this)), | 219 proxy_hosts_(new RenderFrameProxyHostMap(this)), |
| 220 interstitial_page_(nullptr), | 220 interstitial_page_(nullptr), |
| 221 current_web_ui_is_navigating_(false), | |
| 222 weak_factory_(this) { | 221 weak_factory_(this) { |
| 223 DCHECK(frame_tree_node_); | 222 DCHECK(frame_tree_node_); |
| 224 } | 223 } |
| 225 | 224 |
| 226 RenderFrameHostManager::~RenderFrameHostManager() { | 225 RenderFrameHostManager::~RenderFrameHostManager() { |
| 227 if (pending_render_frame_host_) { | 226 if (pending_render_frame_host_) { |
| 228 scoped_ptr<RenderFrameHostImpl> relic = UnsetPendingRenderFrameHost(); | 227 scoped_ptr<RenderFrameHostImpl> relic = UnsetPendingRenderFrameHost(); |
| 229 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); | 228 ShutdownProxiesIfLastActiveFrameInSiteInstance(relic.get()); |
| 230 } | 229 } |
| 231 | 230 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 276 return nullptr; | 275 return nullptr; |
| 277 return render_frame_host_->render_view_host(); | 276 return render_frame_host_->render_view_host(); |
| 278 } | 277 } |
| 279 | 278 |
| 280 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { | 279 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { |
| 281 if (!pending_render_frame_host_) | 280 if (!pending_render_frame_host_) |
| 282 return nullptr; | 281 return nullptr; |
| 283 return pending_render_frame_host_->render_view_host(); | 282 return pending_render_frame_host_->render_view_host(); |
| 284 } | 283 } |
| 285 | 284 |
| 286 WebUIImpl* RenderFrameHostManager::GetNavigatingWebUI() const { | |
| 287 if (current_web_ui_is_navigating_) | |
| 288 return render_frame_host_->web_ui(); | |
| 289 | |
| 290 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 291 switches::kEnableBrowserSideNavigation)) { | |
| 292 if (speculative_render_frame_host_) | |
| 293 return speculative_render_frame_host_->web_ui(); | |
| 294 } else { | |
| 295 if (pending_render_frame_host_) | |
| 296 return pending_render_frame_host_->web_ui(); | |
| 297 } | |
| 298 return nullptr; | |
| 299 } | |
| 300 | |
| 301 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { | 285 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { |
| 302 if (interstitial_page_) | 286 if (interstitial_page_) |
| 303 return interstitial_page_->GetView(); | 287 return interstitial_page_->GetView(); |
| 304 if (render_frame_host_) | 288 if (render_frame_host_) |
| 305 return render_frame_host_->GetView(); | 289 return render_frame_host_->GetView(); |
| 306 return nullptr; | 290 return nullptr; |
| 307 } | 291 } |
| 308 | 292 |
| 309 bool RenderFrameHostManager::ForInnerDelegate() { | 293 bool RenderFrameHostManager::ForInnerDelegate() { |
| 310 return delegate_->GetOuterDelegateFrameTreeNodeID() != | 294 return delegate_->GetOuterDelegateFrameTreeNodeID() != |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 407 // site that is handled via Mojo, then Mojo WebUI code in //chrome will | 391 // site that is handled via Mojo, then Mojo WebUI code in //chrome will |
| 408 // add a service to this RFH's ServiceRegistry). | 392 // add a service to this RFH's ServiceRegistry). |
| 409 dest_render_frame_host->SetUpMojoIfNeeded(); | 393 dest_render_frame_host->SetUpMojoIfNeeded(); |
| 410 | 394 |
| 411 // Recreate the opener chain. | 395 // Recreate the opener chain. |
| 412 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), | 396 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), |
| 413 frame_tree_node_); | 397 frame_tree_node_); |
| 414 if (!InitRenderView(dest_render_frame_host->render_view_host(), nullptr)) | 398 if (!InitRenderView(dest_render_frame_host->render_view_host(), nullptr)) |
| 415 return nullptr; | 399 return nullptr; |
| 416 | 400 |
| 417 if (GetNavigatingWebUI()) { | 401 if (dest_render_frame_host->web_ui()) { |
| 418 GetNavigatingWebUI()->RenderViewCreated( | 402 dest_render_frame_host->web_ui()->RenderViewCreated( |
| 419 dest_render_frame_host->render_view_host()); | 403 dest_render_frame_host->render_view_host()); |
| 420 } | 404 } |
| 421 | 405 |
| 422 // Now that we've created a new renderer, be sure to hide it if it isn't | 406 // Now that we've created a new renderer, be sure to hide it if it isn't |
| 423 // our primary one. Otherwise, we might crash if we try to call Show() | 407 // our primary one. Otherwise, we might crash if we try to call Show() |
| 424 // on it later. | 408 // on it later. |
| 425 if (dest_render_frame_host != render_frame_host_) { | 409 if (dest_render_frame_host != render_frame_host_) { |
| 426 if (dest_render_frame_host->GetView()) | 410 if (dest_render_frame_host->GetView()) |
| 427 dest_render_frame_host->GetView()->Hide(); | 411 dest_render_frame_host->GetView()->Hide(); |
| 428 } else { | 412 } else { |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 662 | 646 |
| 663 // Make sure any dynamic changes to this frame's sandbox flags that were made | 647 // Make sure any dynamic changes to this frame's sandbox flags that were made |
| 664 // prior to navigation take effect. | 648 // prior to navigation take effect. |
| 665 CommitPendingSandboxFlags(); | 649 CommitPendingSandboxFlags(); |
| 666 } | 650 } |
| 667 | 651 |
| 668 void RenderFrameHostManager::CommitPendingIfNecessary( | 652 void RenderFrameHostManager::CommitPendingIfNecessary( |
| 669 RenderFrameHostImpl* render_frame_host, | 653 RenderFrameHostImpl* render_frame_host, |
| 670 bool was_caused_by_user_gesture) { | 654 bool was_caused_by_user_gesture) { |
| 671 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { | 655 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { |
| 672 DCHECK(!current_web_ui_is_navigating_ || render_frame_host_->web_ui()); | |
| 673 | 656 |
| 674 // We should only hear this from our current renderer. | 657 // We should only hear this from our current renderer. |
| 675 DCHECK_EQ(render_frame_host_, render_frame_host); | 658 DCHECK_EQ(render_frame_host_, render_frame_host); |
| 676 | 659 |
| 677 // A commit is required if there is a navigating WebUI, even without a | 660 // If the current RenderFrameHost has a WebUI it must be committed |
|
Charlie Reis
2015/11/09 07:02:02
nit: End sentence with period.
carlosk
2015/11/10 10:28:55
Done.
| |
| 678 // pending or speculative RenderFrameHost. | 661 // Note: for when one tries to move same-site commit logic into |
|
Charlie Reis
2015/11/09 07:02:02
nit: s/for when/If/
carlosk
2015/11/10 10:28:55
Done.
| |
| 679 if (GetNavigatingWebUI()) | 662 // RenderFrameHost itself mind that the focus setting logic inside |
|
Charlie Reis
2015/11/09 07:02:02
nit: comma after "itself"
carlosk
2015/11/10 10:28:55
Done.
| |
| 663 // CommitPending also needs to be moved there. | |
| 664 if (render_frame_host_->web_ui()) | |
| 680 CommitPending(); | 665 CommitPending(); |
| 681 return; | 666 return; |
| 682 } | 667 } |
| 683 | 668 |
| 684 if (render_frame_host == pending_render_frame_host_ || | 669 if (render_frame_host == pending_render_frame_host_ || |
| 685 render_frame_host == speculative_render_frame_host_) { | 670 render_frame_host == speculative_render_frame_host_) { |
| 686 // The pending cross-process navigation completed, so show the renderer. | 671 // The pending cross-process navigation completed, so show the renderer. |
| 687 CommitPending(); | 672 CommitPending(); |
| 688 } else if (render_frame_host == render_frame_host_) { | 673 } else if (render_frame_host == render_frame_host_) { |
| 689 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 674 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1048 DCHECK(success); | 1033 DCHECK(success); |
| 1049 } | 1034 } |
| 1050 | 1035 |
| 1051 bool changed_web_ui = speculative_render_frame_host_->UpdateWebUI( | 1036 bool changed_web_ui = speculative_render_frame_host_->UpdateWebUI( |
| 1052 request.common_params().url, request.bindings()); | 1037 request.common_params().url, request.bindings()); |
| 1053 if (changed_web_ui && speculative_render_frame_host_->web_ui()) { | 1038 if (changed_web_ui && speculative_render_frame_host_->web_ui()) { |
| 1054 speculative_render_frame_host_->web_ui()->RenderViewCreated( | 1039 speculative_render_frame_host_->web_ui()->RenderViewCreated( |
| 1055 speculative_render_frame_host_->render_view_host()); | 1040 speculative_render_frame_host_->render_view_host()); |
| 1056 } | 1041 } |
| 1057 DCHECK(speculative_render_frame_host_); | 1042 DCHECK(speculative_render_frame_host_); |
| 1058 DCHECK_EQ(GetNavigatingWebUI(), speculative_render_frame_host_->web_ui()); | |
| 1059 | 1043 |
| 1060 navigation_rfh = speculative_render_frame_host_.get(); | 1044 navigation_rfh = speculative_render_frame_host_.get(); |
| 1061 | 1045 |
| 1062 // Check if our current RFH is live. | 1046 // Check if our current RFH is live. |
| 1063 if (!render_frame_host_->IsRenderFrameLive()) { | 1047 if (!render_frame_host_->IsRenderFrameLive()) { |
| 1064 // The current RFH is not live. There's no reason to sit around with a | 1048 // The current RFH is not live. There's no reason to sit around with a |
| 1065 // sad tab or a newly created RFH while we wait for the navigation to | 1049 // sad tab or a newly created RFH while we wait for the navigation to |
| 1066 // complete. Just switch to the speculative RFH now and go back to normal. | 1050 // complete. Just switch to the speculative RFH now and go back to normal. |
| 1067 // (Note that we don't care about on{before}unload handlers if the current | 1051 // (Note that we don't care about on{before}unload handlers if the current |
| 1068 // RFH isn't live.) | 1052 // RFH isn't live.) |
| 1069 CommitPending(); | 1053 CommitPending(); |
| 1070 } | 1054 } |
| 1071 DCHECK(!current_web_ui_is_navigating_); | |
| 1072 } | 1055 } |
| 1073 DCHECK(navigation_rfh && | 1056 DCHECK(navigation_rfh && |
| 1074 (navigation_rfh == render_frame_host_.get() || | 1057 (navigation_rfh == render_frame_host_.get() || |
| 1075 navigation_rfh == speculative_render_frame_host_.get())); | 1058 navigation_rfh == speculative_render_frame_host_.get())); |
| 1076 | 1059 |
| 1077 // If the RenderFrame that needs to navigate is not live (its process was just | 1060 // If the RenderFrame that needs to navigate is not live (its process was just |
| 1078 // created or has crashed), initialize it. | 1061 // created or has crashed), initialize it. |
| 1079 if (!navigation_rfh->IsRenderFrameLive()) { | 1062 if (!navigation_rfh->IsRenderFrameLive()) { |
| 1080 // Recreate the opener chain. | 1063 // Recreate the opener chain. |
| 1081 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); | 1064 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); |
| 1082 if (!InitRenderView(navigation_rfh->render_view_host(), nullptr)) | 1065 if (!InitRenderView(navigation_rfh->render_view_host(), nullptr)) |
| 1083 return nullptr; | 1066 return nullptr; |
| 1084 | 1067 |
| 1085 if (GetNavigatingWebUI()) { | 1068 if (navigation_rfh->web_ui()) { |
| 1086 GetNavigatingWebUI()->RenderViewCreated( | 1069 navigation_rfh->web_ui()->RenderViewCreated( |
| 1087 navigation_rfh->render_view_host()); | 1070 navigation_rfh->render_view_host()); |
| 1088 } | 1071 } |
| 1089 | 1072 |
| 1090 if (navigation_rfh == render_frame_host_) { | 1073 if (navigation_rfh == render_frame_host_) { |
| 1091 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 1074 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
| 1092 // manager still uses NotificationService and expects to see a | 1075 // manager still uses NotificationService and expects to see a |
| 1093 // RenderViewHost changed notification after WebContents and | 1076 // RenderViewHost changed notification after WebContents and |
| 1094 // RenderFrameHostManager are completely initialized. This should be | 1077 // RenderFrameHostManager are completely initialized. This should be |
| 1095 // removed once the process manager moves away from NotificationService. | 1078 // removed once the process manager moves away from NotificationService. |
| 1096 // See https://crbug.com/462682. | 1079 // See https://crbug.com/462682. |
| 1097 delegate_->NotifyMainFrameSwappedFromRenderManager( | 1080 delegate_->NotifyMainFrameSwappedFromRenderManager( |
| 1098 nullptr, render_frame_host_->render_view_host()); | 1081 nullptr, render_frame_host_->render_view_host()); |
| 1099 } | 1082 } |
| 1100 } | 1083 } |
| 1101 | 1084 |
| 1102 return navigation_rfh; | 1085 return navigation_rfh; |
| 1103 } | 1086 } |
| 1104 | 1087 |
| 1105 // PlzNavigate | 1088 // PlzNavigate |
| 1106 void RenderFrameHostManager::CleanUpNavigation() { | 1089 void RenderFrameHostManager::CleanUpNavigation() { |
| 1107 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1090 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1108 switches::kEnableBrowserSideNavigation)); | 1091 switches::kEnableBrowserSideNavigation)); |
| 1109 // TODO(carlosk): the discarding of the current RFH WebUI and the cleanup of | |
| 1110 // the speculative RFH should not always happen together. | |
| 1111 current_web_ui_is_navigating_ = false; | |
| 1112 if (speculative_render_frame_host_) | 1092 if (speculative_render_frame_host_) |
| 1113 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); | 1093 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); |
| 1114 } | 1094 } |
| 1115 | 1095 |
| 1116 // PlzNavigate | 1096 // PlzNavigate |
| 1117 scoped_ptr<RenderFrameHostImpl> | 1097 scoped_ptr<RenderFrameHostImpl> |
| 1118 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { | 1098 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { |
| 1119 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1099 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1120 switches::kEnableBrowserSideNavigation)); | 1100 switches::kEnableBrowserSideNavigation)); |
| 1121 speculative_render_frame_host_->GetProcess()->RemovePendingView(); | 1101 speculative_render_frame_host_->GetProcess()->RemovePendingView(); |
| (...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1727 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, | 1707 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, |
| 1728 widget_routing_id, flags); | 1708 widget_routing_id, flags); |
| 1729 } | 1709 } |
| 1730 | 1710 |
| 1731 // PlzNavigate | 1711 // PlzNavigate |
| 1732 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( | 1712 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
| 1733 SiteInstance* old_instance, | 1713 SiteInstance* old_instance, |
| 1734 SiteInstance* new_instance) { | 1714 SiteInstance* new_instance) { |
| 1735 CHECK(new_instance); | 1715 CHECK(new_instance); |
| 1736 CHECK_NE(old_instance, new_instance); | 1716 CHECK_NE(old_instance, new_instance); |
| 1737 CHECK(!current_web_ui_is_navigating_); | |
| 1738 | 1717 |
| 1739 // The process for the new SiteInstance may (if we're sharing a process with | 1718 // The process for the new SiteInstance may (if we're sharing a process with |
| 1740 // another host that already initialized it) or may not (we have our own | 1719 // another host that already initialized it) or may not (we have our own |
| 1741 // process or the existing process crashed) have been initialized. Calling | 1720 // process or the existing process crashed) have been initialized. Calling |
| 1742 // Init multiple times will be ignored, so this is safe. | 1721 // Init multiple times will be ignored, so this is safe. |
| 1743 if (!new_instance->GetProcess()->Init()) | 1722 if (!new_instance->GetProcess()->Init()) |
| 1744 return false; | 1723 return false; |
| 1745 | 1724 |
| 1746 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1725 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
| 1747 | 1726 |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2082 void RenderFrameHostManager::CommitPending() { | 2061 void RenderFrameHostManager::CommitPending() { |
| 2083 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", | 2062 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", |
| 2084 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 2063 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
| 2085 // First check whether we're going to want to focus the location bar after | 2064 // First check whether we're going to want to focus the location bar after |
| 2086 // this commit. We do this now because the navigation hasn't formally | 2065 // this commit. We do this now because the navigation hasn't formally |
| 2087 // committed yet, so if we've already cleared the pending WebUI the call chain | 2066 // committed yet, so if we've already cleared the pending WebUI the call chain |
| 2088 // this triggers won't be able to figure out what's going on. | 2067 // this triggers won't be able to figure out what's going on. |
| 2089 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); | 2068 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); |
| 2090 | 2069 |
| 2091 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { | 2070 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { |
| 2092 DCHECK_EQ(current_web_ui_is_navigating_, !!render_frame_host_->web_ui()); | |
| 2093 current_web_ui_is_navigating_ = false; | |
| 2094 // If there's no pending/speculative RenderFrameHost then the current | 2071 // If there's no pending/speculative RenderFrameHost then the current |
| 2095 // RenderFrameHost is committing. | 2072 // RenderFrameHost is committing. |
| 2096 if (will_focus_location_bar) | 2073 if (will_focus_location_bar) |
| 2097 delegate_->SetFocusToLocationBar(false); | 2074 delegate_->SetFocusToLocationBar(false); |
| 2098 return; | 2075 return; |
| 2099 } | 2076 } |
| 2100 | 2077 |
| 2101 // Remember if the page was focused so we can focus the new renderer in | 2078 // Remember if the page was focused so we can focus the new renderer in |
| 2102 // that case. | 2079 // that case. |
| 2103 bool focus_render_view = !will_focus_location_bar && | 2080 bool focus_render_view = !will_focus_location_bar && |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2285 if (new_instance.get() != current_instance) { | 2262 if (new_instance.get() != current_instance) { |
| 2286 TRACE_EVENT_INSTANT2( | 2263 TRACE_EVENT_INSTANT2( |
| 2287 "navigation", | 2264 "navigation", |
| 2288 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance", | 2265 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance", |
| 2289 TRACE_EVENT_SCOPE_THREAD, | 2266 TRACE_EVENT_SCOPE_THREAD, |
| 2290 "current_instance id", current_instance->GetId(), | 2267 "current_instance id", current_instance->GetId(), |
| 2291 "new_instance id", new_instance->GetId()); | 2268 "new_instance id", new_instance->GetId()); |
| 2292 | 2269 |
| 2293 // New SiteInstance: create a pending RFH to navigate. | 2270 // New SiteInstance: create a pending RFH to navigate. |
| 2294 | 2271 |
| 2295 current_web_ui_is_navigating_ = false; | |
| 2296 CreatePendingRenderFrameHost(current_instance, new_instance.get()); | 2272 CreatePendingRenderFrameHost(current_instance, new_instance.get()); |
| 2297 DCHECK(pending_render_frame_host_); | 2273 DCHECK(pending_render_frame_host_); |
| 2298 if (!pending_render_frame_host_) | 2274 if (!pending_render_frame_host_) |
| 2299 return nullptr; | 2275 return nullptr; |
| 2300 | 2276 |
| 2301 pending_render_frame_host_->UpdateWebUI(dest_url, bindings); | 2277 pending_render_frame_host_->UpdateWebUI(dest_url, bindings); |
| 2302 if (pending_render_frame_host_->web_ui()) { | 2278 if (pending_render_frame_host_->web_ui()) { |
| 2303 pending_render_frame_host_->web_ui()->RenderViewCreated( | 2279 pending_render_frame_host_->web_ui()->RenderViewCreated( |
| 2304 pending_render_frame_host_->render_view_host()); | 2280 pending_render_frame_host_->render_view_host()); |
| 2305 } | 2281 } |
| 2306 | 2282 |
| 2307 // We now have a pending RFH and possibly an associated pending WebUI. | |
| 2308 DCHECK_EQ(GetNavigatingWebUI(), pending_render_frame_host_->web_ui()); | |
| 2309 | |
| 2310 // Check if our current RFH is live before we set up a transition. | 2283 // Check if our current RFH is live before we set up a transition. |
| 2311 if (!render_frame_host_->IsRenderFrameLive()) { | 2284 if (!render_frame_host_->IsRenderFrameLive()) { |
| 2312 // The current RFH is not live. There's no reason to sit around with a | 2285 // The current RFH is not live. There's no reason to sit around with a |
| 2313 // sad tab or a newly created RFH while we wait for the pending RFH to | 2286 // sad tab or a newly created RFH while we wait for the pending RFH to |
| 2314 // navigate. Just switch to the pending RFH now and go back to normal. | 2287 // navigate. Just switch to the pending RFH now and go back to normal. |
| 2315 // (Note that we don't care about on{before}unload handlers if the current | 2288 // (Note that we don't care about on{before}unload handlers if the current |
| 2316 // RFH isn't live.) | 2289 // RFH isn't live.) |
| 2317 CommitPending(); | 2290 CommitPending(); |
| 2318 return render_frame_host_.get(); | 2291 return render_frame_host_.get(); |
| 2319 } | 2292 } |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2375 void RenderFrameHostManager::UpdateWebUIOnCurrentFrameHost(const GURL& dest_url, | 2348 void RenderFrameHostManager::UpdateWebUIOnCurrentFrameHost(const GURL& dest_url, |
| 2376 bool dest_is_restore, | 2349 bool dest_is_restore, |
| 2377 int bindings) { | 2350 int bindings) { |
| 2378 WebUI::TypeID previous_web_ui_type = render_frame_host_->web_ui_type(); | 2351 WebUI::TypeID previous_web_ui_type = render_frame_host_->web_ui_type(); |
| 2379 bool changed_web_ui = render_frame_host_->UpdateWebUI(dest_url, bindings); | 2352 bool changed_web_ui = render_frame_host_->UpdateWebUI(dest_url, bindings); |
| 2380 | 2353 |
| 2381 // If a change in WebUI happened, check this is an acceptable case. | 2354 // If a change in WebUI happened, check this is an acceptable case. |
| 2382 if (changed_web_ui) | 2355 if (changed_web_ui) |
| 2383 CheckWebUITransition(previous_web_ui_type, dest_url, dest_is_restore); | 2356 CheckWebUITransition(previous_web_ui_type, dest_url, dest_is_restore); |
| 2384 | 2357 |
| 2385 // If there is a WebUI in the current RenderFrameHost, it will navigate. | |
| 2386 current_web_ui_is_navigating_ = !!render_frame_host_->web_ui(); | |
| 2387 DCHECK_EQ(GetNavigatingWebUI(), render_frame_host_->web_ui()); | |
| 2388 | |
| 2389 // If the current RenderFrameHost has a WebUI and the associated RenderFrame | 2358 // If the current RenderFrameHost has a WebUI and the associated RenderFrame |
| 2390 // is alive, notify to the WebUI that the RenderView is being created or | 2359 // is alive, notify to the WebUI that the RenderView is being created or |
| 2391 // reused depending on whether the WebUI was changed or not. | 2360 // reused depending on whether the WebUI was changed or not. |
| 2392 if (GetNavigatingWebUI() && render_frame_host_->IsRenderFrameLive()) { | 2361 if (render_frame_host_->web_ui() && render_frame_host_->IsRenderFrameLive()) { |
| 2393 if (changed_web_ui) { | 2362 if (changed_web_ui) { |
| 2394 GetNavigatingWebUI()->RenderViewCreated( | 2363 render_frame_host_->web_ui()->RenderViewCreated( |
| 2395 render_frame_host_->render_view_host()); | 2364 render_frame_host_->render_view_host()); |
| 2396 } else { | 2365 } else { |
| 2397 GetNavigatingWebUI()->RenderViewReused( | 2366 render_frame_host_->web_ui()->RenderViewReused( |
| 2398 render_frame_host_->render_view_host(), | 2367 render_frame_host_->render_view_host(), |
| 2399 frame_tree_node_->IsMainFrame()); | 2368 frame_tree_node_->IsMainFrame()); |
| 2400 } | 2369 } |
| 2401 } | 2370 } |
| 2402 } | 2371 } |
| 2403 | 2372 |
| 2404 void RenderFrameHostManager::CancelPending() { | 2373 void RenderFrameHostManager::CancelPending() { |
| 2405 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", | 2374 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", |
| 2406 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 2375 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
| 2407 current_web_ui_is_navigating_ = false; | |
| 2408 DiscardUnusedFrame(UnsetPendingRenderFrameHost()); | 2376 DiscardUnusedFrame(UnsetPendingRenderFrameHost()); |
| 2409 } | 2377 } |
| 2410 | 2378 |
| 2411 scoped_ptr<RenderFrameHostImpl> | 2379 scoped_ptr<RenderFrameHostImpl> |
| 2412 RenderFrameHostManager::UnsetPendingRenderFrameHost() { | 2380 RenderFrameHostManager::UnsetPendingRenderFrameHost() { |
| 2413 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = | 2381 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = |
| 2414 pending_render_frame_host_.Pass(); | 2382 pending_render_frame_host_.Pass(); |
| 2415 | 2383 |
| 2416 RenderFrameDevToolsAgentHost::OnCancelPendingNavigation( | 2384 RenderFrameDevToolsAgentHost::OnCancelPendingNavigation( |
| 2417 pending_render_frame_host.get(), | 2385 pending_render_frame_host.get(), |
| 2418 render_frame_host_.get()); | 2386 render_frame_host_.get()); |
| 2419 | 2387 |
| 2420 current_web_ui_is_navigating_ = false; | |
| 2421 | |
| 2422 // We no longer need to prevent the process from exiting. | 2388 // We no longer need to prevent the process from exiting. |
| 2423 pending_render_frame_host->GetProcess()->RemovePendingView(); | 2389 pending_render_frame_host->GetProcess()->RemovePendingView(); |
| 2424 | 2390 |
| 2425 return pending_render_frame_host.Pass(); | 2391 return pending_render_frame_host.Pass(); |
| 2426 } | 2392 } |
| 2427 | 2393 |
| 2428 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( | 2394 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( |
| 2429 scoped_ptr<RenderFrameHostImpl> render_frame_host) { | 2395 scoped_ptr<RenderFrameHostImpl> render_frame_host) { |
| 2430 // Swap the two. | 2396 // Swap the two. |
| 2431 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = | 2397 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2652 is_back_from_renderer_url || is_webview_tag_guest); | 2618 is_back_from_renderer_url || is_webview_tag_guest); |
| 2653 } else { | 2619 } else { |
| 2654 // Going from having to not having a WebUI is acceptable when Navigating to | 2620 // Going from having to not having a WebUI is acceptable when Navigating to |
| 2655 // a special renderer URL. | 2621 // a special renderer URL. |
| 2656 CHECK(IsRendererDebugURL( | 2622 CHECK(IsRendererDebugURL( |
| 2657 SiteInstanceImpl::GetEffectiveURL(browser_context, dest_url))); | 2623 SiteInstanceImpl::GetEffectiveURL(browser_context, dest_url))); |
| 2658 } | 2624 } |
| 2659 } | 2625 } |
| 2660 | 2626 |
| 2661 } // namespace content | 2627 } // namespace content |
| OLD | NEW |