Skip to content

Commit

Permalink
fix: html fullscreen when window not fullscreenable (#37368)
Browse files Browse the repository at this point in the history
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
  • Loading branch information
trop[bot] and codebytere committed Feb 21, 2023
1 parent 8580268 commit de5ee7e
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 7 deletions.
15 changes: 9 additions & 6 deletions shell/browser/api/electron_api_web_contents.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand All @@ -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,
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion shell/browser/native_window_mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ void ViewDidMoveToSuperview(NSView* self, SEL _cmd) {
return;
}

if (fullscreen == IsFullscreen())
if (fullscreen == IsFullscreen() || !IsFullScreenable())
return;

// Take note of the current window size
Expand Down
36 changes: 36 additions & 0 deletions spec/api-browser-window-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit de5ee7e

Please sign in to comment.