Merge pull request #7107 from Rob--W/worker-loading

Detect premature worker load error
This commit is contained in:
Yury Delendik 2016-04-02 10:40:26 -05:00
commit 055d642bf2

View File

@ -1300,11 +1300,32 @@ var PDFWorker = (function PDFWorkerClosure() {
// https://bugzilla.mozilla.org/show_bug.cgi?id=683280 // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
var worker = new Worker(workerSrc); var worker = new Worker(workerSrc);
var messageHandler = new MessageHandler('main', 'worker', worker); 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) { if (this.destroyed) {
this._readyCapability.reject(new Error('Worker was destroyed')); this._readyCapability.reject(new Error('Worker was destroyed'));
messageHandler.destroy(); } else {
worker.terminate(); // 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 return; // worker was destroyed
} }
var supportTypedArray = data && data.supportTypedArray; var supportTypedArray = data && data.supportTypedArray;
@ -1335,10 +1356,9 @@ var PDFWorker = (function PDFWorkerClosure() {
}); });
messageHandler.on('ready', function (data) { messageHandler.on('ready', function (data) {
worker.removeEventListener('error', onWorkerError);
if (this.destroyed) { if (this.destroyed) {
this._readyCapability.reject(new Error('Worker was destroyed')); terminateEarly();
messageHandler.destroy();
worker.terminate();
return; // worker was destroyed return; // worker was destroyed
} }
try { try {