From a9a90fa1b689b8831136423bc104968aa3b6621e Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 17 Aug 2021 09:03:45 +0200 Subject: [PATCH] fix: {exit|enter}-html-fullscreen emitted after esc in webview (#30537) --- .../browser/api/electron_api_web_contents.cc | 23 +++++++++------ spec-main/webview-spec.ts | 28 +++++++++++++++++++ spec/fixtures/pages/a.html | 1 + 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index f785fdd38c..6bf1cf2207 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -1239,31 +1239,29 @@ void WebContents::OnEnterFullscreenModeForTab( content::RenderFrameHost* requesting_frame, const blink::mojom::FullscreenOptions& options, bool allowed) { - if (!allowed) - return; - if (!owner_window_) + if (!allowed || !owner_window_) return; + auto* source = content::WebContents::FromRenderFrameHost(requesting_frame); if (IsFullscreenForTabOrPending(source)) { DCHECK_EQ(fullscreen_frame_, source->GetFocusedFrame()); return; } + SetHtmlApiFullscreen(true); - owner_window_->NotifyWindowEnterHtmlFullScreen(); if (native_fullscreen_) { // Explicitly trigger a view resize, as the size is not actually changing if // the browser is fullscreened, too. source->GetRenderViewHost()->GetWidget()->SynchronizeVisualProperties(); } - Emit("enter-html-full-screen"); } void WebContents::ExitFullscreenModeForTab(content::WebContents* source) { if (!owner_window_) return; + SetHtmlApiFullscreen(false); - owner_window_->NotifyWindowLeaveHtmlFullScreen(); if (native_fullscreen_) { // Explicitly trigger a view resize, as the size is not actually changing if @@ -1271,7 +1269,6 @@ void WebContents::ExitFullscreenModeForTab(content::WebContents* source) { // `chrome/browser/ui/exclusive_access/fullscreen_controller.cc`. source->GetRenderViewHost()->GetWidget()->SynchronizeVisualProperties(); } - Emit("leave-html-full-screen"); } void WebContents::RendererUnresponsive( @@ -3564,7 +3561,7 @@ void WebContents::SetHtmlApiFullscreen(bool enter_fullscreen) { } void WebContents::UpdateHtmlApiFullscreen(bool fullscreen) { - if (fullscreen == html_fullscreen_) + if (fullscreen == is_html_fullscreen()) return; html_fullscreen_ = fullscreen; @@ -3575,11 +3572,19 @@ void WebContents::UpdateHtmlApiFullscreen(bool fullscreen) { ->GetWidget() ->SynchronizeVisualProperties(); - // The embedder WebContents is spearated from the frame tree of webview, so + // The embedder WebContents is separated from the frame tree of webview, so // we must manually sync their fullscreen states. if (embedder_) embedder_->SetHtmlApiFullscreen(fullscreen); + if (fullscreen) { + Emit("enter-html-full-screen"); + owner_window_->NotifyWindowEnterHtmlFullScreen(); + } else { + Emit("leave-html-full-screen"); + owner_window_->NotifyWindowLeaveHtmlFullScreen(); + } + // Make sure all child webviews quit html fullscreen. if (!fullscreen && !IsGuest()) { auto* manager = WebViewManager::GetWebViewManager(web_contents()); diff --git a/spec-main/webview-spec.ts b/spec-main/webview-spec.ts index 85c9f547f2..abf31f4f3e 100644 --- a/spec-main/webview-spec.ts +++ b/spec-main/webview-spec.ts @@ -456,6 +456,34 @@ describe(' tag', function () { await delay(0); expect(w.isFullScreen()).to.be.false(); }); + + it('pressing ESC should emit the leave-html-full-screen event', async () => { + const w = new BrowserWindow({ + show: false, + webPreferences: { + webviewTag: true, + nodeIntegration: true, + contextIsolation: false + } + }); + + const didAttachWebview = emittedOnce(w.webContents, 'did-attach-webview'); + w.loadFile(path.join(fixtures, 'pages', 'webview-did-attach-event.html')); + + const [, webContents] = await didAttachWebview; + + const enterFSWindow = emittedOnce(w, 'enter-html-full-screen'); + const enterFSWebview = emittedOnce(webContents, 'enter-html-full-screen'); + await webContents.executeJavaScript('document.getElementById("div").requestFullscreen()', true); + await enterFSWindow; + await enterFSWebview; + + const leaveFSWindow = emittedOnce(w, 'leave-html-full-screen'); + const leaveFSWebview = emittedOnce(webContents, 'leave-html-full-screen'); + webContents.sendInputEvent({ type: 'keyDown', keyCode: 'Escape' }); + await leaveFSWindow; + await leaveFSWebview; + }); }); describe('nativeWindowOpen option', () => { diff --git a/spec/fixtures/pages/a.html b/spec/fixtures/pages/a.html index 675d81e97b..060841461d 100644 --- a/spec/fixtures/pages/a.html +++ b/spec/fixtures/pages/a.html @@ -3,6 +3,7 @@ +
Hello World