diff --git a/.eslintrc b/.eslintrc index 804a2c2d3..f59deaa13 100644 --- a/.eslintrc +++ b/.eslintrc @@ -138,7 +138,7 @@ }], // ECMAScript 6 - "arrow-body-style": ["error", "as-needed"], + "arrow-body-style": ["error", "always"], "arrow-parens": ["error", "always"], "arrow-spacing": ["error", { "before": true, diff --git a/web/pdf_document_properties.js b/web/pdf_document_properties.js index bc2da5d44..0187dce1c 100644 --- a/web/pdf_document_properties.js +++ b/web/pdf_document_properties.js @@ -14,6 +14,7 @@ */ import { getPDFFileNameFromURL, mozL10n } from './ui_utils'; +import { createPromiseCapability } from './pdfjs'; import { OverlayManager } from './overlay_manager'; /** @@ -44,10 +45,7 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() { if (options.closeButton) { options.closeButton.addEventListener('click', this.close.bind(this)); } - - this.dataAvailablePromise = new Promise(function (resolve) { - this.resolveDataAvailable = resolve; - }.bind(this)); + this._dataAvailableCapability = createPromiseCapability(); OverlayManager.register(this.overlayName, this.container, this.close.bind(this)); @@ -59,9 +57,9 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() { */ open: function PDFDocumentProperties_open() { Promise.all([OverlayManager.open(this.overlayName), - this.dataAvailablePromise]).then(function () { + this._dataAvailableCapability.promise]).then(() => { this._getProperties(); - }.bind(this)); + }); }, /** @@ -97,7 +95,7 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() { function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) { this.pdfDocument = pdfDocument; this.url = url; - this.resolveDataAvailable(); + this._dataAvailableCapability.resolve(); }, /** @@ -110,16 +108,16 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() { return; } // Get the file size (if it hasn't already been set). - this.pdfDocument.getDownloadInfo().then(function(data) { + this.pdfDocument.getDownloadInfo().then((data) => { if (data.length === this.rawFileSize) { return; } this.setFileSize(data.length); this._updateUI(this.fields['fileSize'], this._parseFileSize()); - }.bind(this)); + }); // Get the document properties. - this.pdfDocument.getMetadata().then(function(data) { + this.pdfDocument.getMetadata().then((data) => { var content = { 'fileName': getPDFFileNameFromURL(this.url), 'fileSize': this._parseFileSize(), @@ -139,7 +137,7 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() { for (var identifier in content) { this._updateUI(this.fields[identifier], content[identifier]); } - }.bind(this)); + }); }, /** diff --git a/web/pdf_find_controller.js b/web/pdf_find_controller.js index 305f5229e..dd5590213 100644 --- a/web/pdf_find_controller.js +++ b/web/pdf_find_controller.js @@ -81,9 +81,9 @@ var PDFFindController = (function PDFFindControllerClosure() { this.dirtyMatch = false; this.findTimeout = null; - this.firstPagePromise = new Promise(function (resolve) { + this._firstPagePromise = new Promise((resolve) => { this.resolveFirstPage = resolve; - }.bind(this)); + }); }, normalize: function PDFFindController_normalize(text) { @@ -277,7 +277,7 @@ var PDFFindController = (function PDFFindControllerClosure() { this.state = state; this.updateUIState(FindStates.FIND_PENDING); - this.firstPagePromise.then(function() { + this._firstPagePromise.then(function() { this.extractText(); clearTimeout(this.findTimeout); diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index 79429b22e..161bc50d6 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -18,7 +18,8 @@ import { roundToDivide } from './ui_utils'; import { - CustomStyle, PDFJS, RenderingCancelledException, SVGGraphics + createPromiseCapability, CustomStyle, PDFJS, RenderingCancelledException, + SVGGraphics } from './pdfjs'; import { domEvents } from './dom_events'; import { RenderingStates } from './pdf_rendering_queue'; @@ -493,14 +494,10 @@ var PDFPageView = (function PDFPageViewClosure() { }, paintOnCanvas: function (canvasWrapper) { - var resolveRenderPromise, rejectRenderPromise; - var promise = new Promise(function (resolve, reject) { - resolveRenderPromise = resolve; - rejectRenderPromise = reject; - }); + var renderCapability = createPromiseCapability(); var result = { - promise: promise, + promise: renderCapability.promise, onRenderContinue: function (cont) { cont(); }, @@ -589,11 +586,11 @@ var PDFPageView = (function PDFPageViewClosure() { renderTask.promise.then( function pdfPageRenderCallback() { showCanvas(); - resolveRenderPromise(undefined); + renderCapability.resolve(undefined); }, function pdfPageRenderError(error) { showCanvas(); - rejectRenderPromise(error); + renderCapability.reject(error); } ); diff --git a/web/pdf_thumbnail_view.js b/web/pdf_thumbnail_view.js index ebbf039f7..1a43c2d82 100644 --- a/web/pdf_thumbnail_view.js +++ b/web/pdf_thumbnail_view.js @@ -13,8 +13,8 @@ * limitations under the License. */ +import { createPromiseCapability, RenderingCancelledException } from './pdfjs'; import { getOutputScale, mozL10n } from './ui_utils'; -import { RenderingCancelledException } from './pdfjs'; import { RenderingStates } from './pdf_rendering_queue'; var THUMBNAIL_WIDTH = 98; // px @@ -275,11 +275,7 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() { this.renderingState = RenderingStates.RUNNING; - var resolveRenderPromise, rejectRenderPromise; - var promise = new Promise(function (resolve, reject) { - resolveRenderPromise = resolve; - rejectRenderPromise = reject; - }); + var renderCapability = createPromiseCapability(); var self = this; function thumbnailDrawCallback(error) { @@ -293,7 +289,7 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() { if (((typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PDFJS_NEXT')) && error === 'cancelled') || error instanceof RenderingCancelledException) { - resolveRenderPromise(undefined); + renderCapability.resolve(undefined); return; } @@ -301,9 +297,9 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() { self._convertCanvasToImage(); if (!error) { - resolveRenderPromise(undefined); + renderCapability.resolve(undefined); } else { - rejectRenderPromise(error); + renderCapability.reject(error); } } @@ -336,7 +332,7 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() { thumbnailDrawCallback(error); } ); - return promise; + return renderCapability.promise; }, setImage: function PDFThumbnailView_setImage(pageView) { diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index d4f0d5753..e384ec885 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -13,17 +13,15 @@ * limitations under the License. */ +import { createPromiseCapability, PDFJS } from './pdfjs'; import { CSS_UNITS, DEFAULT_SCALE, DEFAULT_SCALE_VALUE, getVisibleElements, MAX_AUTO_SCALE, RendererType, SCROLLBAR_PADDING, scrollIntoView, UNKNOWN_SCALE, VERTICAL_PADDING, watchScroll } from './ui_utils'; -import { - PDFRenderingQueue, RenderingStates, -} from './pdf_rendering_queue'; +import { PDFRenderingQueue, RenderingStates } from './pdf_rendering_queue'; import { AnnotationLayerBuilder } from './annotation_layer_builder'; import { domEvents } from './dom_events'; -import { PDFJS } from './pdfjs'; import { PDFPageView } from './pdf_page_view'; import { SimpleLinkService } from './pdf_link_service'; import { TextLayerBuilder } from './text_layer_builder'; @@ -313,41 +311,34 @@ var PDFViewer = (function pdfViewer() { if (!pdfDocument) { return; } - var pagesCount = pdfDocument.numPages; - var self = this; - var resolvePagesPromise; - var pagesPromise = new Promise(function (resolve) { - resolvePagesPromise = resolve; - }); - this.pagesPromise = pagesPromise; - pagesPromise.then(function () { - self._pageViewsReady = true; - self.eventBus.dispatch('pagesloaded', { - source: self, - pagesCount: pagesCount + var pagesCapability = createPromiseCapability(); + this.pagesPromise = pagesCapability.promise; + + pagesCapability.promise.then(() => { + this._pageViewsReady = true; + this.eventBus.dispatch('pagesloaded', { + source: this, + pagesCount, }); }); var isOnePageRenderedResolved = false; - var resolveOnePageRendered = null; - var onePageRendered = new Promise(function (resolve) { - resolveOnePageRendered = resolve; - }); - this.onePageRendered = onePageRendered; + var onePageRenderedCapability = createPromiseCapability(); + this.onePageRendered = onePageRenderedCapability.promise; - var bindOnAfterAndBeforeDraw = function (pageView) { - pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() { + var bindOnAfterAndBeforeDraw = (pageView) => { + pageView.onBeforeDraw = () => { // Add the page to the buffer at the start of drawing. That way it can // be evicted from the buffer and destroyed even if we pause its // rendering. - self._buffer.push(this); + this._buffer.push(pageView); }; - pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { + pageView.onAfterDraw = () => { if (!isOnePageRenderedResolved) { isOnePageRenderedResolved = true; - resolveOnePageRendered(); + onePageRenderedCapability.resolve(); } }; }; @@ -357,7 +348,7 @@ var PDFViewer = (function pdfViewer() { // Fetch a single page so we can get a viewport that will be the default // viewport for all pages - return firstPagePromise.then(function(pdfPage) { + return firstPagePromise.then((pdfPage) => { var scale = this.currentScale; var viewport = pdfPage.getViewport(scale * CSS_UNITS); for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { @@ -382,34 +373,31 @@ var PDFViewer = (function pdfViewer() { this._pages.push(pageView); } - var linkService = this.linkService; - // Fetch all the pages since the viewport is needed before printing // starts to create the correct size canvas. Wait until one page is // rendered so we don't tie up too many resources early on. - onePageRendered.then(function () { - if (!PDFJS.disableAutoFetch) { - var getPagesLeft = pagesCount; - for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { - pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) { - var pageView = self._pages[pageNum - 1]; - if (!pageView.pdfPage) { - pageView.setPdfPage(pdfPage); - } - linkService.cachePageRef(pageNum, pdfPage.ref); - getPagesLeft--; - if (!getPagesLeft) { - resolvePagesPromise(); - } - }.bind(null, pageNum)); - } - } else { + onePageRenderedCapability.promise.then(() => { + if (PDFJS.disableAutoFetch) { // XXX: Printing is semi-broken with auto fetch disabled. - resolvePagesPromise(); + pagesCapability.resolve(); + return; + } + var getPagesLeft = pagesCount; + for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { + pdfDocument.getPage(pageNum).then(function(pageNum, pdfPage) { + var pageView = this._pages[pageNum - 1]; + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + this.linkService.cachePageRef(pageNum, pdfPage.ref); + if (--getPagesLeft === 0) { + pagesCapability.resolve(); + } + }.bind(this, pageNum)); } }); - self.eventBus.dispatch('pagesinit', {source: self}); + this.eventBus.dispatch('pagesinit', { source: this }); if (this.defaultRenderingQueue) { this.update(); @@ -418,7 +406,7 @@ var PDFViewer = (function pdfViewer() { if (this.findController) { this.findController.resolveFirstPage(); } - }.bind(this)); + }); }, /** @@ -855,12 +843,13 @@ var PDFViewer = (function pdfViewer() { if (this._pagesRequests[pageNumber]) { return this._pagesRequests[pageNumber]; } - var promise = this.pdfDocument.getPage(pageNumber).then( - function (pdfPage) { - pageView.setPdfPage(pdfPage); + var promise = this.pdfDocument.getPage(pageNumber).then((pdfPage) => { + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } this._pagesRequests[pageNumber] = null; return pdfPage; - }.bind(this)); + }); this._pagesRequests[pageNumber] = promise; return promise; }, @@ -871,9 +860,9 @@ var PDFViewer = (function pdfViewer() { this._pages, this.scroll.down); if (pageView) { - this._ensurePdfPageLoaded(pageView).then(function () { + this._ensurePdfPageLoaded(pageView).then(() => { this.renderingQueue.renderView(pageView); - }.bind(this)); + }); return true; } return false;