diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 177a3395a776..0816cd101896 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -667,7 +667,7 @@ Hides the window. #### `win.isVisible()` -Returns `boolean` - Whether the window is visible to the user. +Returns `boolean` - Whether the window is visible to the user in the foreground of the app. #### `win.isModal()` diff --git a/shell/browser/native_window_mac.mm b/shell/browser/native_window_mac.mm index 0b72d1bf6ba1..cf9173188860 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -491,10 +491,6 @@ void NativeWindowMac::Hide() { bool NativeWindowMac::IsVisible() { bool occluded = [window_ occlusionState] == NSWindowOcclusionStateVisible; - - // For a window to be visible, it must be visible to the user in the - // foreground of the app, which means that it should not be minimized or - // occluded return [window_ isVisible] && !occluded && !IsMinimized(); } diff --git a/shell/browser/native_window_views.cc b/shell/browser/native_window_views.cc index e92247f2a0d7..364da7e82458 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -551,7 +551,17 @@ void NativeWindowViews::Hide() { } bool NativeWindowViews::IsVisible() { +#if BUILDFLAG(IS_WIN) + // widget()->IsVisible() calls ::IsWindowVisible, which returns non-zero if a + // window or any of its parent windows are visible. We want to only check the + // current window. + bool visible = + ::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_VISIBLE; + // WS_VISIBLE is true even if a window is miminized - explicitly check that. + return visible && !IsMinimized(); +#else return widget()->IsVisible(); +#endif } bool NativeWindowViews::IsEnabled() { diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index 902c072e6f5c..0e558e0b0e2e 100644 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -1095,6 +1095,18 @@ describe('BrowserWindow module', () => { }); }); + describe('BrowserWindow.minimize()', () => { + // TODO(codebytere): Enable for Linux once maximize/minimize events work in CI. + ifit(process.platform !== 'linux')('should not be visible when the window is minimized', async () => { + const minimize = once(w, 'minimize'); + w.minimize(); + await minimize; + + expect(w.isMinimized()).to.equal(true); + expect(w.isVisible()).to.equal(false); + }); + }); + describe('BrowserWindow.showInactive()', () => { it('should not focus on window', () => { w.showInactive();