@@ -55,12 +55,14 @@ const overlays: Array<[string, (open: boolean) => ReactElement]> = [
5555
5656afterEach ( ( ) => {
5757 cleanup ( ) ;
58+ Reflect . deleteProperty ( document . documentElement , 'clientWidth' ) ;
5859 document . documentElement . removeAttribute ( 'style' ) ;
5960 document . body . removeAttribute ( 'style' ) ;
6061} ) ;
6162
6263describe . each ( overlays ) ( '%s scroll lock' , ( _name , renderOverlay ) => {
6364 it ( 'locks the page and keeps the scrollbar gutter, then restores both on close' , async ( ) => {
65+ showScrollbar ( 15 ) ;
6466 const { rerender } = render ( renderOverlay ( true ) ) ;
6567 await screen . findByTestId ( 'content' ) ;
6668
@@ -73,6 +75,19 @@ describe.each(overlays)('%s scroll lock', (_name, renderOverlay) => {
7375 expect ( document . documentElement . style . cssText ) . toBe ( '' ) ;
7476 } ) ;
7577
78+ it ( 'locks the page without reserving a gutter when the page shows no scrollbar' , async ( ) => {
79+ showScrollbar ( 0 ) ;
80+ const { rerender } = render ( renderOverlay ( true ) ) ;
81+ await screen . findByTestId ( 'content' ) ;
82+
83+ expect ( document . body . style . overflowY ) . toBe ( 'hidden' ) ;
84+ expect ( document . documentElement . style . scrollbarGutter ) . toBe ( '' ) ;
85+
86+ rerender ( renderOverlay ( false ) ) ;
87+
88+ expect ( document . body . style . cssText ) . toBe ( '' ) ;
89+ } ) ;
90+
7691 it ( 'locks <html> instead of <body> when <html> is the element that scrolls' , async ( ) => {
7792 document . documentElement . style . overflowY = 'auto' ;
7893 const { rerender } = render ( renderOverlay ( true ) ) ;
@@ -122,3 +137,10 @@ describe('select in a dialog', () => {
122137 expect ( document . body . style . cssText ) . toBe ( '' ) ;
123138 } ) ;
124139} ) ;
140+
141+ function showScrollbar ( width : number ) : void {
142+ Object . defineProperty ( document . documentElement , 'clientWidth' , {
143+ configurable : true ,
144+ value : window . innerWidth - width ,
145+ } ) ;
146+ }
0 commit comments