Merge pull request #8885 from Snuffleupagus/PDFHistory-followup
Address a couple of edge-cases in the new `PDFHistory` implementation (PR 8775 follow-up)
This commit is contained in:
commit
c8b5ba277a
@ -21,7 +21,7 @@ const HASH_CHANGE_TIMEOUT = 1000; // milliseconds
|
|||||||
// Heuristic value used when adding the current position to the browser history.
|
// Heuristic value used when adding the current position to the browser history.
|
||||||
const POSITION_UPDATED_THRESHOLD = 50;
|
const POSITION_UPDATED_THRESHOLD = 50;
|
||||||
// Heuristic value used when adding a temporary position to the browser history.
|
// Heuristic value used when adding a temporary position to the browser history.
|
||||||
const UPDATE_VIEWAREA_TIMEOUT = 2000; // milliseconds
|
const UPDATE_VIEWAREA_TIMEOUT = 1000; // milliseconds
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {Object} PDFHistoryOptions
|
* @typedef {Object} PDFHistoryOptions
|
||||||
@ -189,6 +189,17 @@ class PDFHistory {
|
|||||||
hash,
|
hash,
|
||||||
page: pageNumber,
|
page: pageNumber,
|
||||||
}, forceReplace);
|
}, forceReplace);
|
||||||
|
|
||||||
|
if (!this._popStateInProgress) {
|
||||||
|
// Prevent the browser history from updating while the new destination is
|
||||||
|
// being scrolled into view, to avoid potentially inconsistent state.
|
||||||
|
this._popStateInProgress = true;
|
||||||
|
// We defer the resetting of `this._popStateInProgress`, to account for
|
||||||
|
// e.g. zooming occuring when the new destination is being navigated to.
|
||||||
|
Promise.resolve().then(() => {
|
||||||
|
this._popStateInProgress = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -358,6 +369,13 @@ class PDFHistory {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_updateInternalState(destination, uid, removeTemporary = false) {
|
_updateInternalState(destination, uid, removeTemporary = false) {
|
||||||
|
if (this._updateViewareaTimeout) {
|
||||||
|
// When updating `this._destination`, make sure that we always wait for
|
||||||
|
// the next 'updateviewarea' event before (potentially) attempting to
|
||||||
|
// push the current position to the browser history.
|
||||||
|
clearTimeout(this._updateViewareaTimeout);
|
||||||
|
this._updateViewareaTimeout = null;
|
||||||
|
}
|
||||||
if (removeTemporary && destination && destination.temporary) {
|
if (removeTemporary && destination && destination.temporary) {
|
||||||
// When the `destination` comes from the browser history,
|
// When the `destination` comes from the browser history,
|
||||||
// we no longer treat it as a *temporary* position.
|
// we no longer treat it as a *temporary* position.
|
||||||
@ -475,34 +493,6 @@ class PDFHistory {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// This case corresponds to navigation backwards in the browser history.
|
|
||||||
if (state.uid < this._currentUid && this._position && this._destination) {
|
|
||||||
let shouldGoBack = false;
|
|
||||||
|
|
||||||
if (this._destination.temporary) {
|
|
||||||
// If the `this._destination` contains a *temporary* position, always
|
|
||||||
// push the `this._position` to the browser history before moving back.
|
|
||||||
this._pushOrReplaceState(this._position);
|
|
||||||
shouldGoBack = true;
|
|
||||||
} else if (this._destination.page &&
|
|
||||||
this._destination.page !== this._position.first &&
|
|
||||||
this._destination.page !== this._position.page) {
|
|
||||||
// If the `page` of the `this._destination` is no longer visible,
|
|
||||||
// push the `this._position` to the browser history before moving back.
|
|
||||||
this._pushOrReplaceState(this._destination);
|
|
||||||
this._pushOrReplaceState(this._position);
|
|
||||||
shouldGoBack = true;
|
|
||||||
}
|
|
||||||
if (shouldGoBack) {
|
|
||||||
// After `window.history.back()`, we must not enter this block on the
|
|
||||||
// resulting 'popstate' event, since that may cause an infinite loop.
|
|
||||||
this._currentUid = state.uid;
|
|
||||||
|
|
||||||
window.history.back();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Navigate to the new destination.
|
// Navigate to the new destination.
|
||||||
let destination = state.destination;
|
let destination = state.destination;
|
||||||
this._updateInternalState(destination, state.uid,
|
this._updateInternalState(destination, state.uid,
|
||||||
|
Loading…
Reference in New Issue
Block a user