Chromium Code Reviews| Index: content/browser/web_contents/web_contents_impl.cc |
| diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
| index 1e665328a2f9847dee7d56cf9b84206ab0031d0a..f22d5c23645383f2aec7f25ff6b1f2345fcbc544 100644 |
| --- a/content/browser/web_contents/web_contents_impl.cc |
| +++ b/content/browser/web_contents/web_contents_impl.cc |
| @@ -1925,16 +1925,28 @@ RenderWidgetHostImpl* WebContentsImpl::GetFocusedRenderWidgetHost( |
| if (receiving_widget != GetMainFrame()->GetRenderWidgetHost()) |
| return receiving_widget; |
| - // If the focused WebContents is a guest WebContents, then get the focused |
| - // frame in the embedder WebContents instead. |
| FrameTreeNode* focused_frame = nullptr; |
| WebContentsImpl* focused_contents = GetFocusedWebContents(); |
| + |
| + // If the focused WebContents is showing an interstitial, return the |
| + // interstitial's widget. |
| + if (focused_contents->ShowingInterstitialPage()) { |
| + return static_cast<RenderFrameHostImpl*>( |
| + focused_contents->GetRenderManager() |
| + ->interstitial_page() |
| + ->GetMainFrame()) |
| + ->GetRenderWidgetHost(); |
| + } |
| + |
| + // If the focused WebContents is a guest WebContents, then get the focused |
| + // frame in the embedder WebContents instead. |
| if (focused_contents->browser_plugin_guest_ && |
| !GuestMode::IsCrossProcessFrameGuest(focused_contents)) { |
| focused_frame = frame_tree_.GetFocusedFrame(); |
| } else { |
| focused_frame = GetFocusedWebContents()->frame_tree_.GetFocusedFrame(); |
| } |
| + |
| if (!focused_frame) |
| return receiving_widget; |
| @@ -1950,6 +1962,16 @@ RenderWidgetHostImpl* WebContentsImpl::GetFocusedRenderWidgetHost( |
| } |
| RenderWidgetHostImpl* WebContentsImpl::GetRenderWidgetHostWithPageFocus() { |
| + WebContentsImpl* focused_web_contents = GetFocusedWebContents(); |
| + |
| + if (focused_web_contents->ShowingInterstitialPage()) { |
| + return static_cast<RenderFrameHostImpl*>( |
| + focused_web_contents->GetRenderManager() |
| + ->interstitial_page() |
| + ->GetMainFrame()) |
| + ->GetRenderWidgetHost(); |
| + } |
| + |
| return GetFocusedWebContents()->GetMainFrame()->GetRenderWidgetHost(); |
|
Avi (use Gerrit)
2017/04/08 00:30:12
might as well use focused_web_contents here
lfg
2017/04/10 17:33:42
Done.
|
| } |
| @@ -2757,6 +2779,19 @@ void WebContentsImpl::AttachInterstitialPage( |
| // Stop the throbber if needed while the interstitial page is shown. |
| if (frame_tree_.IsLoading()) |
| LoadingStateChanged(true, true, nullptr); |
| + |
| + // Connect to outer WebContents if necessary. |
| + if (node_.OuterContentsFrameTreeNode()) { |
| + if (GetRenderManager()->GetProxyToOuterDelegate()) { |
| + DCHECK( |
| + static_cast<RenderWidgetHostViewBase*>(interstitial_page->GetView()) |
| + ->IsRenderWidgetHostViewChildFrame()); |
| + RenderWidgetHostViewChildFrame* view = |
| + static_cast<RenderWidgetHostViewChildFrame*>( |
| + interstitial_page->GetView()); |
| + GetRenderManager()->SetRWHViewForInnerContents(view); |
| + } |
| + } |
| } |
| void WebContentsImpl::DidProceedOnInterstitial() { |
| @@ -2770,6 +2805,19 @@ void WebContentsImpl::DidProceedOnInterstitial() { |
| } |
| void WebContentsImpl::DetachInterstitialPage() { |
| + // Disconnect from outer WebContents if necessary. |
| + if (node_.OuterContentsFrameTreeNode()) { |
| + if (GetRenderManager()->GetProxyToOuterDelegate()) { |
| + DCHECK(static_cast<RenderWidgetHostViewBase*>( |
| + GetRenderManager()->current_frame_host()->GetView()) |
| + ->IsRenderWidgetHostViewChildFrame()); |
| + RenderWidgetHostViewChildFrame* view = |
| + static_cast<RenderWidgetHostViewChildFrame*>( |
| + GetRenderManager()->current_frame_host()->GetView()); |
| + GetRenderManager()->SetRWHViewForInnerContents(view); |
| + } |
| + } |
| + |
| bool interstitial_pausing_throbber = |
| ShowingInterstitialPage() && |
| GetRenderManager()->interstitial_page()->pause_throbber(); |
| @@ -4830,7 +4878,14 @@ void WebContentsImpl::SetAsFocusedWebContentsIfNecessary() { |
| if (GetRenderManager()->GetProxyToOuterDelegate()) |
| GetRenderManager()->GetProxyToOuterDelegate()->SetFocusedFrame(); |
| - GetMainFrame()->GetRenderWidgetHost()->SetPageFocus(true); |
| + if (ShowingInterstitialPage()) { |
| + static_cast<RenderFrameHostImpl*>( |
| + GetRenderManager()->interstitial_page()->GetMainFrame()) |
| + ->GetRenderWidgetHost() |
| + ->SetPageFocus(true); |
| + } else { |
| + GetMainFrame()->GetRenderWidgetHost()->SetPageFocus(true); |
| + } |
| GetOutermostWebContents()->node_.SetFocusedWebContents(this); |
| } |