@@ -17,6 +17,7 @@ const {
1717 nativeAppByPidMock,
1818 nativeAppListMock,
1919 shellHostedForegroundMock,
20+ startWindowsForegroundFocusThreadMock,
2021 windowsForegroundFocusMock,
2122 windowsForegroundPrepareMock,
2223 windowsForegroundCloseMock,
@@ -30,6 +31,7 @@ const {
3031 nativeAppByPidMock : vi . fn ( ) ,
3132 nativeAppListMock : vi . fn ( ) ,
3233 shellHostedForegroundMock : vi . fn ( ) ,
34+ startWindowsForegroundFocusThreadMock : vi . fn ( ) ,
3335 windowsForegroundFocusMock : vi . fn ( ) ,
3436 windowsForegroundPrepareMock : vi . fn ( ) ,
3537 windowsForegroundCloseMock : vi . fn ( ) ,
@@ -43,11 +45,7 @@ vi.mock("./WindowsForeground.ts", () => ({
4345} ) ) ;
4446
4547vi . mock ( "./WindowsForegroundFocusThread.ts" , ( ) => ( {
46- startWindowsForegroundFocusThread : ( ) => ( {
47- prepare : windowsForegroundPrepareMock ,
48- focus : windowsForegroundFocusMock ,
49- close : windowsForegroundCloseMock ,
50- } ) ,
48+ startWindowsForegroundFocusThread : startWindowsForegroundFocusThreadMock ,
5149} ) ) ;
5250
5351vi . mock ( "@crowecawcaw/xa11y" , ( ) => ( {
@@ -110,6 +108,11 @@ describe("ElectronWindow", () => {
110108 nativeAppByPidMock . mockReset ( ) ;
111109 nativeAppListMock . mockReset ( ) . mockResolvedValue ( [ ] ) ;
112110 shellHostedForegroundMock . mockReset ( ) . mockResolvedValue ( false ) ;
111+ startWindowsForegroundFocusThreadMock . mockReset ( ) . mockReturnValue ( {
112+ prepare : windowsForegroundPrepareMock ,
113+ focus : windowsForegroundFocusMock ,
114+ close : windowsForegroundCloseMock ,
115+ } ) ;
113116 windowsForegroundFocusMock . mockReset ( ) . mockResolvedValue ( false ) ;
114117 windowsForegroundPrepareMock . mockReset ( ) . mockResolvedValue ( false ) ;
115118 windowsForegroundCloseMock . mockReset ( ) ;
@@ -261,6 +264,7 @@ describe("ElectronWindow", () => {
261264 focus : vi . fn ( ( ) => operations . push ( "focus" ) ) ,
262265 } as unknown as Electron . BrowserWindow ;
263266 const electronWindow = yield * ElectronWindow . ElectronWindow ;
267+ yield * electronWindow . prepareReveal ( window ) ;
264268
265269 yield * electronWindow . reveal ( window ) ;
266270
@@ -337,6 +341,7 @@ describe("ElectronWindow", () => {
337341 } as unknown as Electron . BrowserWindow ;
338342
339343 const electronWindow = yield * ElectronWindow . ElectronWindow ;
344+ yield * electronWindow . prepareReveal ( window ) ;
340345 const revealFiber = yield * electronWindow . reveal ( window ) . pipe (
341346 Effect . andThen (
342347 Effect . sync ( ( ) => {
@@ -391,6 +396,7 @@ describe("ElectronWindow", () => {
391396 } as unknown as Electron . BrowserWindow ;
392397 appFocusMock . mockImplementation ( ( ) => operations . push ( "app-focus" ) ) ;
393398 const electronWindow = yield * ElectronWindow . ElectronWindow ;
399+ yield * electronWindow . prepareReveal ( window ) ;
394400
395401 yield * electronWindow . reveal ( window ) ;
396402
@@ -459,6 +465,8 @@ describe("ElectronWindow", () => {
459465 window . getNativeWindowHandle . mockReturnValue ( handle ) ;
460466 activeWindowMock . mockResolvedValue ( { id : hwnd , owner : { processId : process . pid } } ) ;
461467 const electronWindow = yield * ElectronWindow . ElectronWindow ;
468+ yield * electronWindow . prepareReveal ( window as unknown as Electron . BrowserWindow ) ;
469+ window . getTitle . mockClear ( ) ;
462470
463471 yield * electronWindow . reveal ( window as unknown as Electron . BrowserWindow ) ;
464472
@@ -488,6 +496,7 @@ describe("ElectronWindow", () => {
488496 } ,
489497 ] ) ;
490498 const electronWindow = yield * ElectronWindow . ElectronWindow ;
499+ yield * electronWindow . prepareReveal ( window as unknown as Electron . BrowserWindow ) ;
491500
492501 yield * electronWindow . reveal ( window as unknown as Electron . BrowserWindow ) ;
493502
@@ -510,6 +519,7 @@ describe("ElectronWindow", () => {
510519 } ,
511520 ] ) ;
512521 const electronWindow = yield * ElectronWindow . ElectronWindow ;
522+ yield * electronWindow . prepareReveal ( window as unknown as Electron . BrowserWindow ) ;
513523
514524 yield * electronWindow . reveal ( window as unknown as Electron . BrowserWindow ) ;
515525
@@ -533,6 +543,7 @@ describe("ElectronWindow", () => {
533543 } ,
534544 ] ) ;
535545 const electronWindow = yield * ElectronWindow . ElectronWindow ;
546+ yield * electronWindow . prepareReveal ( window as unknown as Electron . BrowserWindow ) ;
536547
537548 yield * electronWindow . reveal ( window as unknown as Electron . BrowserWindow ) ;
538549
@@ -546,6 +557,7 @@ describe("ElectronWindow", () => {
546557 const window = makeWindowsRevealWindow ( ) ;
547558 activateWindowsForegroundMock . mockRejectedValue ( cause ) ;
548559 const electronWindow = yield * ElectronWindow . ElectronWindow ;
560+ yield * electronWindow . prepareReveal ( window as unknown as Electron . BrowserWindow ) ;
549561
550562 const exit = yield * Effect . exit (
551563 electronWindow . reveal ( window as unknown as Electron . BrowserWindow ) ,
@@ -578,6 +590,8 @@ describe("ElectronWindow", () => {
578590 return foreground . promise ;
579591 } ) ;
580592 const electronWindow = yield * ElectronWindow . ElectronWindow ;
593+ yield * electronWindow . prepareReveal ( window as unknown as Electron . BrowserWindow ) ;
594+ window . getTitle . mockClear ( ) ;
581595
582596 const revealFiber = yield * electronWindow
583597 . reveal ( window as unknown as Electron . BrowserWindow )
@@ -610,6 +624,7 @@ describe("ElectronWindow", () => {
610624 new Error ( "Windows initially refused foreground activation" ) ,
611625 ) ;
612626 const electronWindow = yield * ElectronWindow . ElectronWindow ;
627+ yield * electronWindow . prepareReveal ( window as unknown as Electron . BrowserWindow ) ;
613628
614629 const revealFiber = yield * electronWindow
615630 . reveal ( window as unknown as Electron . BrowserWindow )
@@ -684,9 +699,49 @@ describe("ElectronWindow", () => {
684699 assert . equal ( vi . mocked ( laterWindow . destroy ) . mock . calls . length , 1 ) ;
685700 } ) . pipe ( Effect . provide ( TestLayer ) ) ,
686701 ) ;
687- it . effect ( "closes the Windows focus worker when its layer is released" , ( ) =>
702+ it . effect ( "an ordinary reveal on Windows does not touch the Win32 foreground helpers" , ( ) =>
703+ Effect . gen ( function * ( ) {
704+ const window = makeWindowsRevealWindow ( ) ;
705+ const electronWindow = yield * ElectronWindow . ElectronWindow ;
706+
707+ yield * electronWindow . reveal ( window as unknown as Electron . BrowserWindow ) ;
708+
709+ assert . lengthOf ( activateWindowsForegroundMock . mock . calls , 0 ) ;
710+ assert . lengthOf ( windowsForegroundFocusMock . mock . calls , 0 ) ;
711+ assert . lengthOf ( shellHostedForegroundMock . mock . calls , 0 ) ;
712+ assert . lengthOf ( startWindowsForegroundFocusThreadMock . mock . calls , 0 ) ;
713+ assert . lengthOf ( window . focus . mock . calls , 1 ) ;
714+ } ) . pipe ( Effect . provide ( testLayer ( "win32" ) ) ) ,
715+ ) ;
716+
717+ it . effect ( "a capture reveal on Windows uses the Win32 path only once" , ( ) =>
718+ Effect . gen ( function * ( ) {
719+ const window = makeWindowsRevealWindow ( ) ;
720+ const electronWindow = yield * ElectronWindow . ElectronWindow ;
721+
722+ yield * electronWindow . prepareReveal ( window as unknown as Electron . BrowserWindow ) ;
723+ yield * electronWindow . reveal ( window as unknown as Electron . BrowserWindow ) ;
724+ yield * electronWindow . reveal ( window as unknown as Electron . BrowserWindow ) ;
725+
726+ assert . lengthOf ( activateWindowsForegroundMock . mock . calls , 1 ) ;
727+ assert . lengthOf ( window . focus . mock . calls , 2 ) ;
728+ } ) . pipe ( Effect . provide ( testLayer ( "win32" ) ) ) ,
729+ ) ;
730+
731+ it . effect ( "starts the Windows focus worker lazily and closes it with the layer" , ( ) =>
688732 Effect . gen ( function * ( ) {
689733 yield * ElectronWindow . ElectronWindow . pipe ( Effect . provide ( testLayer ( "win32" ) ) ) ;
734+ assert . lengthOf ( startWindowsForegroundFocusThreadMock . mock . calls , 0 ) ;
735+ assert . lengthOf ( windowsForegroundCloseMock . mock . calls , 0 ) ;
736+
737+ yield * Effect . gen ( function * ( ) {
738+ const electronWindow = yield * ElectronWindow . ElectronWindow ;
739+ const window = makeWindowsRevealWindow ( ) as unknown as Electron . BrowserWindow ;
740+ yield * electronWindow . prepareReveal ( window ) ;
741+ yield * electronWindow . prepareReveal ( window ) ;
742+ assert . lengthOf ( startWindowsForegroundFocusThreadMock . mock . calls , 1 ) ;
743+ assert . lengthOf ( windowsForegroundCloseMock . mock . calls , 0 ) ;
744+ } ) . pipe ( Effect . provide ( testLayer ( "win32" ) ) ) ;
690745 assert . lengthOf ( windowsForegroundCloseMock . mock . calls , 1 ) ;
691746 } ) ,
692747 ) ;
0 commit comments