@@ -127,28 +127,31 @@ function useHistoryListeners(
127
127
}
128
128
129
129
function beforeUnloadListener ( ) {
130
- const { history } = window
131
- if ( ! history . state ) return
132
- history . replaceState (
133
- assign ( { } , history . state , { scroll : computeScrollPosition ( ) } ) ,
134
- ''
135
- )
130
+ if ( document . visibilityState === 'hidden' ) {
131
+ const { history } = window
132
+ if ( ! history . state ) return
133
+ history . replaceState (
134
+ assign ( { } , history . state , { scroll : computeScrollPosition ( ) } ) ,
135
+ ''
136
+ )
137
+ }
136
138
}
137
139
138
140
function destroy ( ) {
139
141
for ( const teardown of teardowns ) teardown ( )
140
142
teardowns = [ ]
141
143
window . removeEventListener ( 'popstate' , popStateHandler )
142
- window . removeEventListener ( 'beforeunload' , beforeUnloadListener )
144
+ window . removeEventListener ( 'pagehide' , beforeUnloadListener )
145
+ document . removeEventListener ( 'visibilitychange' , beforeUnloadListener )
143
146
}
144
147
145
148
// set up the listeners and prepare teardown callbacks
146
149
window . addEventListener ( 'popstate' , popStateHandler )
147
- // TODO: could we use 'pagehide' or 'visibilitychange' instead?
148
150
// https://developer.chrome.com/blog/page-lifecycle-api/
149
- window . addEventListener ( 'beforeunload' , beforeUnloadListener , {
150
- passive : true ,
151
- } )
151
+ // note: iOS safari does not fire beforeunload, so we
152
+ // use pagehide and visibilitychange instead
153
+ window . addEventListener ( 'pagehide' , beforeUnloadListener )
154
+ document . addEventListener ( 'visibilitychange' , beforeUnloadListener )
152
155
153
156
return {
154
157
pauseListeners,
0 commit comments