@@ -4299,6 +4299,8 @@ describe('BrowserWindow module', () => {
42994299 } ) ;
43004300
43014301 ifdescribe ( process . platform === 'darwin' ) ( 'fullscreen state' , ( ) => {
4302+ afterEach ( closeAllWindows ) ;
4303+
43024304 it ( 'should not cause a crash if called when exiting fullscreen' , async ( ) => {
43034305 const w = new BrowserWindow ( ) ;
43044306
@@ -4348,19 +4350,80 @@ describe('BrowserWindow module', () => {
43484350 expect ( w . isFullScreen ( ) ) . to . be . false ( 'is fullscreen' ) ;
43494351 } ) ;
43504352
4353+ it ( 'handles several HTML fullscreen transitions' , async ( ) => {
4354+ const w = new BrowserWindow ( ) ;
4355+ await w . loadFile ( path . join ( fixtures , 'pages' , 'a.html' ) ) ;
4356+
4357+ expect ( w . isFullScreen ( ) ) . to . be . false ( 'is fullscreen' ) ;
4358+
4359+ const enterFullScreen = emittedOnce ( w , 'enter-full-screen' ) ;
4360+ const leaveFullScreen = emittedOnce ( w , 'leave-full-screen' ) ;
4361+
4362+ await w . webContents . executeJavaScript ( 'document.getElementById("div").requestFullscreen()' , true ) ;
4363+ await enterFullScreen ;
4364+ await w . webContents . executeJavaScript ( 'document.exitFullscreen()' , true ) ;
4365+ await leaveFullScreen ;
4366+
4367+ expect ( w . isFullScreen ( ) ) . to . be . false ( 'is fullscreen' ) ;
4368+
4369+ await delay ( ) ;
4370+
4371+ await w . webContents . executeJavaScript ( 'document.getElementById("div").requestFullscreen()' , true ) ;
4372+ await enterFullScreen ;
4373+ await w . webContents . executeJavaScript ( 'document.exitFullscreen()' , true ) ;
4374+ await leaveFullScreen ;
4375+
4376+ expect ( w . isFullScreen ( ) ) . to . be . false ( 'is fullscreen' ) ;
4377+ } ) ;
4378+
43514379 it ( 'handles several transitions in close proximity' , async ( ) => {
43524380 const w = new BrowserWindow ( ) ;
43534381
43544382 expect ( w . isFullScreen ( ) ) . to . be . false ( 'is fullscreen' ) ;
43554383
4384+ const enterFS = emittedNTimes ( w , 'enter-full-screen' , 2 ) ;
4385+ const leaveFS = emittedNTimes ( w , 'leave-full-screen' , 2 ) ;
4386+
43564387 w . setFullScreen ( true ) ;
43574388 w . setFullScreen ( false ) ;
43584389 w . setFullScreen ( true ) ;
4390+ w . setFullScreen ( false ) ;
43594391
4360- const enterFullScreen = emittedNTimes ( w , 'enter-full-screen' , 2 ) ;
4361- await enterFullScreen ;
4392+ await Promise . all ( [ enterFS , leaveFS ] ) ;
43624393
4363- expect ( w . isFullScreen ( ) ) . to . be . true ( 'not fullscreen' ) ;
4394+ expect ( w . isFullScreen ( ) ) . to . be . false ( 'not fullscreen' ) ;
4395+ } ) ;
4396+
4397+ it ( 'handles several chromium-initiated transitions in close proximity' , async ( ) => {
4398+ const w = new BrowserWindow ( ) ;
4399+ await w . loadFile ( path . join ( fixtures , 'pages' , 'a.html' ) ) ;
4400+
4401+ expect ( w . isFullScreen ( ) ) . to . be . false ( 'is fullscreen' ) ;
4402+
4403+ let enterCount = 0 ;
4404+ let exitCount = 0 ;
4405+
4406+ const done = new Promise < void > ( resolve => {
4407+ const checkDone = ( ) => {
4408+ if ( enterCount === 2 && exitCount === 2 ) resolve ( ) ;
4409+ } ;
4410+
4411+ w . webContents . on ( 'enter-html-full-screen' , ( ) => {
4412+ enterCount ++ ;
4413+ checkDone ( ) ;
4414+ } ) ;
4415+
4416+ w . webContents . on ( 'leave-html-full-screen' , ( ) => {
4417+ exitCount ++ ;
4418+ checkDone ( ) ;
4419+ } ) ;
4420+ } ) ;
4421+
4422+ await w . webContents . executeJavaScript ( 'document.getElementById("div").requestFullscreen()' , true ) ;
4423+ await w . webContents . executeJavaScript ( 'document.exitFullscreen()' ) ;
4424+ await w . webContents . executeJavaScript ( 'document.getElementById("div").requestFullscreen()' , true ) ;
4425+ await w . webContents . executeJavaScript ( 'document.exitFullscreen()' ) ;
4426+ await done ;
43644427 } ) ;
43654428
43664429 it ( 'does not crash when exiting simpleFullScreen (properties)' , async ( ) => {
0 commit comments