Refactors PDFHistory.

# Conflicts:
#	extensions/b2g/viewer.js
#	web/pdf_history.js
#	web/pdf_viewer.component.js
#	web/viewer.js
This commit is contained in:
Yury Delendik 2015-04-27 09:04:11 -05:00
parent 0ef6212b64
commit 5cff06e52a
4 changed files with 361 additions and 323 deletions

View File

@ -59,6 +59,17 @@ IPDFLinkService.prototype = {
cachePageRef: function (pageNum, pageRef) {}, cachePageRef: function (pageNum, pageRef) {},
}; };
/**
* @interface
*/
function IPDFHistory() {}
IPDFHistory.prototype = {
forward: function () {},
back: function () {},
push: function (params) {},
updateNextHashParam: function (hash) {},
};
/** /**
* @interface * @interface
*/ */

View File

@ -17,134 +17,141 @@
'use strict'; 'use strict';
var PDFHistory = { var PDFHistory = (function () {
initialized: false, function PDFHistory(options) {
initialDestination: null, this.linkService = options.linkService;
/** this.initialized = false;
* @param {string} fingerprint this.initialDestination = null;
* @param {IPDFLinkService} linkService this.initialBookmark = null;
*/ }
initialize: function pdfHistoryInitialize(fingerprint, linkService) {
this.initialized = true;
this.reInitialized = false;
this.allowHashChange = true;
this.historyUnlocked = true;
this.isViewerInPresentationMode = false;
this.previousHash = window.location.hash.substring(1); PDFHistory.prototype = {
this.currentBookmark = ''; /**
this.currentPage = 0; * @param {string} fingerprint
this.updatePreviousBookmark = false; * @param {IPDFLinkService} linkService
this.previousBookmark = ''; */
this.previousPage = 0; initialize: function pdfHistoryInitialize(fingerprint) {
this.nextHashParam = ''; this.initialized = true;
this.reInitialized = false;
this.allowHashChange = true;
this.historyUnlocked = true;
this.isViewerInPresentationMode = false;
this.fingerprint = fingerprint; this.previousHash = window.location.hash.substring(1);
this.linkService = linkService; this.currentBookmark = '';
this.currentUid = this.uid = 0; this.currentPage = 0;
this.current = {}; this.updatePreviousBookmark = false;
this.previousBookmark = '';
this.previousPage = 0;
this.nextHashParam = '';
var state = window.history.state; this.fingerprint = fingerprint;
if (this._isStateObjectDefined(state)) { this.currentUid = this.uid = 0;
// This corresponds to navigating back to the document this.current = {};
// from another page in the browser history.
if (state.target.dest) {
this.initialDestination = state.target.dest;
} else {
linkService.setHash(state.target.hash);
}
this.currentUid = state.uid;
this.uid = state.uid + 1;
this.current = state.target;
} else {
// This corresponds to the loading of a new document.
if (state && state.fingerprint &&
this.fingerprint !== state.fingerprint) {
// Reinitialize the browsing history when a new document
// is opened in the web viewer.
this.reInitialized = true;
}
this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);
}
var self = this; var state = window.history.state;
window.addEventListener('popstate', function pdfHistoryPopstate(evt) { if (this._isStateObjectDefined(state)) {
evt.preventDefault(); // This corresponds to navigating back to the document
evt.stopPropagation(); // from another page in the browser history.
if (state.target.dest) {
if (!self.historyUnlocked) { this.initialDestination = state.target.dest;
return; } else {
} this.initialBookmark = state.target.hash;
if (evt.state) {
// Move back/forward in the history.
self._goTo(evt.state);
} else {
// Handle the user modifying the hash of a loaded document.
self.previousHash = window.location.hash.substring(1);
// If the history is empty when the hash changes,
// update the previous entry in the browser history.
if (self.uid === 0) {
var previousParams = (self.previousHash && self.currentBookmark &&
self.previousHash !== self.currentBookmark) ?
{ hash: self.currentBookmark, page: self.currentPage } :
{ page: 1 };
self.historyUnlocked = false;
self.allowHashChange = false;
window.history.back();
self._pushToHistory(previousParams, false, true);
window.history.forward();
self.historyUnlocked = true;
} }
self._pushToHistory({ hash: self.previousHash }, false, true); this.currentUid = state.uid;
self._updatePreviousBookmark(); this.uid = state.uid + 1;
this.current = state.target;
} else {
// This corresponds to the loading of a new document.
if (state && state.fingerprint &&
this.fingerprint !== state.fingerprint) {
// Reinitialize the browsing history when a new document
// is opened in the web viewer.
this.reInitialized = true;
}
this._pushOrReplaceState({fingerprint: this.fingerprint}, true);
} }
}, false);
function pdfHistoryBeforeUnload() { var self = this;
var previousParams = self._getPreviousParams(null, true); window.addEventListener('popstate', function pdfHistoryPopstate(evt) {
if (previousParams) { evt.preventDefault();
var replacePrevious = (!self.current.dest && evt.stopPropagation();
self.current.hash !== self.previousHash);
self._pushToHistory(previousParams, false, replacePrevious); if (!self.historyUnlocked) {
self._updatePreviousBookmark(); return;
}
if (evt.state) {
// Move back/forward in the history.
self._goTo(evt.state);
} else {
// Handle the user modifying the hash of a loaded document.
self.previousHash = window.location.hash.substring(1);
// If the history is empty when the hash changes,
// update the previous entry in the browser history.
if (self.uid === 0) {
var previousParams = (self.previousHash && self.currentBookmark &&
self.previousHash !== self.currentBookmark) ?
{hash: self.currentBookmark, page: self.currentPage} :
{page: 1};
self.historyUnlocked = false;
self.allowHashChange = false;
window.history.back();
self._pushToHistory(previousParams, false, true);
window.history.forward();
self.historyUnlocked = true;
}
self._pushToHistory({hash: self.previousHash}, false, true);
self._updatePreviousBookmark();
}
}, false);
function pdfHistoryBeforeUnload() {
var previousParams = self._getPreviousParams(null, true);
if (previousParams) {
var replacePrevious = (!self.current.dest &&
self.current.hash !== self.previousHash);
self._pushToHistory(previousParams, false, replacePrevious);
self._updatePreviousBookmark();
}
// Remove the event listener when navigating away from the document,
// since 'beforeunload' prevents Firefox from caching the document.
window.removeEventListener('beforeunload', pdfHistoryBeforeUnload,
false);
} }
// Remove the event listener when navigating away from the document,
// since 'beforeunload' prevents Firefox from caching the document.
window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, false);
}
window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {
// If the entire viewer (including the PDF file) is cached in the browser,
// we need to reattach the 'beforeunload' event listener since
// the 'DOMContentLoaded' event is not fired on 'pageshow'.
window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false); window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
}, false);
window.addEventListener('presentationmodechanged', function(e) { window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {
self.isViewerInPresentationMode = !!e.detail.active; // If the entire viewer (including the PDF file) is cached in
}); // the browser, we need to reattach the 'beforeunload' event listener
}, // since the 'DOMContentLoaded' event is not fired on 'pageshow'.
window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
}, false);
_isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) { window.addEventListener('presentationmodechanged', function(e) {
return (state && state.uid >= 0 && self.isViewerInPresentationMode = !!e.detail.active;
state.fingerprint && this.fingerprint === state.fingerprint && });
state.target && state.target.hash) ? true : false; },
},
_pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj, _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {
replace) { return (state && state.uid >= 0 &&
if (replace) { state.fingerprint && this.fingerprint === state.fingerprint &&
state.target && state.target.hash) ? true : false;
},
_pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj,
replace) {
if (replace) {
//#if (GENERIC || CHROME) //#if (GENERIC || CHROME)
window.history.replaceState(stateObj, '', document.URL); window.history.replaceState(stateObj, '', document.URL);
//#else //#else
// window.history.replaceState(stateObj, ''); // window.history.replaceState(stateObj, '');
//#endif //#endif
} else { } else {
//#if (GENERIC || CHROME) //#if (GENERIC || CHROME)
window.history.pushState(stateObj, '', document.URL); window.history.pushState(stateObj, '', document.URL);
//#else //#else
// window.history.pushState(stateObj, ''); // window.history.pushState(stateObj, '');
//#endif //#endif
@ -153,230 +160,235 @@ var PDFHistory = {
// chrome.runtime.sendMessage('showPageAction'); // chrome.runtime.sendMessage('showPageAction');
// } // }
//#endif //#endif
}
},
get isHashChangeUnlocked() {
if (!this.initialized) {
return true;
}
// If the current hash changes when moving back/forward in the history,
// this will trigger a 'popstate' event *as well* as a 'hashchange' event.
// Since the hash generally won't correspond to the exact the position
// stored in the history's state object, triggering the 'hashchange' event
// can thus corrupt the browser history.
//
// When the hash changes during a 'popstate' event, we *only* prevent the
// first 'hashchange' event and immediately reset allowHashChange.
// If it is not reset, the user would not be able to change the hash.
var temp = this.allowHashChange;
this.allowHashChange = true;
return temp;
},
_updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {
if (this.updatePreviousBookmark &&
this.currentBookmark && this.currentPage) {
this.previousBookmark = this.currentBookmark;
this.previousPage = this.currentPage;
this.updatePreviousBookmark = false;
}
},
updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark,
pageNum) {
if (this.initialized) {
this.currentBookmark = bookmark.substring(1);
this.currentPage = pageNum | 0;
this._updatePreviousBookmark();
}
},
updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {
if (this.initialized) {
this.nextHashParam = param;
}
},
push: function pdfHistoryPush(params, isInitialBookmark) {
if (!(this.initialized && this.historyUnlocked)) {
return;
}
if (params.dest && !params.hash) {
params.hash = (this.current.hash && this.current.dest &&
this.current.dest === params.dest) ?
this.current.hash :
this.linkService.getDestinationHash(params.dest).split('#')[1];
}
if (params.page) {
params.page |= 0;
}
if (isInitialBookmark) {
var target = window.history.state.target;
if (!target) {
// Invoked when the user specifies an initial bookmark,
// thus setting initialBookmark, when the document is loaded.
this._pushToHistory(params, false);
this.previousHash = window.location.hash.substring(1);
} }
this.updatePreviousBookmark = this.nextHashParam ? false : true; },
if (target) {
// If the current document is reloaded, get isHashChangeUnlocked() {
// avoid creating duplicate entries in the history. if (!this.initialized) {
return true;
}
// If the current hash changes when moving back/forward in the history,
// this will trigger a 'popstate' event *as well* as a 'hashchange' event.
// Since the hash generally won't correspond to the exact the position
// stored in the history's state object, triggering the 'hashchange' event
// can thus corrupt the browser history.
//
// When the hash changes during a 'popstate' event, we *only* prevent the
// first 'hashchange' event and immediately reset allowHashChange.
// If it is not reset, the user would not be able to change the hash.
var temp = this.allowHashChange;
this.allowHashChange = true;
return temp;
},
_updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {
if (this.updatePreviousBookmark &&
this.currentBookmark && this.currentPage) {
this.previousBookmark = this.currentBookmark;
this.previousPage = this.currentPage;
this.updatePreviousBookmark = false;
}
},
updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark,
pageNum) {
if (this.initialized) {
this.currentBookmark = bookmark.substring(1);
this.currentPage = pageNum | 0;
this._updatePreviousBookmark(); this._updatePreviousBookmark();
} }
return; },
}
if (this.nextHashParam) {
if (this.nextHashParam === params.hash) {
this.nextHashParam = null;
this.updatePreviousBookmark = true;
return;
} else {
this.nextHashParam = null;
}
}
if (params.hash) { updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {
if (this.current.hash) { if (this.initialized) {
if (this.current.hash !== params.hash) { this.nextHashParam = param;
this._pushToHistory(params, true); }
} else { },
if (!this.current.page && params.page) {
this._pushToHistory(params, false, true); push: function pdfHistoryPush(params, isInitialBookmark) {
} if (!(this.initialized && this.historyUnlocked)) {
this.updatePreviousBookmark = true; return;
}
if (params.dest && !params.hash) {
params.hash = (this.current.hash && this.current.dest &&
this.current.dest === params.dest) ?
this.current.hash :
this.linkService.getDestinationHash(params.dest).split('#')[1];
}
if (params.page) {
params.page |= 0;
}
if (isInitialBookmark) {
var target = window.history.state.target;
if (!target) {
// Invoked when the user specifies an initial bookmark,
// thus setting initialBookmark, when the document is loaded.
this._pushToHistory(params, false);
this.previousHash = window.location.hash.substring(1);
} }
} else { this.updatePreviousBookmark = this.nextHashParam ? false : true;
if (target) {
// If the current document is reloaded,
// avoid creating duplicate entries in the history.
this._updatePreviousBookmark();
}
return;
}
if (this.nextHashParam) {
if (this.nextHashParam === params.hash) {
this.nextHashParam = null;
this.updatePreviousBookmark = true;
return;
} else {
this.nextHashParam = null;
}
}
if (params.hash) {
if (this.current.hash) {
if (this.current.hash !== params.hash) {
this._pushToHistory(params, true);
} else {
if (!this.current.page && params.page) {
this._pushToHistory(params, false, true);
}
this.updatePreviousBookmark = true;
}
} else {
this._pushToHistory(params, true);
}
} else if (this.current.page && params.page &&
this.current.page !== params.page) {
this._pushToHistory(params, true); this._pushToHistory(params, true);
} }
} else if (this.current.page && params.page && },
this.current.page !== params.page) {
this._pushToHistory(params, true);
}
},
_getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage, _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage,
beforeUnload) { beforeUnload) {
if (!(this.currentBookmark && this.currentPage)) { if (!(this.currentBookmark && this.currentPage)) {
return null; return null;
} else if (this.updatePreviousBookmark) { } else if (this.updatePreviousBookmark) {
this.updatePreviousBookmark = false; this.updatePreviousBookmark = false;
} }
if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) { if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {
// Prevent the history from getting stuck in the current state, // Prevent the history from getting stuck in the current state,
// effectively preventing the user from going back/forward in the history. // effectively preventing the user from going back/forward in
// // the history.
// This happens if the current position in the document didn't change when //
// the history was previously updated. The reasons for this are either: // This happens if the current position in the document didn't change
// 1. The current zoom value is such that the document does not need to, // when the history was previously updated. The reasons for this are
// or cannot, be scrolled to display the destination. // either:
// 2. The previous destination is broken, and doesn't actally point to a // 1. The current zoom value is such that the document does not need to,
// position within the document. // or cannot, be scrolled to display the destination.
// (This is either due to a bad PDF generator, or the user making a // 2. The previous destination is broken, and doesn't actally point to a
// mistake when entering a destination in the hash parameters.) // position within the document.
return null; // (This is either due to a bad PDF generator, or the user making a
} // mistake when entering a destination in the hash parameters.)
if ((!this.current.dest && !onlyCheckPage) || beforeUnload) {
if (this.previousBookmark === this.currentBookmark) {
return null; return null;
} }
} else if (this.current.page || onlyCheckPage) { if ((!this.current.dest && !onlyCheckPage) || beforeUnload) {
if (this.previousPage === this.currentPage) { if (this.previousBookmark === this.currentBookmark) {
return null;
}
} else if (this.current.page || onlyCheckPage) {
if (this.previousPage === this.currentPage) {
return null;
}
} else {
return null; return null;
} }
} else { var params = {hash: this.currentBookmark, page: this.currentPage};
return null; if (this.isViewerInPresentationMode) {
} params.hash = null;
var params = { hash: this.currentBookmark, page: this.currentPage };
if (this.isViewerInPresentationMode) {
params.hash = null;
}
return params;
},
_stateObj: function pdfHistory_stateObj(params) {
return { fingerprint: this.fingerprint, uid: this.uid, target: params };
},
_pushToHistory: function pdfHistory_pushToHistory(params,
addPrevious, overwrite) {
if (!this.initialized) {
return;
}
if (!params.hash && params.page) {
params.hash = ('page=' + params.page);
}
if (addPrevious && !overwrite) {
var previousParams = this._getPreviousParams();
if (previousParams) {
var replacePrevious = (!this.current.dest &&
this.current.hash !== this.previousHash);
this._pushToHistory(previousParams, false, replacePrevious);
} }
} return params;
this._pushOrReplaceState(this._stateObj(params), },
(overwrite || this.uid === 0));
this.currentUid = this.uid++;
this.current = params;
this.updatePreviousBookmark = true;
},
_goTo: function pdfHistory_goTo(state) { _stateObj: function pdfHistory_stateObj(params) {
if (!(this.initialized && this.historyUnlocked && return {fingerprint: this.fingerprint, uid: this.uid, target: params};
this._isStateObjectDefined(state))) { },
return;
} _pushToHistory: function pdfHistory_pushToHistory(params,
if (!this.reInitialized && state.uid < this.currentUid) { addPrevious, overwrite) {
var previousParams = this._getPreviousParams(true); if (!this.initialized) {
if (previousParams) {
this._pushToHistory(this.current, false);
this._pushToHistory(previousParams, false);
this.currentUid = state.uid;
window.history.back();
return; return;
} }
} if (!params.hash && params.page) {
this.historyUnlocked = false; params.hash = ('page=' + params.page);
}
if (addPrevious && !overwrite) {
var previousParams = this._getPreviousParams();
if (previousParams) {
var replacePrevious = (!this.current.dest &&
this.current.hash !== this.previousHash);
this._pushToHistory(previousParams, false, replacePrevious);
}
}
this._pushOrReplaceState(this._stateObj(params),
(overwrite || this.uid === 0));
this.currentUid = this.uid++;
this.current = params;
this.updatePreviousBookmark = true;
},
if (state.target.dest) { _goTo: function pdfHistory_goTo(state) {
this.linkService.navigateTo(state.target.dest); if (!(this.initialized && this.historyUnlocked &&
} else { this._isStateObjectDefined(state))) {
this.linkService.setHash(state.target.hash); return;
} }
this.currentUid = state.uid; if (!this.reInitialized && state.uid < this.currentUid) {
if (state.uid > this.uid) { var previousParams = this._getPreviousParams(true);
this.uid = state.uid; if (previousParams) {
} this._pushToHistory(this.current, false);
this.current = state.target; this._pushToHistory(previousParams, false);
this.updatePreviousBookmark = true; this.currentUid = state.uid;
window.history.back();
return;
}
}
this.historyUnlocked = false;
var currentHash = window.location.hash.substring(1); if (state.target.dest) {
if (this.previousHash !== currentHash) { this.linkService.navigateTo(state.target.dest);
this.allowHashChange = false; } else {
} this.linkService.setHash(state.target.hash);
this.previousHash = currentHash; }
this.currentUid = state.uid;
if (state.uid > this.uid) {
this.uid = state.uid;
}
this.current = state.target;
this.updatePreviousBookmark = true;
this.historyUnlocked = true; var currentHash = window.location.hash.substring(1);
}, if (this.previousHash !== currentHash) {
this.allowHashChange = false;
}
this.previousHash = currentHash;
back: function pdfHistoryBack() { this.historyUnlocked = true;
this.go(-1); },
},
forward: function pdfHistoryForward() { back: function pdfHistoryBack() {
this.go(1); this.go(-1);
}, },
go: function pdfHistoryGo(direction) { forward: function pdfHistoryForward() {
if (this.initialized && this.historyUnlocked) { this.go(1);
var state = window.history.state; },
if (direction === -1 && state && state.uid > 0) {
window.history.back(); go: function pdfHistoryGo(direction) {
} else if (direction === 1 && state && state.uid < (this.uid - 1)) { if (this.initialized && this.historyUnlocked) {
window.history.forward(); var state = window.history.state;
if (direction === -1 && state && state.uid > 0) {
window.history.back();
} else if (direction === 1 && state && state.uid < (this.uid - 1)) {
window.history.forward();
}
} }
} }
} };
};
return PDFHistory;
})();

View File

@ -16,8 +16,8 @@
*/ */
/*jshint globalstrict: false */ /*jshint globalstrict: false */
/* globals PDFJS, PDFViewer, PDFPageView, TextLayerBuilder, PDFLinkService, /* globals PDFJS, PDFViewer, PDFPageView, TextLayerBuilder, PDFLinkService,
DefaultTextLayerFactory, AnnotationsLayerBuilder, DefaultTextLayerFactory, AnnotationsLayerBuilder, PDFHistory,
DefaultAnnotationsLayerFactory */ DefaultAnnotationsLayerFactory, getFileName */
// Initializing PDFJS global object (if still undefined) // Initializing PDFJS global object (if still undefined)
if (typeof PDFJS === 'undefined') { if (typeof PDFJS === 'undefined') {
@ -30,6 +30,7 @@ if (typeof PDFJS === 'undefined') {
//#include ui_utils.js //#include ui_utils.js
//#include pdf_link_service.js //#include pdf_link_service.js
//#include pdf_viewer.js //#include pdf_viewer.js
//#include pdf_history.js
PDFJS.PDFViewer = PDFViewer; PDFJS.PDFViewer = PDFViewer;
PDFJS.PDFPageView = PDFPageView; PDFJS.PDFPageView = PDFPageView;
@ -38,4 +39,7 @@ if (typeof PDFJS === 'undefined') {
PDFJS.DefaultTextLayerFactory = DefaultTextLayerFactory; PDFJS.DefaultTextLayerFactory = DefaultTextLayerFactory;
PDFJS.AnnotationsLayerBuilder = AnnotationsLayerBuilder; PDFJS.AnnotationsLayerBuilder = AnnotationsLayerBuilder;
PDFJS.DefaultAnnotationsLayerFactory = DefaultAnnotationsLayerFactory; PDFJS.DefaultAnnotationsLayerFactory = DefaultAnnotationsLayerFactory;
PDFJS.PDFHistory = PDFHistory;
PDFJS.getFileName = getFileName;
}).call((typeof window === 'undefined') ? this : window); }).call((typeof window === 'undefined') ? this : window);

View File

@ -97,6 +97,7 @@ var mozL10n = document.mozL10n || document.webL10n;
var PDFViewerApplication = { var PDFViewerApplication = {
initialBookmark: document.location.hash.substring(1), initialBookmark: document.location.hash.substring(1),
initialDestination: null,
initialized: false, initialized: false,
fellback: false, fellback: false,
pdfDocument: null, pdfDocument: null,
@ -114,6 +115,8 @@ var PDFViewerApplication = {
pdfDocumentProperties: null, pdfDocumentProperties: null,
/** @type {PDFLinkService} */ /** @type {PDFLinkService} */
pdfLinkService: null, pdfLinkService: null,
/** @type {PDFHistory} */
pdfHistory: null,
pageRotation: 0, pageRotation: 0,
updateScaleControls: true, updateScaleControls: true,
isInitialViewSet: false, isInitialViewSet: false,
@ -155,6 +158,11 @@ var PDFViewerApplication = {
Preferences.initialize(); Preferences.initialize();
this.pdfHistory = new PDFHistory({
linkService: pdfLinkService
});
pdfLinkService.setHistory(this.pdfHistory);
this.findController = new PDFFindController({ this.findController = new PDFFindController({
pdfViewer: this.pdfViewer, pdfViewer: this.pdfViewer,
integratedFind: this.supportsIntegratedFind integratedFind: this.supportsIntegratedFind
@ -790,7 +798,9 @@ var PDFViewerApplication = {
if (!self.preferenceShowPreviousViewOnLoad && window.history.state) { if (!self.preferenceShowPreviousViewOnLoad && window.history.state) {
window.history.replaceState(null, ''); window.history.replaceState(null, '');
} }
PDFHistory.initialize(self.documentFingerprint, self.pdfLinkService); self.pdfHistory.initialize(self.documentFingerprint);
self.initialDestination = self.pdfHistory.initialDestination;
self.initialBookmark = self.pdfHistory.initialBookmark;
} }
store.initializedPromise.then(function resolved() { store.initializedPromise.then(function resolved() {
@ -969,12 +979,12 @@ var PDFViewerApplication = {
document.getElementById('pageNumber').value = document.getElementById('pageNumber').value =
this.pdfViewer.currentPageNumber = 1; this.pdfViewer.currentPageNumber = 1;
if (PDFHistory.initialDestination) { if (this.initialDestination) {
this.pdfLinkService.navigateTo(PDFHistory.initialDestination); this.pdfLinkService.navigateTo(this.initialDestination);
PDFHistory.initialDestination = null; this.initialDestination = null;
} else if (this.initialBookmark) { } else if (this.initialBookmark) {
this.pdfLinkService.setHash(this.initialBookmark); this.pdfLinkService.setHash(this.initialBookmark);
PDFHistory.push({ hash: this.initialBookmark }, !!this.initialBookmark); this.pdfHistory.push({ hash: this.initialBookmark }, true);
this.initialBookmark = null; this.initialBookmark = null;
} else if (storedHash) { } else if (storedHash) {
this.pdfLinkService.setHash(storedHash); this.pdfLinkService.setHash(storedHash);
@ -1635,7 +1645,8 @@ window.addEventListener('updateviewarea', function (evt) {
document.getElementById('secondaryViewBookmark').href = href; document.getElementById('secondaryViewBookmark').href = href;
// Update the current bookmark in the browsing history. // Update the current bookmark in the browsing history.
PDFHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber); PDFViewerApplication.pdfHistory.updateCurrentBookmark(location.pdfOpenParams,
location.pageNumber);
// Show/hide the loading indicator in the page number input element. // Show/hide the loading indicator in the page number input element.
var pageNumberInput = document.getElementById('pageNumber'); var pageNumberInput = document.getElementById('pageNumber');
@ -1665,7 +1676,7 @@ window.addEventListener('resize', function webViewerResize(evt) {
}); });
window.addEventListener('hashchange', function webViewerHashchange(evt) { window.addEventListener('hashchange', function webViewerHashchange(evt) {
if (PDFHistory.isHashChangeUnlocked) { if (PDFViewerApplication.pdfHistory.isHashChangeUnlocked) {
var hash = document.location.hash.substring(1); var hash = document.location.hash.substring(1);
if (!hash) { if (!hash) {
return; return;
@ -2070,13 +2081,13 @@ window.addEventListener('keydown', function keydown(evt) {
switch (evt.keyCode) { switch (evt.keyCode) {
case 37: // left arrow case 37: // left arrow
if (isViewerInPresentationMode) { if (isViewerInPresentationMode) {
PDFHistory.back(); PDFViewerApplication.pdfHistory.back();
handled = true; handled = true;
} }
break; break;
case 39: // right arrow case 39: // right arrow
if (isViewerInPresentationMode) { if (isViewerInPresentationMode) {
PDFHistory.forward(); PDFViewerApplication.pdfHistory.forward();
handled = true; handled = true;
} }
break; break;