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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user