Re-factor the setupFakeWorkerGlobal function (in src/display/api.js), and the loadFakeWorker function (in web/app.js)

This patch reduces some duplication, by moving *all* fake worker loader code into the `setupFakeWorkerGlobal` function. Furthermore, the functions are simplified further by using `async`/`await` where appropriate.
This commit is contained in:
Jonas Jenwald 2019-12-19 18:11:56 +01:00
parent a5485e1ef7
commit 8519f87efb
2 changed files with 34 additions and 53 deletions

View File

@ -1468,9 +1468,8 @@ const PDFWorker = (function PDFWorkerClosure() {
let isWorkerDisabled = false; let isWorkerDisabled = false;
let fallbackWorkerSrc; let fallbackWorkerSrc;
let nextFakeWorkerId = 0; let nextFakeWorkerId = 0;
let fakeWorkerFilesLoadedCapability; let fakeWorkerCapability;
let fakeWorkerFilesLoader = null;
if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) { if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) {
if (isNodeJS && typeof __non_webpack_require__ === 'function') { if (isNodeJS && typeof __non_webpack_require__ === 'function') {
// Workers aren't supported in Node.js, force-disabling them there. // Workers aren't supported in Node.js, force-disabling them there.
@ -1481,16 +1480,6 @@ const PDFWorker = (function PDFWorkerClosure() {
} else { } else {
fallbackWorkerSrc = './pdf.worker.js'; fallbackWorkerSrc = './pdf.worker.js';
} }
fakeWorkerFilesLoader = function() {
return new Promise(function(resolve, reject) {
try {
const worker = __non_webpack_require__(getWorkerSrc());
resolve(worker.WorkerMessageHandler);
} catch (ex) {
reject(ex);
}
});
};
} else if (typeof document === 'object' && 'currentScript' in document) { } else if (typeof document === 'object' && 'currentScript' in document) {
const pdfjsFilePath = document.currentScript && const pdfjsFilePath = document.currentScript &&
document.currentScript.src; document.currentScript.src;
@ -1525,39 +1514,36 @@ const PDFWorker = (function PDFWorkerClosure() {
// Loads worker code into main thread. // Loads worker code into main thread.
function setupFakeWorkerGlobal() { function setupFakeWorkerGlobal() {
if (fakeWorkerFilesLoadedCapability) { if (fakeWorkerCapability) {
return fakeWorkerFilesLoadedCapability.promise; return fakeWorkerCapability.promise;
} }
fakeWorkerFilesLoadedCapability = createPromiseCapability(); fakeWorkerCapability = createPromiseCapability();
const mainWorkerMessageHandler = getMainThreadWorkerMessageHandler(); const loader = async function() {
if (mainWorkerMessageHandler) { const mainWorkerMessageHandler = getMainThreadWorkerMessageHandler();
// The worker was already loaded using e.g. a `<script>` tag.
fakeWorkerFilesLoadedCapability.resolve(mainWorkerMessageHandler); if (mainWorkerMessageHandler) {
return fakeWorkerFilesLoadedCapability.promise; // The worker was already loaded using e.g. a `<script>` tag.
} return mainWorkerMessageHandler;
// In the developer build load worker_loader.js which in turn loads all the
// other files and resolves the promise. In production only the
// pdf.worker.js file is needed.
if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {
if (typeof SystemJS === 'object') {
SystemJS.import('pdfjs/core/worker').then((worker) => {
fakeWorkerFilesLoadedCapability.resolve(worker.WorkerMessageHandler);
}).catch(fakeWorkerFilesLoadedCapability.reject);
} else {
fakeWorkerFilesLoadedCapability.reject(
new Error('SystemJS must be used to load fake worker.'));
} }
} else { if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {
const loader = fakeWorkerFilesLoader || function() { if (typeof SystemJS !== 'object') {
return loadScript(getWorkerSrc()).then(function() { throw new Error('SystemJS must be used to load fake worker.');
return window.pdfjsWorker.WorkerMessageHandler; }
}); const worker = await SystemJS.import('pdfjs/core/worker');
}; return worker.WorkerMessageHandler;
loader().then(fakeWorkerFilesLoadedCapability.resolve, }
fakeWorkerFilesLoadedCapability.reject); if ((typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) &&
} (isNodeJS && typeof __non_webpack_require__ === 'function')) {
return fakeWorkerFilesLoadedCapability.promise; const worker = __non_webpack_require__(getWorkerSrc());
return worker.WorkerMessageHandler;
}
await loadScript(getWorkerSrc());
return window.pdfjsWorker.WorkerMessageHandler;
};
loader().then(fakeWorkerCapability.resolve, fakeWorkerCapability.reject);
return fakeWorkerCapability.promise;
} }
function createCDNWrapper(url) { function createCDNWrapper(url) {

View File

@ -1523,21 +1523,16 @@ if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {
}; };
} }
function loadFakeWorker() { async function loadFakeWorker() {
if (!GlobalWorkerOptions.workerSrc) { if (!GlobalWorkerOptions.workerSrc) {
GlobalWorkerOptions.workerSrc = AppOptions.get('workerSrc'); GlobalWorkerOptions.workerSrc = AppOptions.get('workerSrc');
} }
if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) { if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {
return new Promise(function(resolve, reject) { if (typeof SystemJS !== 'object') {
if (typeof SystemJS === 'object') { throw new Error('SystemJS must be used to load fake worker.');
SystemJS.import('pdfjs/core/worker').then((worker) => { }
window.pdfjsWorker = worker; window.pdfjsWorker = await SystemJS.import('pdfjs/core/worker');
resolve(); return undefined;
}).catch(reject);
} else {
reject(new Error('SystemJS must be used to load fake worker.'));
}
});
} }
return loadScript(PDFWorker.getWorkerSrc()); return loadScript(PDFWorker.getWorkerSrc());
} }