Browse Source

fix: html fullscreen when window not fullscreenable (#37368)

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 2 years ago
parent
commit
de5ee7e60e

+ 9 - 6
shell/browser/api/electron_api_web_contents.cc

@@ -1307,7 +1307,10 @@ Profile* WebContents::GetProfile() {
 }
 
 bool WebContents::IsFullscreen() const {
-  return owner_window_ && owner_window_->IsFullscreen();
+  if (!owner_window())
+    return false;
+
+  return owner_window()->IsFullscreen() || is_html_fullscreen();
 }
 
 void WebContents::EnterFullscreen(const GURL& url,
@@ -1353,7 +1356,7 @@ void WebContents::OnEnterFullscreenModeForTab(
     content::RenderFrameHost* requesting_frame,
     const blink::mojom::FullscreenOptions& options,
     bool allowed) {
-  if (!allowed || !owner_window_)
+  if (!allowed || !owner_window())
     return;
 
   auto* source = content::WebContents::FromRenderFrameHost(requesting_frame);
@@ -1377,7 +1380,7 @@ void WebContents::OnEnterFullscreenModeForTab(
 }
 
 void WebContents::ExitFullscreenModeForTab(content::WebContents* source) {
-  if (!owner_window_)
+  if (!owner_window())
     return;
 
   // This needs to be called before we exit fullscreen on the native window,
@@ -3582,14 +3585,14 @@ void WebContents::EnumerateDirectory(
 bool WebContents::IsFullscreenForTabOrPending(
     const content::WebContents* source) {
   if (!owner_window())
-    return html_fullscreen_;
+    return is_html_fullscreen();
 
   bool in_transition = owner_window()->fullscreen_transition_state() !=
                        NativeWindow::FullScreenTransitionState::NONE;
   bool is_html_transition = owner_window()->fullscreen_transition_type() ==
                             NativeWindow::FullScreenTransitionType::HTML;
 
-  return html_fullscreen_ || (in_transition && is_html_transition);
+  return is_html_fullscreen() || (in_transition && is_html_transition);
 }
 
 bool WebContents::TakeFocus(content::WebContents* source, bool reverse) {
@@ -3879,7 +3882,7 @@ void WebContents::OnDevToolsSearchCompleted(
 
 void WebContents::SetHtmlApiFullscreen(bool enter_fullscreen) {
   // Window is already in fullscreen mode, save the state.
-  if (enter_fullscreen && owner_window_->IsFullscreen()) {
+  if (enter_fullscreen && owner_window()->IsFullscreen()) {
     native_fullscreen_ = true;
     UpdateHtmlApiFullscreen(true);
     return;

+ 1 - 1
shell/browser/native_window_mac.mm

@@ -619,7 +619,7 @@ void NativeWindowMac::SetFullScreen(bool fullscreen) {
     return;
   }
 
-  if (fullscreen == IsFullscreen())
+  if (fullscreen == IsFullscreen() || !IsFullScreenable())
     return;
 
   // Take note of the current window size

+ 36 - 0
spec/api-browser-window-spec.ts

@@ -5044,6 +5044,42 @@ describe('BrowserWindow module', () => {
         await done;
       });
 
+      it('handles HTML fullscreen transitions when fullscreenable is false', async () => {
+        const w = new BrowserWindow({ fullscreenable: false });
+        await w.loadFile(path.join(fixtures, 'pages', 'a.html'));
+
+        expect(w.isFullScreen()).to.be.false('is fullscreen');
+
+        let enterCount = 0;
+        let exitCount = 0;
+
+        const done = new Promise<void>((resolve, reject) => {
+          const checkDone = () => {
+            if (enterCount === 2 && exitCount === 2) resolve();
+          };
+
+          w.webContents.on('enter-html-full-screen', async () => {
+            enterCount++;
+            if (w.isFullScreen()) reject(new Error('w.isFullScreen should be false'));
+            const isFS = await w.webContents.executeJavaScript('!!document.fullscreenElement');
+            if (!isFS) reject(new Error('Document should have fullscreen element'));
+            checkDone();
+          });
+
+          w.webContents.on('leave-html-full-screen', () => {
+            exitCount++;
+            if (w.isFullScreen()) reject(new Error('w.isFullScreen should be false'));
+            checkDone();
+          });
+        });
+
+        await w.webContents.executeJavaScript('document.getElementById("div").requestFullscreen()', true);
+        await w.webContents.executeJavaScript('document.exitFullscreen()');
+        await w.webContents.executeJavaScript('document.getElementById("div").requestFullscreen()', true);
+        await w.webContents.executeJavaScript('document.exitFullscreen()');
+        await expect(done).to.eventually.be.fulfilled();
+      });
+
       it('does not crash when exiting simpleFullScreen (properties)', async () => {
         const w = new BrowserWindow();
         w.setSimpleFullScreen(true);