@@ -19,28 +19,19 @@ export interface OnHiddenCallback {
19
19
( event : Event ) : void ;
20
20
}
21
21
22
- let beforeUnloadFixAdded = false ;
23
22
24
23
export const onHidden = ( cb : OnHiddenCallback , once ?: boolean ) => {
25
- // Adding a `beforeunload` listener is needed to fix this bug:
26
- // https://bugs.chromium.org/p/chromium/issues/detail?id=987409
27
- if ( ! beforeUnloadFixAdded &&
28
- // Avoid adding this in Firefox as it'll break bfcache:
29
- // https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser
30
- // @ts -ignore
31
- typeof InstallTrigger === 'undefined' ) {
32
- // eslint-disable-next-line @typescript-eslint/no-empty-function
33
- addEventListener ( 'beforeunload' , ( ) => { } ) ;
34
- beforeUnloadFixAdded = true ;
35
- }
36
-
37
- const onVisibilityChange = ( event : Event ) => {
38
- if ( document . visibilityState === 'hidden' ) {
24
+ const onHiddenOrPageHide = ( event : Event ) => {
25
+ if ( event . type === 'pagehide' || document . visibilityState === 'hidden' ) {
39
26
cb ( event ) ;
40
27
if ( once ) {
41
- removeEventListener ( 'visibilitychange' , onVisibilityChange , true ) ;
28
+ removeEventListener ( 'visibilitychange' , onHiddenOrPageHide , true ) ;
29
+ removeEventListener ( 'pagehide' , onHiddenOrPageHide , true ) ;
42
30
}
43
31
}
44
32
}
45
- addEventListener ( 'visibilitychange' , onVisibilityChange , true ) ;
33
+ addEventListener ( 'visibilitychange' , onHiddenOrPageHide , true ) ;
34
+ // Some browsers have buggy implementations of visibilitychange,
35
+ // so we use pagehide in addition, just to be safe.
36
+ addEventListener ( 'pagehide' , onHiddenOrPageHide , true ) ;
46
37
} ;
0 commit comments