From 755c6edc5e8ce21abed278f4484ebaa717359755 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 5 Oct 2018 13:54:16 +0200 Subject: [PATCH] Ensure that the `PDFDocumentLoadingTask` is rejected when "setting up fake worker" failed (issue 10135) This should, hopefully, cover all the possible ways[1] in which "fake workers" are loaded. Given the different code-paths, adding unit-tests might not be that simple. Note that in order to make this work, the various `fakeWorkerFilesLoader` functions were converted to return `Promises`. --- [1] Unfortunately there's lots of them, for various build targets and configurations. --- src/display/api.js | 70 +++++++++++++++++++++++++++++----------------- web/app.js | 14 +++++++--- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/src/display/api.js b/src/display/api.js index 9e58df398ad54..79b1dd0c51f5c 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -45,9 +45,9 @@ const pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null; -var fakeWorkerFilesLoader = null; -var useRequireEnsure = false; +let fakeWorkerFilesLoader = null; if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) { + let useRequireEnsure = false; // For GENERIC build we need to add support for different fake file loaders // for different frameworks. if (typeof window === 'undefined') { @@ -64,21 +64,33 @@ if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) { if (typeof requirejs !== 'undefined' && requirejs.toUrl) { workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js'); } - var dynamicLoaderSupported = + const dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load; - fakeWorkerFilesLoader = useRequireEnsure ? (function (callback) { - __non_webpack_require__.ensure([], function () { - var worker; - if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('LIB')) { - worker = __non_webpack_require__('../pdf.worker.js'); - } else { - worker = __non_webpack_require__('./pdf.worker.js'); - } - callback(worker.WorkerMessageHandler); - }, null, 'pdfjsWorker'); - }) : dynamicLoaderSupported ? (function (callback) { - requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) { - callback(worker.WorkerMessageHandler); + fakeWorkerFilesLoader = useRequireEnsure ? (function() { + return new Promise(function(resolve, reject) { + __non_webpack_require__.ensure([], function() { + try { + let worker; + if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('LIB')) { + worker = __non_webpack_require__('../pdf.worker.js'); + } else { + worker = __non_webpack_require__('./pdf.worker.js'); + } + resolve(worker.WorkerMessageHandler); + } catch (ex) { + reject(ex); + } + }, reject, 'pdfjsWorker'); + }); + }) : dynamicLoaderSupported ? (function() { + return new Promise(function(resolve, reject) { + requirejs(['pdfjs-dist/build/pdf.worker'], function(worker) { + try { + resolve(worker.WorkerMessageHandler); + } catch (ex) { + reject(ex); + } + }, reject); }); }) : null; } @@ -1374,21 +1386,26 @@ var PDFWorker = (function PDFWorkerClosure() { if (typeof SystemJS === 'object') { SystemJS.import('pdfjs/core/worker').then((worker) => { fakeWorkerFilesLoadedCapability.resolve(worker.WorkerMessageHandler); - }); + }).catch(fakeWorkerFilesLoadedCapability.reject); } else if (typeof require === 'function') { - let worker = require('../core/worker.js'); - fakeWorkerFilesLoadedCapability.resolve(worker.WorkerMessageHandler); + try { + let worker = require('../core/worker.js'); + fakeWorkerFilesLoadedCapability.resolve(worker.WorkerMessageHandler); + } catch (ex) { + fakeWorkerFilesLoadedCapability.reject(ex); + } } else { - throw new Error( - 'SystemJS or CommonJS must be used to load fake worker.'); + fakeWorkerFilesLoadedCapability.reject(new Error( + 'SystemJS or CommonJS must be used to load fake worker.')); } } else { - let loader = fakeWorkerFilesLoader || function(callback) { - loadScript(getWorkerSrc()).then(function() { - callback(window.pdfjsWorker.WorkerMessageHandler); + const loader = fakeWorkerFilesLoader || function() { + return loadScript(getWorkerSrc()).then(function() { + return window.pdfjsWorker.WorkerMessageHandler; }); }; - loader(fakeWorkerFilesLoadedCapability.resolve); + loader().then(fakeWorkerFilesLoadedCapability.resolve, + fakeWorkerFilesLoadedCapability.reject); } return fakeWorkerFilesLoadedCapability.promise; } @@ -1592,6 +1609,9 @@ var PDFWorker = (function PDFWorkerClosure() { var messageHandler = new MessageHandler(id, id + '_worker', port); this._messageHandler = messageHandler; this._readyCapability.resolve(); + }).catch((reason) => { + this._readyCapability.reject( + new Error(`Setting up fake worker failed: "${reason.message}".`)); }); }, diff --git a/web/app.js b/web/app.js index 91fcfc9a1235f..b04eebff3064c 100644 --- a/web/app.js +++ b/web/app.js @@ -263,7 +263,9 @@ let PDFViewerApplication = { AppOptions.set('locale', hashParams['locale']); } - return Promise.all(waitOn); + return Promise.all(waitOn).catch((reason) => { + console.error(`_parseHashParameters: "${reason.message}".`); + }); }, /** @@ -1464,10 +1466,14 @@ function loadFakeWorker() { SystemJS.import('pdfjs/core/worker').then((worker) => { window.pdfjsWorker = worker; resolve(); - }); + }).catch(reject); } else if (typeof require === 'function') { - window.pdfjsWorker = require('../src/core/worker.js'); - resolve(); + try { + window.pdfjsWorker = require('../src/core/worker.js'); + resolve(); + } catch (ex) { + reject(ex); + } } else { reject(new Error( 'SystemJS or CommonJS must be used to load fake worker.'));