From ffb876fdf4b4dbc38273609b9b16b7a341decc02 Mon Sep 17 00:00:00 2001
From: Jonas Jenwald <jonas.jenwald@gmail.com>
Date: Fri, 2 Sep 2016 13:06:35 +0200
Subject: [PATCH] Move the `Preferences` initialization/fetching code to the
 top of `PDFViewerApplication.initialize`, to enable using them when
 initializing the viewer components

---
 web/app.js | 250 +++++++++++++++++++++++++++--------------------------
 1 file changed, 128 insertions(+), 122 deletions(-)

diff --git a/web/app.js b/web/app.js
index a192bfbc7..aed71e46c 100644
--- a/web/app.js
+++ b/web/app.js
@@ -183,131 +183,14 @@ var PDFViewerApplication = {
 
   // called once when the document is loaded
   initialize: function pdfViewInitialize(appConfig) {
-    configure(pdfjsLib.PDFJS);
-    this.appConfig = appConfig;
-
-    var eventBus = appConfig.eventBus || getGlobalEventBus();
-    this.eventBus = eventBus;
-    this.bindEvents();
-
-    var pdfRenderingQueue = new PDFRenderingQueue();
-    pdfRenderingQueue.onIdle = this.cleanup.bind(this);
-    this.pdfRenderingQueue = pdfRenderingQueue;
-
-    var pdfLinkService = new PDFLinkService({
-      eventBus: eventBus
-    });
-    this.pdfLinkService = pdfLinkService;
-
-    var downloadManager = this.externalServices.createDownloadManager();
-    this.downloadManager = downloadManager;
-
-    var container = appConfig.mainContainer;
-    var viewer = appConfig.viewerContainer;
-    this.pdfViewer = new PDFViewer({
-      container: container,
-      viewer: viewer,
-      eventBus: eventBus,
-      renderingQueue: pdfRenderingQueue,
-      linkService: pdfLinkService,
-      downloadManager: downloadManager,
-      enhanceTextSelection: ENHANCE_TEXT_SELECTION,
-    });
-    pdfRenderingQueue.setViewer(this.pdfViewer);
-    pdfLinkService.setViewer(this.pdfViewer);
-
-    var thumbnailContainer = appConfig.sidebar.thumbnailView;
-    this.pdfThumbnailViewer = new PDFThumbnailViewer({
-      container: thumbnailContainer,
-      renderingQueue: pdfRenderingQueue,
-      linkService: pdfLinkService
-    });
-    pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
+    var self = this;
+    var PDFJS = pdfjsLib.PDFJS;
 
     Preferences.initialize();
     this.preferences = Preferences;
-
-    this.pdfHistory = new PDFHistory({
-      linkService: pdfLinkService,
-      eventBus: this.eventBus
-    });
-    pdfLinkService.setHistory(this.pdfHistory);
-
-    this.findController = new PDFFindController({
-      pdfViewer: this.pdfViewer
-    });
-    this.findController.onUpdateResultsCount = function (matchCount) {
-      if (this.supportsIntegratedFind) {
-        return;
-      }
-      this.findBar.updateResultsCount(matchCount);
-    }.bind(this);
-    this.findController.onUpdateState = function (state, previous, matchCount) {
-      if (this.supportsIntegratedFind) {
-        this.externalServices.updateFindControlState(
-          {result: state, findPrevious: previous});
-      } else {
-        this.findBar.updateUIState(state, previous, matchCount);
-      }
-    }.bind(this);
-
-    this.pdfViewer.setFindController(this.findController);
-
-    // FIXME better PDFFindBar constructor parameters
-    var findBarConfig = Object.create(appConfig.findBar);
-    findBarConfig.findController = this.findController;
-    findBarConfig.eventBus = this.eventBus;
-    this.findBar = new PDFFindBar(findBarConfig);
-
-    this.overlayManager = OverlayManager;
-
-    this.handTool = new HandTool({
-      container: container,
-      eventBus: this.eventBus,
-    });
-
-    this.pdfDocumentProperties =
-      new PDFDocumentProperties(appConfig.documentProperties);
-
-    this.secondaryToolbar =
-      new SecondaryToolbar(appConfig.secondaryToolbar, eventBus);
-
-    if (this.supportsFullscreen) {
-      this.pdfPresentationMode = new PDFPresentationMode({
-        container: container,
-        viewer: viewer,
-        pdfViewer: this.pdfViewer,
-        eventBus: this.eventBus,
-        contextMenuItems: appConfig.fullscreen
-      });
-    }
-
-    this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay);
-
-    this.pdfOutlineViewer = new PDFOutlineViewer({
-      container: appConfig.sidebar.outlineView,
-      eventBus: this.eventBus,
-      linkService: pdfLinkService,
-    });
-
-    this.pdfAttachmentViewer = new PDFAttachmentViewer({
-      container: appConfig.sidebar.attachmentsView,
-      eventBus: this.eventBus,
-      downloadManager: downloadManager
-    });
-
-    // FIXME better PDFSidebar constructor parameters
-    var sidebarConfig = Object.create(appConfig.sidebar);
-    sidebarConfig.pdfViewer = this.pdfViewer;
-    sidebarConfig.pdfThumbnailViewer = this.pdfThumbnailViewer;
-    sidebarConfig.pdfOutlineViewer = this.pdfOutlineViewer;
-    sidebarConfig.eventBus = this.eventBus;
-    this.pdfSidebar = new PDFSidebar(sidebarConfig);
-    this.pdfSidebar.onToggled = this.forceRendering.bind(this);
-
-    var self = this;
-    var PDFJS = pdfjsLib.PDFJS;
-    var initializedPromise = Promise.all([
+    // Fetch the `Preferences` first, so that they can be used below when the
+    // various viewer components are initialized.
+    var preferencesPromise = Promise.all([
       Preferences.get('enableWebGL').then(function resolved(value) {
         PDFJS.disableWebGL = !value;
       }),
@@ -362,6 +245,129 @@ var PDFViewerApplication = {
       // TODO move more preferences and other async stuff here
     ]).catch(function (reason) { });
 
+    var initializedPromise = preferencesPromise.then(function () {
+      configure(pdfjsLib.PDFJS);
+      this.appConfig = appConfig;
+
+      var eventBus = appConfig.eventBus || getGlobalEventBus();
+      this.eventBus = eventBus;
+      this.bindEvents();
+
+      var pdfRenderingQueue = new PDFRenderingQueue();
+      pdfRenderingQueue.onIdle = this.cleanup.bind(this);
+      this.pdfRenderingQueue = pdfRenderingQueue;
+
+      var pdfLinkService = new PDFLinkService({
+        eventBus: eventBus
+      });
+      this.pdfLinkService = pdfLinkService;
+
+      var downloadManager = this.externalServices.createDownloadManager();
+      this.downloadManager = downloadManager;
+
+      var container = appConfig.mainContainer;
+      var viewer = appConfig.viewerContainer;
+      this.pdfViewer = new PDFViewer({
+        container: container,
+        viewer: viewer,
+        eventBus: eventBus,
+        renderingQueue: pdfRenderingQueue,
+        linkService: pdfLinkService,
+        downloadManager: downloadManager,
+        enhanceTextSelection: ENHANCE_TEXT_SELECTION,
+      });
+      pdfRenderingQueue.setViewer(this.pdfViewer);
+      pdfLinkService.setViewer(this.pdfViewer);
+
+      var thumbnailContainer = appConfig.sidebar.thumbnailView;
+      this.pdfThumbnailViewer = new PDFThumbnailViewer({
+        container: thumbnailContainer,
+        renderingQueue: pdfRenderingQueue,
+        linkService: pdfLinkService
+      });
+      pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
+
+      this.pdfHistory = new PDFHistory({
+        linkService: pdfLinkService,
+        eventBus: this.eventBus
+      });
+      pdfLinkService.setHistory(this.pdfHistory);
+
+      this.findController = new PDFFindController({
+        pdfViewer: this.pdfViewer
+      });
+      this.findController.onUpdateResultsCount = function (matchCount) {
+        if (this.supportsIntegratedFind) {
+          return;
+        }
+        this.findBar.updateResultsCount(matchCount);
+      }.bind(this);
+      this.findController.onUpdateState = function (state, previous,
+                                                    matchCount) {
+        if (this.supportsIntegratedFind) {
+          this.externalServices.updateFindControlState(
+            {result: state, findPrevious: previous});
+        } else {
+          this.findBar.updateUIState(state, previous, matchCount);
+        }
+      }.bind(this);
+
+      this.pdfViewer.setFindController(this.findController);
+
+      // FIXME better PDFFindBar constructor parameters
+      var findBarConfig = Object.create(appConfig.findBar);
+      findBarConfig.findController = this.findController;
+      findBarConfig.eventBus = this.eventBus;
+      this.findBar = new PDFFindBar(findBarConfig);
+
+      this.overlayManager = OverlayManager;
+
+      this.handTool = new HandTool({
+        container: container,
+        eventBus: this.eventBus,
+      });
+
+      this.pdfDocumentProperties =
+        new PDFDocumentProperties(appConfig.documentProperties);
+
+      this.secondaryToolbar =
+        new SecondaryToolbar(appConfig.secondaryToolbar, eventBus);
+
+      if (this.supportsFullscreen) {
+        this.pdfPresentationMode = new PDFPresentationMode({
+          container: container,
+          viewer: viewer,
+          pdfViewer: this.pdfViewer,
+          eventBus: this.eventBus,
+          contextMenuItems: appConfig.fullscreen
+        });
+      }
+
+      this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay);
+
+      this.pdfOutlineViewer = new PDFOutlineViewer({
+        container: appConfig.sidebar.outlineView,
+        eventBus: this.eventBus,
+        linkService: pdfLinkService,
+      });
+
+      this.pdfAttachmentViewer = new PDFAttachmentViewer({
+        container: appConfig.sidebar.attachmentsView,
+        eventBus: this.eventBus,
+        downloadManager: downloadManager
+      });
+
+      // FIXME better PDFSidebar constructor parameters
+      var sidebarConfig = Object.create(appConfig.sidebar);
+      sidebarConfig.pdfViewer = this.pdfViewer;
+      sidebarConfig.pdfThumbnailViewer = this.pdfThumbnailViewer;
+      sidebarConfig.pdfOutlineViewer = this.pdfOutlineViewer;
+      sidebarConfig.eventBus = this.eventBus;
+      this.pdfSidebar = new PDFSidebar(sidebarConfig);
+      this.pdfSidebar.onToggled = this.forceRendering.bind(this);
+
+    }.bind(this));
+
     return initializedPromise.then(function () {
       if (self.isViewerEmbedded && !PDFJS.isExternalLinkTargetSet()) {
         // Prevent external links from "replacing" the viewer,