Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: html fullscreen when window not fullscreenable #37368

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 9 additions & 6 deletions shell/browser/api/electron_api_web_contents.cc
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
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
Expand Up @@ -5026,6 +5026,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