Browse Source

Move the `Preferences` initialization/fetching code to the top of `PDFViewerApplication.initialize`, to enable using them when initializing e.g. the viewer components

Note that in quick testing using `console.time/timeEnd`, both locally and with the Firefox addon, the total run time of the *entire* `PDFViewerApplication.initialize` function does not seem to change with this patch.
Jonas Jenwald 8 years ago
parent
commit
849f5dde9d
  1. 188
      web/app.js

188
web/app.js

@ -181,11 +181,16 @@ var PDFViewerApplication = {
eventBus: null, eventBus: null,
pageRotation: 0, pageRotation: 0,
isInitialViewSet: false, isInitialViewSet: false,
preferenceSidebarViewOnLoad: SidebarView.NONE, viewerPrefs: {
preferencePdfBugEnabled: false, sidebarViewOnLoad: SidebarView.NONE,
preferenceShowPreviousViewOnLoad: true, pdfBugEnabled: false,
preferenceDefaultZoomValue: '', showPreviousViewOnLoad: true,
preferenceDisablePageLabels: false, defaultZoomValue: '',
disablePageLabels: false,
renderer: 'canvas',
enhanceTextSelection: false,
renderInteractiveForms: false,
},
isViewerEmbedded: (window.parent !== window), isViewerEmbedded: (window.parent !== window),
url: '', url: '',
baseUrl: '', baseUrl: '',
@ -196,15 +201,15 @@ var PDFViewerApplication = {
var self = this; var self = this;
var PDFJS = pdfjsLib.PDFJS; var PDFJS = pdfjsLib.PDFJS;
configure(pdfjsLib.PDFJS);
this.appConfig = appConfig;
Preferences.initialize(); Preferences.initialize();
this.preferences = Preferences; this.preferences = Preferences;
this._initializeViewerComponents(); configure(PDFJS);
this.appConfig = appConfig;
return this._readPreferences().then(function () { return this._readPreferences().then(function () {
return self._initializeViewerComponents();
}).then(function () {
if (self.isViewerEmbedded && !PDFJS.isExternalLinkTargetSet()) { if (self.isViewerEmbedded && !PDFJS.isExternalLinkTargetSet()) {
// Prevent external links from "replacing" the viewer, // Prevent external links from "replacing" the viewer,
// when it's embedded in e.g. an iframe or an object. // when it's embedded in e.g. an iframe or an object.
@ -227,28 +232,19 @@ var PDFViewerApplication = {
PDFJS.disableWebGL = !value; PDFJS.disableWebGL = !value;
}), }),
Preferences.get('sidebarViewOnLoad').then(function resolved(value) { Preferences.get('sidebarViewOnLoad').then(function resolved(value) {
self.preferenceSidebarViewOnLoad = value; self.viewerPrefs['sidebarViewOnLoad'] = value;
}), }),
Preferences.get('pdfBugEnabled').then(function resolved(value) { Preferences.get('pdfBugEnabled').then(function resolved(value) {
self.preferencePdfBugEnabled = value; self.viewerPrefs['pdfBugEnabled'] = value;
}), }),
Preferences.get('showPreviousViewOnLoad').then(function resolved(value) { Preferences.get('showPreviousViewOnLoad').then(function resolved(value) {
self.preferenceShowPreviousViewOnLoad = value; self.viewerPrefs['showPreviousViewOnLoad'] = value;
}), }),
Preferences.get('defaultZoomValue').then(function resolved(value) { Preferences.get('defaultZoomValue').then(function resolved(value) {
self.preferenceDefaultZoomValue = value; self.viewerPrefs['defaultZoomValue'] = value;
}), }),
Preferences.get('enhanceTextSelection').then(function resolved(value) { Preferences.get('enhanceTextSelection').then(function resolved(value) {
// TODO: Move the initialization and fetching of `Preferences` to occur self.viewerPrefs['enhanceTextSelection'] = value;
// before the various viewer components are initialized.
//
// This was attempted in: https://github.com/mozilla/pdf.js/pull/7586,
// but it had to be backed out since it violated implicit assumptions
// about some viewer components being synchronously available.
//
// NOTE: This hack works since the `enhanceTextSelection` option is not
// needed until `PDFViewer.setDocument` has been called.
self.pdfViewer.enhanceTextSelection = value;
}), }),
Preferences.get('disableTextLayer').then(function resolved(value) { Preferences.get('disableTextLayer').then(function resolved(value) {
if (PDFJS.disableTextLayer === true) { if (PDFJS.disableTextLayer === true) {
@ -287,21 +283,14 @@ var PDFViewerApplication = {
PDFJS.externalLinkTarget = value; PDFJS.externalLinkTarget = value;
}), }),
Preferences.get('renderer').then(function resolved(value) { Preferences.get('renderer').then(function resolved(value) {
// TODO: Like the `enhanceTextSelection` preference, move the self.viewerPrefs['renderer'] = value;
// initialization and fetching of `Preferences` to occur
// before the various viewer components are initialized.
self.pdfViewer.renderer = value;
}), }),
Preferences.get('renderInteractiveForms').then(function resolved(value) { Preferences.get('renderInteractiveForms').then(function resolved(value) {
// TODO: Like the `enhanceTextSelection` preference, move the self.viewerPrefs['renderInteractiveForms'] = value;
// initialization and fetching of `Preferences` to occur
// before the various viewer components are initialized.
self.pdfViewer.renderInteractiveForms = value;
}), }),
Preferences.get('disablePageLabels').then(function resolved(value) { Preferences.get('disablePageLabels').then(function resolved(value) {
self.preferenceDisablePageLabels = value; self.viewerPrefs['disablePageLabels'] = value;
}), }),
// TODO move more preferences and other async stuff here
]).catch(function (reason) { }); ]).catch(function (reason) { });
}, },
@ -309,126 +298,133 @@ var PDFViewerApplication = {
* @private * @private
*/ */
_initializeViewerComponents: function () { _initializeViewerComponents: function () {
var self = this;
var appConfig = this.appConfig; var appConfig = this.appConfig;
return new Promise(function (resolve, reject) {
var eventBus = appConfig.eventBus || getGlobalEventBus(); var eventBus = appConfig.eventBus || getGlobalEventBus();
this.eventBus = eventBus; self.eventBus = eventBus;
this.bindEvents(); self.bindEvents();
var pdfRenderingQueue = new PDFRenderingQueue(); var pdfRenderingQueue = new PDFRenderingQueue();
pdfRenderingQueue.onIdle = this.cleanup.bind(this); pdfRenderingQueue.onIdle = self.cleanup.bind(self);
this.pdfRenderingQueue = pdfRenderingQueue; self.pdfRenderingQueue = pdfRenderingQueue;
var pdfLinkService = new PDFLinkService({ var pdfLinkService = new PDFLinkService({
eventBus: eventBus eventBus: eventBus
}); });
this.pdfLinkService = pdfLinkService; self.pdfLinkService = pdfLinkService;
var downloadManager = this.externalServices.createDownloadManager(); var downloadManager = self.externalServices.createDownloadManager();
this.downloadManager = downloadManager; self.downloadManager = downloadManager;
var container = appConfig.mainContainer; var container = appConfig.mainContainer;
var viewer = appConfig.viewerContainer; var viewer = appConfig.viewerContainer;
this.pdfViewer = new PDFViewer({ self.pdfViewer = new PDFViewer({
container: container, container: container,
viewer: viewer, viewer: viewer,
eventBus: eventBus, eventBus: eventBus,
renderingQueue: pdfRenderingQueue, renderingQueue: pdfRenderingQueue,
linkService: pdfLinkService, linkService: pdfLinkService,
downloadManager: downloadManager, downloadManager: downloadManager,
enhanceTextSelection: false, renderer: self.viewerPrefs['renderer'],
renderInteractiveForms: false, enhanceTextSelection: self.viewerPrefs['enhanceTextSelection'],
renderInteractiveForms: self.viewerPrefs['renderInteractiveForms'],
}); });
pdfRenderingQueue.setViewer(this.pdfViewer); pdfRenderingQueue.setViewer(self.pdfViewer);
pdfLinkService.setViewer(this.pdfViewer); pdfLinkService.setViewer(self.pdfViewer);
var thumbnailContainer = appConfig.sidebar.thumbnailView; var thumbnailContainer = appConfig.sidebar.thumbnailView;
this.pdfThumbnailViewer = new PDFThumbnailViewer({ self.pdfThumbnailViewer = new PDFThumbnailViewer({
container: thumbnailContainer, container: thumbnailContainer,
renderingQueue: pdfRenderingQueue, renderingQueue: pdfRenderingQueue,
linkService: pdfLinkService linkService: pdfLinkService,
}); });
pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); pdfRenderingQueue.setThumbnailViewer(self.pdfThumbnailViewer);
this.pdfHistory = new PDFHistory({ self.pdfHistory = new PDFHistory({
linkService: pdfLinkService, linkService: pdfLinkService,
eventBus: this.eventBus eventBus: eventBus,
}); });
pdfLinkService.setHistory(this.pdfHistory); pdfLinkService.setHistory(self.pdfHistory);
this.findController = new PDFFindController({ self.findController = new PDFFindController({
pdfViewer: this.pdfViewer pdfViewer: self.pdfViewer,
}); });
this.findController.onUpdateResultsCount = function (matchCount) { self.findController.onUpdateResultsCount = function (matchCount) {
if (this.supportsIntegratedFind) { if (self.supportsIntegratedFind) {
return; return;
} }
this.findBar.updateResultsCount(matchCount); self.findBar.updateResultsCount(matchCount);
}.bind(this); };
this.findController.onUpdateState = function (state, previous, matchCount) { self.findController.onUpdateState = function (state, previous,
if (this.supportsIntegratedFind) { matchCount) {
this.externalServices.updateFindControlState( if (self.supportsIntegratedFind) {
self.externalServices.updateFindControlState(
{result: state, findPrevious: previous}); {result: state, findPrevious: previous});
} else { } else {
this.findBar.updateUIState(state, previous, matchCount); self.findBar.updateUIState(state, previous, matchCount);
} }
}.bind(this); };
this.pdfViewer.setFindController(this.findController); self.pdfViewer.setFindController(self.findController);
// FIXME better PDFFindBar constructor parameters // FIXME better PDFFindBar constructor parameters
var findBarConfig = Object.create(appConfig.findBar); var findBarConfig = Object.create(appConfig.findBar);
findBarConfig.findController = this.findController; findBarConfig.findController = self.findController;
findBarConfig.eventBus = this.eventBus; findBarConfig.eventBus = eventBus;
this.findBar = new PDFFindBar(findBarConfig); self.findBar = new PDFFindBar(findBarConfig);
this.overlayManager = OverlayManager; self.overlayManager = OverlayManager;
this.handTool = new HandTool({ self.handTool = new HandTool({
container: container, container: container,
eventBus: this.eventBus, eventBus: eventBus,
}); });
this.pdfDocumentProperties = self.pdfDocumentProperties =
new PDFDocumentProperties(appConfig.documentProperties); new PDFDocumentProperties(appConfig.documentProperties);
this.toolbar = new Toolbar(appConfig.toolbar, container, eventBus); self.toolbar = new Toolbar(appConfig.toolbar, container, eventBus);
this.secondaryToolbar = self.secondaryToolbar =
new SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus); new SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);
if (this.supportsFullscreen) { if (self.supportsFullscreen) {
this.pdfPresentationMode = new PDFPresentationMode({ self.pdfPresentationMode = new PDFPresentationMode({
container: container, container: container,
viewer: viewer, viewer: viewer,
pdfViewer: this.pdfViewer, pdfViewer: self.pdfViewer,
eventBus: this.eventBus, eventBus: eventBus,
contextMenuItems: appConfig.fullscreen contextMenuItems: appConfig.fullscreen
}); });
} }
this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay); self.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay);
this.pdfOutlineViewer = new PDFOutlineViewer({ self.pdfOutlineViewer = new PDFOutlineViewer({
container: appConfig.sidebar.outlineView, container: appConfig.sidebar.outlineView,
eventBus: this.eventBus, eventBus: eventBus,
linkService: pdfLinkService, linkService: pdfLinkService,
}); });
this.pdfAttachmentViewer = new PDFAttachmentViewer({ self.pdfAttachmentViewer = new PDFAttachmentViewer({
container: appConfig.sidebar.attachmentsView, container: appConfig.sidebar.attachmentsView,
eventBus: this.eventBus, eventBus: eventBus,
downloadManager: downloadManager downloadManager: downloadManager,
}); });
// FIXME better PDFSidebar constructor parameters // FIXME better PDFSidebar constructor parameters
var sidebarConfig = Object.create(appConfig.sidebar); var sidebarConfig = Object.create(appConfig.sidebar);
sidebarConfig.pdfViewer = this.pdfViewer; sidebarConfig.pdfViewer = self.pdfViewer;
sidebarConfig.pdfThumbnailViewer = this.pdfThumbnailViewer; sidebarConfig.pdfThumbnailViewer = self.pdfThumbnailViewer;
sidebarConfig.pdfOutlineViewer = this.pdfOutlineViewer; sidebarConfig.pdfOutlineViewer = self.pdfOutlineViewer;
sidebarConfig.eventBus = this.eventBus; sidebarConfig.eventBus = eventBus;
this.pdfSidebar = new PDFSidebar(sidebarConfig); self.pdfSidebar = new PDFSidebar(sidebarConfig);
this.pdfSidebar.onToggled = this.forceRendering.bind(this); self.pdfSidebar.onToggled = self.forceRendering.bind(self);
resolve(undefined);
});
}, },
run: function pdfViewRun(config) { run: function pdfViewRun(config) {
@ -930,7 +926,7 @@ var PDFViewerApplication = {
if (!pdfjsLib.PDFJS.disableHistory && !self.isViewerEmbedded) { if (!pdfjsLib.PDFJS.disableHistory && !self.isViewerEmbedded) {
// The browsing history is only enabled when the viewer is standalone, // The browsing history is only enabled when the viewer is standalone,
// i.e. not when it is embedded in a web page. // i.e. not when it is embedded in a web page.
if (!self.preferenceShowPreviousViewOnLoad) { if (!self.viewerPrefs['showPreviousViewOnLoad']) {
self.pdfHistory.clearHistoryState(); self.pdfHistory.clearHistoryState();
} }
self.pdfHistory.initialize(self.documentFingerprint); self.pdfHistory.initialize(self.documentFingerprint);
@ -950,10 +946,10 @@ var PDFViewerApplication = {
store.initializedPromise.then(function resolved() { store.initializedPromise.then(function resolved() {
var storedHash = null, sidebarView = null; var storedHash = null, sidebarView = null;
if (self.preferenceShowPreviousViewOnLoad && if (self.viewerPrefs['showPreviousViewOnLoad'] &&
store.get('exists', false)) { store.get('exists', false)) {
var pageNum = store.get('page', '1'); var pageNum = store.get('page', '1');
var zoom = self.preferenceDefaultZoomValue || var zoom = self.viewerPrefs['defaultZoomValue'] ||
store.get('zoom', DEFAULT_SCALE_VALUE); store.get('zoom', DEFAULT_SCALE_VALUE);
var left = store.get('scrollLeft', '0'); var left = store.get('scrollLeft', '0');
var top = store.get('scrollTop', '0'); var top = store.get('scrollTop', '0');
@ -962,8 +958,8 @@ var PDFViewerApplication = {
left + ',' + top; left + ',' + top;
sidebarView = store.get('sidebarView', SidebarView.NONE); sidebarView = store.get('sidebarView', SidebarView.NONE);
} else if (self.preferenceDefaultZoomValue) { } else if (self.viewerPrefs['defaultZoomValue']) {
storedHash = 'page=1&zoom=' + self.preferenceDefaultZoomValue; storedHash = 'page=1&zoom=' + self.viewerPrefs['defaultZoomValue'];
} }
self.setInitialView(storedHash, self.setInitialView(storedHash,
{ scale: scale, sidebarView: sidebarView }); { scale: scale, sidebarView: sidebarView });
@ -999,7 +995,7 @@ var PDFViewerApplication = {
}); });
pdfDocument.getPageLabels().then(function (labels) { pdfDocument.getPageLabels().then(function (labels) {
if (!labels || self.preferenceDisablePageLabels) { if (!labels || self.viewerPrefs['disablePageLabels']) {
return; return;
} }
var i = 0, numLabels = labels.length; var i = 0, numLabels = labels.length;
@ -1129,7 +1125,7 @@ var PDFViewerApplication = {
this.isInitialViewSet = true; this.isInitialViewSet = true;
this.pdfSidebar.setInitialView(this.preferenceSidebarViewOnLoad || this.pdfSidebar.setInitialView(this.viewerPrefs['sidebarViewOnLoad'] ||
(sidebarView | 0)); (sidebarView | 0));
if (this.initialDestination) { if (this.initialDestination) {
@ -1386,7 +1382,7 @@ function webViewerInitialized() {
var PDFJS = pdfjsLib.PDFJS; var PDFJS = pdfjsLib.PDFJS;
if ((typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) || if ((typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) ||
PDFViewerApplication.preferencePdfBugEnabled) { PDFViewerApplication.viewerPrefs['pdfBugEnabled']) {
// Special debugging flags in the hash section of the URL. // Special debugging flags in the hash section of the URL.
var hash = document.location.hash.substring(1); var hash = document.location.hash.substring(1);
var hashParams = parseQueryString(hash); var hashParams = parseQueryString(hash);

Loading…
Cancel
Save