@@ -20,9 +20,20 @@ vi.mock("./utils/store", () => ({
2020import { adjustWindowZoom , restoreWindowZoom , setupWindowZoom } from "./zoom" ;
2121
2222class FakeWebContents extends EventEmitter {
23+ public destroyed = false ;
24+ public readonly setZoomLevelCalls : number [ ] = [ ] ;
2325 public zoomLevel = 0 ;
2426
27+ public isDestroyed ( ) : boolean {
28+ return this . destroyed ;
29+ }
30+
31+ public getZoomLevel ( ) : number {
32+ return this . zoomLevel ;
33+ }
34+
2535 public setZoomLevel ( level : number ) : void {
36+ this . setZoomLevelCalls . push ( level ) ;
2637 this . zoomLevel = level ;
2738 }
2839}
@@ -85,6 +96,30 @@ describe("window zoom", () => {
8596 expect ( window . webContents . zoomLevel ) . toBe ( 0.5 ) ;
8697 } ) ;
8798
99+ it ( "restores the current level after an external window resize" , ( ) => {
100+ const window = createWindow ( ) ;
101+ setupWindowZoom ( window ) ;
102+
103+ window . webContents . emit ( "zoom-changed" , { preventDefault : vi . fn ( ) } , "in" ) ;
104+ vi . runAllTimers ( ) ;
105+ window . webContents . zoomLevel = 0 ;
106+
107+ window . emit ( "resize" ) ;
108+ vi . runAllTimers ( ) ;
109+ const restoredZoomLevel = window . webContents . zoomLevel ;
110+ adjustWindowZoom ( window , 0.5 ) ;
111+
112+ expect ( {
113+ restoredZoomLevel,
114+ zoomLevel : window . webContents . zoomLevel ,
115+ saved : store . save . mock . calls ,
116+ } ) . toEqual ( {
117+ restoredZoomLevel : 1 ,
118+ zoomLevel : 1.5 ,
119+ saved : [ [ 1 ] , [ 1.5 ] ] ,
120+ } ) ;
121+ } ) ;
122+
88123 it . each ( [
89124 [ "in" , 1 ] ,
90125 [ "out" , 0 ] ,
@@ -110,20 +145,70 @@ describe("window zoom", () => {
110145 } ,
111146 ) ;
112147
113- it ( "keeps wheel zoom after resizing" , ( ) => {
148+ it . each ( [ "resize" , "resized" ] as const ) (
149+ "keeps wheel zoom after %s" ,
150+ ( resizeEvent ) => {
151+ const window = createWindow ( ) ;
152+ setupWindowZoom ( window ) ;
153+
154+ window . webContents . emit (
155+ "zoom-changed" ,
156+ { preventDefault : vi . fn ( ) } ,
157+ "in" ,
158+ ) ;
159+ window . emit ( resizeEvent ) ;
160+ vi . runAllTimers ( ) ;
161+
162+ expect ( {
163+ zoomLevel : window . webContents . zoomLevel ,
164+ saved : store . save . mock . calls ,
165+ } ) . toEqual ( {
166+ zoomLevel : 1 ,
167+ saved : [ [ 1 ] ] ,
168+ } ) ;
169+ } ,
170+ ) ;
171+
172+ it ( "skips redundant restoration during a resize storm" , ( ) => {
173+ const window = createWindow ( ) ;
174+ setupWindowZoom ( window ) ;
175+ window . webContents . zoomLevel = 0.5 ;
176+
177+ window . emit ( "resize" ) ;
178+ vi . runAllTimers ( ) ;
179+ vi . advanceTimersByTime ( 16 ) ;
180+ window . emit ( "resize" ) ;
181+ vi . runAllTimers ( ) ;
182+ const callsBeforeReset = [ ...window . webContents . setZoomLevelCalls ] ;
183+
184+ window . webContents . zoomLevel = 0 ;
185+ window . emit ( "resize" ) ;
186+ vi . runAllTimers ( ) ;
187+
188+ expect ( {
189+ callsBeforeReset,
190+ callsAfterReset : window . webContents . setZoomLevelCalls ,
191+ } ) . toEqual ( {
192+ callsBeforeReset : [ ] ,
193+ callsAfterReset : [ 0.5 ] ,
194+ } ) ;
195+ } ) ;
196+
197+ it ( "ignores queued zoom work after the window is destroyed" , ( ) => {
114198 const window = createWindow ( ) ;
115199 setupWindowZoom ( window ) ;
116200
117201 window . webContents . emit ( "zoom-changed" , { preventDefault : vi . fn ( ) } , "in" ) ;
118- window . emit ( "resized" ) ;
202+ window . emit ( "resize" ) ;
203+ window . webContents . destroyed = true ;
119204 vi . runAllTimers ( ) ;
120205
121206 expect ( {
122- zoomLevel : window . webContents . zoomLevel ,
207+ zoomLevelCalls : window . webContents . setZoomLevelCalls ,
123208 saved : store . save . mock . calls ,
124209 } ) . toEqual ( {
125- zoomLevel : 1 ,
126- saved : [ [ 1 ] ] ,
210+ zoomLevelCalls : [ ] ,
211+ saved : [ ] ,
127212 } ) ;
128213 } ) ;
129214
0 commit comments