123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Cheng Zhao <[email protected]>
- Date: Thu, 4 Oct 2018 14:57:02 -0700
- Subject: fix: also propagate fullscreen state for outer frame
- When entering fullscreen with Element.requestFullscreen in child frames,
- the parent frame should also enter fullscreen mode too. Chromium handles
- this for iframes, but not for webviews as they are essentially main
- frames instead of child frames.
- This patch makes webviews propagate the fullscreen state to embedder.It also handles a
- DCHECK preventing guest webcontents from becoming the focused webContents.
- Note that we also need to manually update embedder's
- `api::WebContents::IsFullscreenForTabOrPending` value.
- diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
- index ed356e5a1f97afa8a133ae1ab8b7f6a0fc9a97ac..f217dbdef519759971a949c3f0ffcbd098669537 100644
- --- a/content/browser/renderer_host/render_frame_host_impl.cc
- +++ b/content/browser/renderer_host/render_frame_host_impl.cc
- @@ -7502,6 +7502,17 @@ void RenderFrameHostImpl::EnterFullscreen(
- }
- }
-
- + // Entering fullscreen from webview should also notify its outer frame.
- + if (frame_tree_node()->render_manager()->IsMainFrameForInnerDelegate()) {
- + RenderFrameProxyHost* outer_proxy =
- + frame_tree_node()->render_manager()->GetProxyToOuterDelegate();
- + DCHECK(outer_proxy);
- + if (outer_proxy->is_render_frame_proxy_live()) {
- + outer_proxy->GetAssociatedRemoteFrame()->WillEnterFullscreen(
- + options.Clone());
- + }
- + }
- +
- // Focus the window if another frame may have delegated the capability.
- if (had_fullscreen_token && !GetView()->HasFocus())
- GetView()->Focus();
- diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
- index 4a911829b833a952e4e63e2a7ce4850918eec84b..05d42b8808ac3dbb2c3ccfe3213fd9715a373960 100644
- --- a/content/browser/web_contents/web_contents_impl.cc
- +++ b/content/browser/web_contents/web_contents_impl.cc
- @@ -3712,21 +3712,25 @@ KeyboardEventProcessingResult WebContentsImpl::PreHandleKeyboardEvent(
- const NativeWebKeyboardEvent& event) {
- OPTIONAL_TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("content.verbose"),
- "WebContentsImpl::PreHandleKeyboardEvent");
- - auto* outermost_contents = GetOutermostWebContents();
- - // TODO(wjmaclean): Generalize this to forward all key events to the outermost
- - // delegate's handler.
- - if (outermost_contents != this && IsFullscreen() &&
- - event.windows_key_code == ui::VKEY_ESCAPE) {
- - // When an inner WebContents has focus and is fullscreen, redirect <esc>
- - // key events to the outermost WebContents so it can be handled by that
- - // WebContents' delegate.
- - if (outermost_contents->PreHandleKeyboardEvent(event) ==
- - KeyboardEventProcessingResult::HANDLED) {
- +
- + auto handled = delegate_ ? delegate_->PreHandleKeyboardEvent(this, event)
- + : KeyboardEventProcessingResult::NOT_HANDLED;
- +
- + if (IsFullscreen() && event.windows_key_code == ui::VKEY_ESCAPE) {
- + if (handled == KeyboardEventProcessingResult::HANDLED)
- return KeyboardEventProcessingResult::HANDLED;
- +
- + // When an inner WebContents has focus and is fullscreen, traverse through
- + // containing webcontents to any that may handle the escape key.
- + while (auto* outer_web_contents = GetOuterWebContents()) {
- + auto result = outer_web_contents->PreHandleKeyboardEvent(event);
- + if (result == KeyboardEventProcessingResult::HANDLED) {
- + return KeyboardEventProcessingResult::HANDLED;
- + }
- }
- }
- - return delegate_ ? delegate_->PreHandleKeyboardEvent(this, event)
- - : KeyboardEventProcessingResult::NOT_HANDLED;
- +
- + return handled;
- }
-
- bool WebContentsImpl::HandleMouseEvent(const blink::WebMouseEvent& event) {
- @@ -3862,7 +3866,7 @@ void WebContentsImpl::EnterFullscreenMode(
- OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::EnterFullscreenMode");
- DCHECK(CanEnterFullscreenMode(requesting_frame, options));
- DCHECK(requesting_frame->IsActive());
- - DCHECK(ContainsOrIsFocusedWebContents());
- + DCHECK(ContainsOrIsFocusedWebContents() || IsGuest());
-
- // When WebView is the `delegate_` we can end up with VisualProperties changes
- // synchronously. Notify the view ahead so it can handle the transition.
- diff --git a/third_party/blink/renderer/core/fullscreen/fullscreen.cc b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
- index eb1ca15be1502b49b5b864935acbafbd6c75d8aa..1e9c96808cdcbf1131a07f33f36b5666bb9ae1e8 100644
- --- a/third_party/blink/renderer/core/fullscreen/fullscreen.cc
- +++ b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
- @@ -111,7 +111,7 @@ void FullscreenElementChanged(Document& document,
- // is the iframe element for the out-of-process frame that contains the
- // fullscreen element. Hence, it must match :-webkit-full-screen-ancestor.
- if (new_request_type & FullscreenRequestType::kForCrossProcessDescendant) {
- - DCHECK(IsA<HTMLIFrameElement>(new_element));
- + // DCHECK(IsA<HTMLIFrameElement>(new_element));
- new_element->SetContainsFullScreenElement(true);
- }
- new_element->SetContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(
|