Merge pull request #8339 from Snuffleupagus/es6-ViewHistory
Convert the `ViewHistory` to an ES6 class, and re-factor it to make it properly asynchronous
This commit is contained in:
		
						commit
						19af5952c0
					
				
							
								
								
									
										105
									
								
								web/app.js
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								web/app.js
									
									
									
									
									
								
							@ -882,7 +882,7 @@ var PDFViewerApplication = {
 | 
			
		||||
    var pdfThumbnailViewer = this.pdfThumbnailViewer;
 | 
			
		||||
    pdfThumbnailViewer.setDocument(pdfDocument);
 | 
			
		||||
 | 
			
		||||
    firstPagePromise.then(function(pdfPage) {
 | 
			
		||||
    firstPagePromise.then((pdfPage) => {
 | 
			
		||||
      downloadedPromise.then(function () {
 | 
			
		||||
        self.eventBus.dispatch('documentload', {source: self});
 | 
			
		||||
      });
 | 
			
		||||
@ -905,58 +905,65 @@ var PDFViewerApplication = {
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      var initialParams = {
 | 
			
		||||
        destination: self.initialDestination,
 | 
			
		||||
        bookmark: self.initialBookmark,
 | 
			
		||||
        destination: this.initialDestination,
 | 
			
		||||
        bookmark: this.initialBookmark,
 | 
			
		||||
        hash: null,
 | 
			
		||||
      };
 | 
			
		||||
      var storedHash = this.viewerPrefs['defaultZoomValue'] ?
 | 
			
		||||
        ('zoom=' + this.viewerPrefs['defaultZoomValue']) : null;
 | 
			
		||||
      var sidebarView = this.viewerPrefs['sidebarViewOnLoad'];
 | 
			
		||||
 | 
			
		||||
      store.initializedPromise.then(function resolved() {
 | 
			
		||||
        var storedHash = null, sidebarView = null;
 | 
			
		||||
        if (self.viewerPrefs['showPreviousViewOnLoad'] &&
 | 
			
		||||
            store.get('exists', false)) {
 | 
			
		||||
          var pageNum = store.get('page', '1');
 | 
			
		||||
          var zoom = self.viewerPrefs['defaultZoomValue'] ||
 | 
			
		||||
                     store.get('zoom', DEFAULT_SCALE_VALUE);
 | 
			
		||||
          var left = store.get('scrollLeft', '0');
 | 
			
		||||
          var top = store.get('scrollTop', '0');
 | 
			
		||||
 | 
			
		||||
          storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' +
 | 
			
		||||
                       left + ',' + top;
 | 
			
		||||
 | 
			
		||||
          sidebarView = store.get('sidebarView', SidebarView.NONE);
 | 
			
		||||
        } else if (self.viewerPrefs['defaultZoomValue']) {
 | 
			
		||||
          storedHash = 'page=1&zoom=' + self.viewerPrefs['defaultZoomValue'];
 | 
			
		||||
      new Promise((resolve, reject) => {
 | 
			
		||||
        if (!this.viewerPrefs['showPreviousViewOnLoad']) {
 | 
			
		||||
          resolve();
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
        self.setInitialView(storedHash,
 | 
			
		||||
          { scale: scale, sidebarView: sidebarView });
 | 
			
		||||
 | 
			
		||||
        store.getMultiple({
 | 
			
		||||
          exists: false,
 | 
			
		||||
          page: '1',
 | 
			
		||||
          zoom: DEFAULT_SCALE_VALUE,
 | 
			
		||||
          scrollLeft: '0',
 | 
			
		||||
          scrollTop: '0',
 | 
			
		||||
          sidebarView: SidebarView.NONE,
 | 
			
		||||
        }).then((values) => {
 | 
			
		||||
          if (!values.exists) {
 | 
			
		||||
            resolve();
 | 
			
		||||
            return;
 | 
			
		||||
          }
 | 
			
		||||
          storedHash = 'page=' + values.page +
 | 
			
		||||
            '&zoom=' + (this.viewerPrefs['defaultZoomValue'] || values.zoom) +
 | 
			
		||||
            ',' + values.scrollLeft + ',' + values.scrollTop;
 | 
			
		||||
          sidebarView = this.viewerPrefs['sidebarViewOnLoad'] ||
 | 
			
		||||
                        (values.sidebarView | 0);
 | 
			
		||||
          resolve();
 | 
			
		||||
        }).catch(function() {
 | 
			
		||||
          resolve();
 | 
			
		||||
        });
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        this.setInitialView(storedHash, { sidebarView, scale, });
 | 
			
		||||
        initialParams.hash = storedHash;
 | 
			
		||||
 | 
			
		||||
        // Make all navigation keys work on document load,
 | 
			
		||||
        // unless the viewer is embedded in a web page.
 | 
			
		||||
        if (!self.isViewerEmbedded) {
 | 
			
		||||
          self.pdfViewer.focus();
 | 
			
		||||
        if (!this.isViewerEmbedded) {
 | 
			
		||||
          this.pdfViewer.focus();
 | 
			
		||||
        }
 | 
			
		||||
      }, function rejected(reason) {
 | 
			
		||||
        console.error(reason);
 | 
			
		||||
        self.setInitialView(null, { scale: scale });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // For documents with different page sizes,
 | 
			
		||||
        return pagesPromise;
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        // For documents with different page sizes, once all pages are resolved,
 | 
			
		||||
        // ensure that the correct location becomes visible on load.
 | 
			
		||||
      pagesPromise.then(function resolved() {
 | 
			
		||||
        if (!initialParams.destination && !initialParams.bookmark &&
 | 
			
		||||
            !initialParams.hash) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
        if (self.hasEqualPageSizes) {
 | 
			
		||||
        if (this.hasEqualPageSizes) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
        self.initialDestination = initialParams.destination;
 | 
			
		||||
        self.initialBookmark = initialParams.bookmark;
 | 
			
		||||
        this.initialDestination = initialParams.destination;
 | 
			
		||||
        this.initialBookmark = initialParams.bookmark;
 | 
			
		||||
 | 
			
		||||
        self.pdfViewer.currentScaleValue = self.pdfViewer.currentScaleValue;
 | 
			
		||||
        self.setInitialView(initialParams.hash);
 | 
			
		||||
        this.pdfViewer.currentScaleValue = this.pdfViewer.currentScaleValue;
 | 
			
		||||
        this.setInitialView(initialParams.hash);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
@ -1085,14 +1092,11 @@ var PDFViewerApplication = {
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  setInitialView: function pdfViewSetInitialView(storedHash, options) {
 | 
			
		||||
    var scale = options && options.scale;
 | 
			
		||||
    var sidebarView = options && options.sidebarView;
 | 
			
		||||
  setInitialView(storedHash, options = {}) {
 | 
			
		||||
    var { scale = 0, sidebarView = SidebarView.NONE, } = options;
 | 
			
		||||
 | 
			
		||||
    this.isInitialViewSet = true;
 | 
			
		||||
 | 
			
		||||
    this.pdfSidebar.setInitialView(this.viewerPrefs['sidebarViewOnLoad'] ||
 | 
			
		||||
                                   (sidebarView | 0));
 | 
			
		||||
    this.pdfSidebar.setInitialView(sidebarView);
 | 
			
		||||
 | 
			
		||||
    if (this.initialDestination) {
 | 
			
		||||
      this.pdfLinkService.navigateTo(this.initialDestination);
 | 
			
		||||
@ -1645,25 +1649,21 @@ function webViewerPresentationModeChanged(e) {
 | 
			
		||||
    active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function webViewerSidebarViewChanged(e) {
 | 
			
		||||
function webViewerSidebarViewChanged(evt) {
 | 
			
		||||
  PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled =
 | 
			
		||||
    PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;
 | 
			
		||||
 | 
			
		||||
  var store = PDFViewerApplication.store;
 | 
			
		||||
  if (!store || !PDFViewerApplication.isInitialViewSet) {
 | 
			
		||||
  if (store && PDFViewerApplication.isInitialViewSet) {
 | 
			
		||||
    // Only update the storage when the document has been loaded *and* rendered.
 | 
			
		||||
    return;
 | 
			
		||||
    store.set('sidebarView', evt.view).catch(function() { });
 | 
			
		||||
  }
 | 
			
		||||
  store.initializedPromise.then(function() {
 | 
			
		||||
    store.set('sidebarView', e.view).catch(function() {});
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function webViewerUpdateViewarea(e) {
 | 
			
		||||
  var location = e.location, store = PDFViewerApplication.store;
 | 
			
		||||
function webViewerUpdateViewarea(evt) {
 | 
			
		||||
  var location = evt.location, store = PDFViewerApplication.store;
 | 
			
		||||
 | 
			
		||||
  if (store) {
 | 
			
		||||
    store.initializedPromise.then(function() {
 | 
			
		||||
  if (store && PDFViewerApplication.isInitialViewSet) {
 | 
			
		||||
    store.setMultiple({
 | 
			
		||||
      'exists': true,
 | 
			
		||||
      'page': location.pageNumber,
 | 
			
		||||
@ -1671,7 +1671,6 @@ function webViewerUpdateViewarea(e) {
 | 
			
		||||
      'scrollLeft': location.left,
 | 
			
		||||
      'scrollTop': location.top,
 | 
			
		||||
    }).catch(function() { /* unable to write to storage */ });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
  var href =
 | 
			
		||||
    PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;
 | 
			
		||||
const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * View History - This is a utility for saving various view parameters for
 | 
			
		||||
@ -24,15 +24,12 @@ var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;
 | 
			
		||||
 *  - FIREFOX or MOZCENTRAL - uses sessionStorage.
 | 
			
		||||
 *  - GENERIC or CHROME     - uses localStorage, if it is available.
 | 
			
		||||
 */
 | 
			
		||||
var ViewHistory = (function ViewHistoryClosure() {
 | 
			
		||||
  function ViewHistory(fingerprint, cacheSize) {
 | 
			
		||||
class ViewHistory {
 | 
			
		||||
  constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) {
 | 
			
		||||
    this.fingerprint = fingerprint;
 | 
			
		||||
    this.cacheSize = cacheSize || DEFAULT_VIEW_HISTORY_CACHE_SIZE;
 | 
			
		||||
    this.isInitializedPromiseResolved = false;
 | 
			
		||||
    this.initializedPromise =
 | 
			
		||||
        this._readFromStorage().then(function (databaseStr) {
 | 
			
		||||
      this.isInitializedPromiseResolved = true;
 | 
			
		||||
    this.cacheSize = cacheSize;
 | 
			
		||||
 | 
			
		||||
    this._initializedPromise = this._readFromStorage().then((databaseStr) => {
 | 
			
		||||
      var database = JSON.parse(databaseStr || '{}');
 | 
			
		||||
      if (!('files' in database)) {
 | 
			
		||||
        database.files = [];
 | 
			
		||||
@ -53,12 +50,11 @@ var ViewHistory = (function ViewHistoryClosure() {
 | 
			
		||||
      }
 | 
			
		||||
      this.file = database.files[index];
 | 
			
		||||
      this.database = database;
 | 
			
		||||
    }.bind(this));
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ViewHistory.prototype = {
 | 
			
		||||
    _writeToStorage: function ViewHistory_writeToStorage() {
 | 
			
		||||
      return new Promise(function (resolve) {
 | 
			
		||||
  _writeToStorage() {
 | 
			
		||||
    return new Promise((resolve) => {
 | 
			
		||||
      var databaseStr = JSON.stringify(this.database);
 | 
			
		||||
 | 
			
		||||
      if (typeof PDFJSDev !== 'undefined' &&
 | 
			
		||||
@ -68,11 +64,11 @@ var ViewHistory = (function ViewHistoryClosure() {
 | 
			
		||||
        localStorage.setItem('pdfjs.history', databaseStr);
 | 
			
		||||
      }
 | 
			
		||||
      resolve();
 | 
			
		||||
      }.bind(this));
 | 
			
		||||
    },
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    _readFromStorage: function ViewHistory_readFromStorage() {
 | 
			
		||||
      return new Promise(function (resolve) {
 | 
			
		||||
  _readFromStorage() {
 | 
			
		||||
    return new Promise(function(resolve) {
 | 
			
		||||
      if (typeof PDFJSDev !== 'undefined' &&
 | 
			
		||||
          PDFJSDev.test('FIREFOX || MOZCENTRAL')) {
 | 
			
		||||
        resolve(sessionStorage.getItem('pdfjs.history'));
 | 
			
		||||
@ -81,7 +77,7 @@ var ViewHistory = (function ViewHistoryClosure() {
 | 
			
		||||
 | 
			
		||||
        // TODO: Remove this key-name conversion after a suitable time-frame.
 | 
			
		||||
        // Note that we only remove the old 'database' entry if it looks like
 | 
			
		||||
          // it was created by PDF.js. to avoid removing someone else's data.
 | 
			
		||||
        // it was created by PDF.js, to avoid removing someone else's data.
 | 
			
		||||
        if (!value) {
 | 
			
		||||
          var databaseStr = localStorage.getItem('database');
 | 
			
		||||
          if (databaseStr) {
 | 
			
		||||
@ -95,40 +91,46 @@ var ViewHistory = (function ViewHistoryClosure() {
 | 
			
		||||
            } catch (ex) { }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        resolve(value);
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    set: function ViewHistory_set(name, val) {
 | 
			
		||||
      if (!this.isInitializedPromiseResolved) {
 | 
			
		||||
        return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  set(name, val) {
 | 
			
		||||
    return this._initializedPromise.then(() => {
 | 
			
		||||
      this.file[name] = val;
 | 
			
		||||
      return this._writeToStorage();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setMultiple: function ViewHistory_setMultiple(properties) {
 | 
			
		||||
      if (!this.isInitializedPromiseResolved) {
 | 
			
		||||
        return;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setMultiple(properties) {
 | 
			
		||||
    return this._initializedPromise.then(() => {
 | 
			
		||||
      for (var name in properties) {
 | 
			
		||||
        this.file[name] = properties[name];
 | 
			
		||||
      }
 | 
			
		||||
      return this._writeToStorage();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get: function ViewHistory_get(name, defaultValue) {
 | 
			
		||||
      if (!this.isInitializedPromiseResolved) {
 | 
			
		||||
        return defaultValue;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
      return this.file[name] || defaultValue;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  return ViewHistory;
 | 
			
		||||
})();
 | 
			
		||||
  get(name, defaultValue) {
 | 
			
		||||
    return this._initializedPromise.then(() => {
 | 
			
		||||
      var val = this.file[name];
 | 
			
		||||
      return val !== undefined ? val : defaultValue;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getMultiple(properties) {
 | 
			
		||||
    return this._initializedPromise.then(() => {
 | 
			
		||||
      var values = Object.create(null);
 | 
			
		||||
 | 
			
		||||
      for (var name in properties) {
 | 
			
		||||
        var val = this.file[name];
 | 
			
		||||
        values[name] = val !== undefined ? val : properties[name];
 | 
			
		||||
      }
 | 
			
		||||
      return values;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
  ViewHistory,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user