diff --git a/src/display/api.js b/src/display/api.js index 53cbda596..681d697f3 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -1300,11 +1300,32 @@ var PDFWorker = (function PDFWorkerClosure() { // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 var worker = new Worker(workerSrc); var messageHandler = new MessageHandler('main', 'worker', worker); - messageHandler.on('test', function PDFWorker_test(data) { + var terminateEarly = function() { + worker.removeEventListener('error', onWorkerError); + messageHandler.destroy(); + worker.terminate(); if (this.destroyed) { this._readyCapability.reject(new Error('Worker was destroyed')); - messageHandler.destroy(); - worker.terminate(); + } else { + // Fall back to fake worker if the termination is caused by an + // error (e.g. NetworkError / SecurityError). + this._setupFakeWorker(); + } + }.bind(this); + + var onWorkerError = function(event) { + if (!this._webWorker) { + // Worker failed to initialize due to an error. Clean up and fall + // back to the fake worker. + terminateEarly(); + } + }.bind(this); + worker.addEventListener('error', onWorkerError); + + messageHandler.on('test', function PDFWorker_test(data) { + worker.removeEventListener('error', onWorkerError); + if (this.destroyed) { + terminateEarly(); return; // worker was destroyed } var supportTypedArray = data && data.supportTypedArray; @@ -1335,10 +1356,9 @@ var PDFWorker = (function PDFWorkerClosure() { }); messageHandler.on('ready', function (data) { + worker.removeEventListener('error', onWorkerError); if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - messageHandler.destroy(); - worker.terminate(); + terminateEarly(); return; // worker was destroyed } try {