From d6925b13ba3749afd29a1d50db7eb6c2509ae6eb Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Mon, 28 Nov 2011 16:55:09 -0800 Subject: [PATCH] Adding new errorback and code to display error messages. --- src/core.js | 21 ++++++++++++++++++--- src/worker.js | 21 ++++++++++++++++----- test/driver.js | 8 +++++--- web/viewer.css | 31 +++++++++++++++++++++++++++++++ web/viewer.html | 18 ++++++++++++++++++ web/viewer.js | 35 +++++++++++++++++++++++++++++++---- 6 files changed, 119 insertions(+), 15 deletions(-) diff --git a/src/core.js b/src/core.js index 3549eb906..72601fdf7 100644 --- a/src/core.js +++ b/src/core.js @@ -63,6 +63,10 @@ var Page = (function pagePage() { }; this.xref = xref; this.ref = ref; + + this.ctx = null; + this.callback = null; + this.errorback = null; } constructor.prototype = { @@ -165,8 +169,10 @@ var Page = (function pagePage() { try { self.display(gfx, self.callback); } catch (e) { - if (self.callback) self.callback(e.toString()); - throw e; + if (self.errorback) + self.errorback(e); + else + throw e; } }); }; @@ -303,9 +309,10 @@ var Page = (function pagePage() { } return links; }, - startRendering: function pageStartRendering(ctx, callback) { + startRendering: function pageStartRendering(ctx, callback, errorback) { this.ctx = ctx; this.callback = callback; + this.errorback = errorback; this.startRenderingTime = Date.now(); this.pdf.startRendering(this); @@ -599,6 +606,14 @@ var PDFDoc = (function pdfDoc() { } }.bind(this)); + messageHandler.on('page_error', function pdfDocError(data) { + var page = this.pageCache[data.pageNum]; + if (page.errorback) + page.errorback(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..06b9c7a22 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,22 @@ var WorkerMessageHandler = { var start = Date.now(); var dependency = []; - - // Pre compile the pdf page and fetch the fonts/images. - var IRQueue = page.getIRQueue(handler, dependency); + try { + var page = pdfDoc.getPage(pageNum); + // Pre compile the pdf page and fetch the fonts/images. + var 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..48ac77e65 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() { + snapshotCurrentPage(task, false); + }, + function errorNextPageStartRendering(e) { + snapshotCurrentPage(task, 'render : ' + e.message); } ); } catch (e) { diff --git a/web/viewer.css b/web/viewer.css index c379e91c4..81458b612 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -252,6 +252,37 @@ 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; +} + +#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..153b22e80 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -97,6 +97,24 @@ -- +