@@ -28,7 +28,7 @@ import * as ElectronMenu from "../electron/ElectronMenu.ts";
2828import * as ElectronShell from "../electron/ElectronShell.ts" ;
2929import * as ElectronTheme from "../electron/ElectronTheme.ts" ;
3030import * as ElectronWindow from "../electron/ElectronWindow.ts" ;
31- import { MENU_ACTION_CHANNEL } from "../ipc/channels.ts" ;
31+ import { MENU_ACTION_CHANNEL , WINDOW_FULLSCREEN_STATE_CHANNEL } from "../ipc/channels.ts" ;
3232import * as DesktopServerExposure from "../backend/DesktopServerExposure.ts" ;
3333import * as DesktopWindow from "./DesktopWindow.ts" ;
3434import * as PreviewManager from "../preview/Manager.ts" ;
@@ -46,6 +46,7 @@ const environmentInput = {
4646} satisfies DesktopEnvironment . MakeDesktopEnvironmentInput ;
4747
4848function makeFakeBrowserWindow ( ) {
49+ const windowListeners = new Map < string , ( ...args : readonly unknown [ ] ) => void > ( ) ;
4950 const webContentsListeners = new Map < string , ( ...args : readonly unknown [ ] ) => void > ( ) ;
5051 const webContents = {
5152 copyImageAt : vi . fn ( ) ,
@@ -66,10 +67,13 @@ function makeFakeBrowserWindow() {
6667 close : vi . fn ( ) ,
6768 focus : vi . fn ( ) ,
6869 isDestroyed : vi . fn ( ( ) => false ) ,
70+ isFullScreen : vi . fn ( ( ) => false ) ,
6971 isMinimized : vi . fn ( ( ) => false ) ,
7072 isVisible : vi . fn ( ( ) => true ) ,
7173 loadURL : vi . fn ( ( ) => Promise . resolve ( ) ) ,
72- on : vi . fn ( ) ,
74+ on : vi . fn ( ( eventName : string , listener : ( ...args : readonly unknown [ ] ) => void ) => {
75+ windowListeners . set ( eventName , listener ) ;
76+ } ) ,
7377 once : vi . fn ( ) ,
7478 restore : vi . fn ( ) ,
7579 setBackgroundColor : vi . fn ( ) ,
@@ -88,6 +92,7 @@ function makeFakeBrowserWindow() {
8892 send : webContents . send ,
8993 setAutoHideCursor : window . setAutoHideCursor ,
9094 webContentsListeners,
95+ windowListeners,
9196 } ;
9297}
9398
@@ -338,6 +343,37 @@ describe("DesktopWindow", () => {
338343 } ) ,
339344 ) ;
340345
346+ it . effect ( "publishes native macOS fullscreen changes to the renderer" , ( ) =>
347+ Effect . gen ( function * ( ) {
348+ const fakeWindow = makeFakeBrowserWindow ( ) ;
349+ const createCount = yield * Ref . make ( 0 ) ;
350+ const mainWindow = yield * Ref . make < Option . Option < Electron . BrowserWindow > > ( Option . none ( ) ) ;
351+ const layer = makeTestLayer ( {
352+ window : fakeWindow . window ,
353+ createCount,
354+ mainWindow,
355+ } ) ;
356+
357+ yield * Effect . gen ( function * ( ) {
358+ const desktopWindow = yield * DesktopWindow . DesktopWindow ;
359+ yield * desktopWindow . handleBackendReady ( new URL ( "http://127.0.0.1:3773" ) ) ;
360+
361+ const enterFullscreen = fakeWindow . windowListeners . get ( "enter-full-screen" ) ;
362+ const leaveFullscreen = fakeWindow . windowListeners . get ( "leave-full-screen" ) ;
363+ if ( ! enterFullscreen || ! leaveFullscreen ) {
364+ return yield * Effect . die ( "fullscreen listeners were not registered" ) ;
365+ }
366+
367+ enterFullscreen ( ) ;
368+ leaveFullscreen ( ) ;
369+ assert . deepEqual ( fakeWindow . send . mock . calls , [
370+ [ WINDOW_FULLSCREEN_STATE_CHANNEL , true ] ,
371+ [ WINDOW_FULLSCREEN_STATE_CHANNEL , false ] ,
372+ ] ) ;
373+ } ) . pipe ( Effect . provide ( layer ) ) ;
374+ } ) ,
375+ ) ;
376+
341377 it . effect ( "recovers when the development renderer is temporarily unreachable" , ( ) =>
342378 Effect . gen ( function * ( ) {
343379 const fakeWindow = makeFakeBrowserWindow ( ) ;
0 commit comments