@@ -18,6 +18,12 @@ describe('media/camera-control widget', () => {
1818
1919 afterEach ( ( ) => {
2020 document . body . innerHTML = '' ;
21+ delete ( HTMLElement . prototype as { requestFullscreen ?: unknown } ) . requestFullscreen ;
22+ delete ( document as { exitFullscreen ?: unknown } ) . exitFullscreen ;
23+ Object . defineProperty ( document , 'fullscreenElement' , {
24+ configurable : true ,
25+ value : null ,
26+ } ) ;
2127 vi . unstubAllGlobals ( ) ;
2228 } ) ;
2329
@@ -67,6 +73,46 @@ describe('media/camera-control widget', () => {
6773 harness . destroy ( ) ;
6874 } ) ;
6975
76+ it ( 'toggles the camera shell fullscreen state from the toolbar button' , async ( ) => {
77+ const { default : Main } = await import ( './src/index' ) ;
78+ const requestFullscreen = vi . fn ( ) ;
79+ const exitFullscreen = vi . fn ( ) ;
80+ Object . defineProperty ( HTMLElement . prototype , 'requestFullscreen' , {
81+ configurable : true ,
82+ value : requestFullscreen ,
83+ } ) ;
84+ Object . defineProperty ( document , 'exitFullscreen' , {
85+ configurable : true ,
86+ value : exitFullscreen ,
87+ } ) ;
88+ Object . defineProperty ( document , 'fullscreenElement' , {
89+ configurable : true ,
90+ value : null ,
91+ } ) ;
92+
93+ const harness = mountWidget ( Main , { locale : 'en' , mode : 'view' } ) ;
94+ const fullscreenButton = ( ) =>
95+ Array . from ( harness . element . querySelectorAll ( 'button' ) ) . find (
96+ ( button ) => button . title === 'Fullscreen' || button . title === 'Exit fullscreen' ,
97+ ) ;
98+
99+ fullscreenButton ( ) ?. dispatchEvent ( new MouseEvent ( 'click' , { bubbles : true } ) ) ;
100+ expect ( requestFullscreen ) . toHaveBeenCalledTimes ( 1 ) ;
101+
102+ const shell = harness . element . children . item ( 2 ) ;
103+ Object . defineProperty ( document , 'fullscreenElement' , {
104+ configurable : true ,
105+ value : shell ,
106+ } ) ;
107+ document . dispatchEvent ( new Event ( 'fullscreenchange' ) ) ;
108+
109+ expect ( fullscreenButton ( ) ?. title ) . toBe ( 'Exit fullscreen' ) ;
110+ fullscreenButton ( ) ?. dispatchEvent ( new MouseEvent ( 'click' , { bubbles : true } ) ) ;
111+ expect ( exitFullscreen ) . toHaveBeenCalledTimes ( 1 ) ;
112+
113+ harness . destroy ( ) ;
114+ } ) ;
115+
70116 it ( 'emits optional advanced control payloads when enabled' , async ( ) => {
71117 const { default : Main } = await import ( './src/index' ) ;
72118 const emit = vi . fn ( ) ;
0 commit comments