diff --git a/src/core.js b/src/core.js index 6b7845efd..284b3cb40 100644 --- a/src/core.js +++ b/src/core.js @@ -39,11 +39,15 @@ function getPdf(arg, callback) { if ('error' in params) xhr.onerror = params.error || undefined; - xhr.onreadystatechange = function getPdfOnreadystatechange() { - if (xhr.readyState === 4 && xhr.status === xhr.expected) { - var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse || - xhr.responseArrayBuffer || xhr.response); - callback(data); + xhr.onreadystatechange = function getPdfOnreadystatechange(e) { + if (xhr.readyState === 4) { + if (xhr.status === xhr.expected) { + var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse || + xhr.responseArrayBuffer || xhr.response); + callback(data); + } else if (params.error) { + params.error(e); + } } }; xhr.send(null); @@ -63,6 +67,9 @@ var Page = (function pagePage() { }; this.xref = xref; this.ref = ref; + + this.ctx = null; + this.callback = null; } constructor.prototype = { @@ -165,8 +172,10 @@ var Page = (function pagePage() { try { self.display(gfx, self.callback); } catch (e) { - if (self.callback) self.callback(e.toString()); - throw e; + if (self.callback) + self.callback(e); + else + throw e; } }); }; @@ -590,6 +599,14 @@ var PDFDoc = (function pdfDoc() { } }.bind(this)); + messageHandler.on('page_error', function pdfDocError(data) { + var page = this.pageCache[data.pageNum]; + if (page.callback) + page.callback(data.error); + else + throw data.error; + }, this); + setTimeout(function pdfDocFontReadySetTimeout() { messageHandler.send('doc', this.data); this.workerReadyPromise.resolve(true); diff --git a/src/worker.js b/src/worker.js index 67f1bf658..8e4c14fbc 100644 --- a/src/worker.js +++ b/src/worker.js @@ -14,7 +14,6 @@ function MessageHandler(name, comObj) { ah['console_error'] = [function ahConsoleError(data) { console.error.apply(console, data); }]; - comObj.onmessage = function messageHandlerComObjOnMessage(event) { var data = event.data; if (data.action in ah) { @@ -67,7 +66,6 @@ var WorkerMessageHandler = { handler.on('page_request', function wphSetupPageRequest(pageNum) { pageNum = parseInt(pageNum); - var page = pdfDoc.getPage(pageNum); // The following code does quite the same as // Page.prototype.startRendering, but stops at one point and sends the @@ -77,9 +75,23 @@ var WorkerMessageHandler = { var start = Date.now(); var dependency = []; - - // Pre compile the pdf page and fetch the fonts/images. - var IRQueue = page.getIRQueue(handler, dependency); + var IRQueue = null; + try { + var page = pdfDoc.getPage(pageNum); + // Pre compile the pdf page and fetch the fonts/images. + IRQueue = page.getIRQueue(handler, dependency); + } catch (e) { + // Turn the error into an obj that can be serialized + e = { + message: e.message, + stack: e.stack + }; + handler.send('page_error', { + pageNum: pageNum, + error: e + }); + return; + } console.log('page=%d - getIRQueue: time=%dms, len=%d', pageNum, Date.now() - start, IRQueue.fnArray.length); diff --git a/test/driver.js b/test/driver.js index c11cecf56..ffaf0b53a 100644 --- a/test/driver.js +++ b/test/driver.js @@ -162,9 +162,11 @@ function nextPage(task, loadError) { page.startRendering( ctx, - function nextPageStartRendering(e) { - snapshotCurrentPage(task, (!failure && e) ? - ('render : ' + e) : failure); + function nextPageStartRendering(error) { + var failureMessage = false; + if (error) + failureMessage = 'render : ' + error.message; + snapshotCurrentPage(task, failureMessage); } ); } catch (e) { diff --git a/web/viewer.css b/web/viewer.css index 3313ce3cb..a1ef92810 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -273,6 +273,38 @@ canvas { display: none; } +#errorWrapper { + background: none repeat scroll 0 0 #FF5555; + color: white; + left: 0; + position: fixed; + right: 0; + top: 30px; + z-index: 1000; + padding: 3px; + font-size: 0.8em; +} + +#errorMessageLeft { + float: left; +} + +#errorMessageRight { + float: right; +} + +#errorMoreInfo { + background-color: #FFFFFF; + color: black; + padding: 3px; + margin: 3px; + white-space: pre; +} + +.clearBoth { + clear: both; +} + /* === Printed media overrides === */ @media print { #sidebar { diff --git a/web/viewer.html b/web/viewer.html index e441a9847..ffd4327a7 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -97,6 +97,24 @@ -- +