diff --git a/web/annotations_layer_builder.js b/web/annotations_layer_builder.js index 309f7c033..494ceffb0 100644 --- a/web/annotations_layer_builder.js +++ b/web/annotations_layer_builder.js @@ -154,3 +154,22 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { }; return AnnotationsLayerBuilder; })(); + +/** + * @constructor + * @implements IPDFAnnotationsLayerFactory + */ +function DefaultAnnotationsLayerFactory() {} +DefaultAnnotationsLayerFactory.prototype = { + /** + * @param {HTMLDivElement} pageDiv + * @param {PDFPage} pdfPage + * @returns {AnnotationsLayerBuilder} + */ + createAnnotationsLayerBuilder: function (pageDiv, pdfPage) { + return new AnnotationsLayerBuilder({ + pageDiv: pageDiv, + pdfPage: pdfPage + }); + } +}; diff --git a/web/interfaces.js b/web/interfaces.js index b99338c49..37a7b19d0 100644 --- a/web/interfaces.js +++ b/web/interfaces.js @@ -67,9 +67,9 @@ IRenderableView.prototype = { */ get renderingState() {}, /** - * @param {function} callback - The draw completion callback. + * @returns {Promise} Resolved on draw completion. */ - draw: function (callback) {}, + draw: function () {}, resume: function () {}, }; diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index 50d3c2b9b..cb0725a3c 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -14,7 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals RenderingStates, PDFJS, CustomStyle, CSS_UNITS, getOutputScale */ +/* globals RenderingStates, PDFJS, CustomStyle, CSS_UNITS, getOutputScale, + TextLayerBuilder, AnnotationsLayerBuilder, Promise */ 'use strict'; @@ -286,7 +287,7 @@ var PDFPageView = (function PDFPageViewClosure() { return this.viewport.convertToPdfPoint(x, y); }, - draw: function PDFPageView_draw(callback) { + draw: function PDFPageView_draw() { if (this.renderingState !== RenderingStates.INITIAL) { console.error('Must be in new state before drawing'); } @@ -373,6 +374,12 @@ var PDFPageView = (function PDFPageViewClosure() { ctx.scale(outputScale.sx, outputScale.sy); } + var resolveRenderPromise, rejectRenderPromise; + var promise = new Promise(function (resolve, reject) { + resolveRenderPromise = resolve; + rejectRenderPromise = reject; + }); + // Rendering area var self = this; @@ -385,6 +392,7 @@ var PDFPageView = (function PDFPageViewClosure() { } if (error === 'cancelled') { + rejectRenderPromise(error); return; } @@ -412,14 +420,16 @@ var PDFPageView = (function PDFPageViewClosure() { }); div.dispatchEvent(event); - callback(); + if (!error) { + resolveRenderPromise(undefined); + } else { + rejectRenderPromise(error); + } } - var renderContext = { - canvasContext: ctx, - viewport: this.viewport, - // intent: 'default', // === 'display' - continueCallback: function pdfViewcContinueCallback(cont) { + var renderContinueCallback = null; + if (this.renderingQueue) { + renderContinueCallback = function renderContinueCallback(cont) { if (!self.renderingQueue.isHighestPriority(self)) { self.renderingState = RenderingStates.PAUSED; self.resume = function resumeCallback() { @@ -429,7 +439,14 @@ var PDFPageView = (function PDFPageViewClosure() { return; } cont(); - } + }; + } + + var renderContext = { + canvasContext: ctx, + viewport: this.viewport, + // intent: 'default', // === 'display' + continueCallback: renderContinueCallback }; var renderTask = this.renderTask = this.pdfPage.render(renderContext); @@ -462,6 +479,7 @@ var PDFPageView = (function PDFPageViewClosure() { if (self.onBeforeDraw) { self.onBeforeDraw(); } + return promise; }, beforePrint: function PDFPageView_beforePrint() { diff --git a/web/pdf_rendering_queue.js b/web/pdf_rendering_queue.js index c7b1b3aba..b17a1ee58 100644 --- a/web/pdf_rendering_queue.js +++ b/web/pdf_rendering_queue.js @@ -165,7 +165,10 @@ var PDFRenderingQueue = (function PDFRenderingQueueClosure() { break; case RenderingStates.INITIAL: this.highestPriorityPage = view.renderingId; - view.draw(this.renderHighestPriority.bind(this)); + var continueRendering = function () { + this.renderHighestPriority(); + }.bind(this); + view.draw().then(continueRendering, continueRendering); break; } return true; diff --git a/web/text_layer_builder.js b/web/text_layer_builder.js index d300f6354..020dfdf1c 100644 --- a/web/text_layer_builder.js +++ b/web/text_layer_builder.js @@ -385,3 +385,24 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() { }; return TextLayerBuilder; })(); + +/** + * @constructor + * @implements IPDFTextLayerFactory + */ +function DefaultTextLayerFactory() {} +DefaultTextLayerFactory.prototype = { + /** + * @param {HTMLDivElement} textLayerDiv + * @param {number} pageIndex + * @param {PageViewport} viewport + * @returns {TextLayerBuilder} + */ + createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) { + return new TextLayerBuilder({ + textLayerDiv: textLayerDiv, + pageIndex: pageIndex, + viewport: viewport + }); + } +}; diff --git a/web/thumbnail_view.js b/web/thumbnail_view.js index f8c207ee9..e07ab3ab9 100644 --- a/web/thumbnail_view.js +++ b/web/thumbnail_view.js @@ -139,17 +139,22 @@ var ThumbnailView = function thumbnailView(container, id, defaultViewport, return !this.hasImage; }; - this.draw = function thumbnailViewDraw(callback) { + this.draw = function thumbnailViewDraw() { if (this.renderingState !== RenderingStates.INITIAL) { console.error('Must be in new state before drawing'); } this.renderingState = RenderingStates.RUNNING; if (this.hasImage) { - callback(); - return; + return Promise.resolve(undefined); } + var resolveRenderPromise, rejectRenderPromise; + var promise = new Promise(function (resolve, reject) { + resolveRenderPromise = resolve; + rejectRenderPromise = reject; + }); + var self = this; var ctx = this.getPageDrawContext(); var drawViewport = this.viewport.clone({ scale: this.scale }); @@ -171,14 +176,15 @@ var ThumbnailView = function thumbnailView(container, id, defaultViewport, this.pdfPage.render(renderContext).promise.then( function pdfPageRenderCallback() { self.renderingState = RenderingStates.FINISHED; - callback(); + resolveRenderPromise(undefined); }, function pdfPageRenderError(error) { self.renderingState = RenderingStates.FINISHED; - callback(); + rejectRenderPromise(error); } ); this.hasImage = true; + return promise; }; function getTempCanvas(width, height) {