Browse Source

Use `createPromiseCapability` in `/web` files

In various viewer files, there's a number of cases where we basically duplicate the functionality of `createPromiseCapability` manually.
As far as I can tell, a couple of these cases have existed for a very long time, and notable even before the `createPromiseCapability` utility function existed.

Also, since we can write ES6 code now, the patch also replaces a couple of `bind` usages with arrow functions in code that's touched in the patch.
Jonas Jenwald 8 years ago
parent
commit
b0a4f6de8f
  1. 2
      .eslintrc
  2. 20
      web/pdf_document_properties.js
  3. 6
      web/pdf_find_controller.js
  4. 15
      web/pdf_page_view.js
  5. 16
      web/pdf_thumbnail_view.js
  6. 86
      web/pdf_viewer.js

2
.eslintrc

@ -138,7 +138,7 @@
}], }],
// ECMAScript 6 // ECMAScript 6
"arrow-body-style": ["error", "as-needed"], "arrow-body-style": ["error", "always"],
"arrow-parens": ["error", "always"], "arrow-parens": ["error", "always"],
"arrow-spacing": ["error", { "arrow-spacing": ["error", {
"before": true, "before": true,

20
web/pdf_document_properties.js

@ -14,6 +14,7 @@
*/ */
import { getPDFFileNameFromURL, mozL10n } from './ui_utils'; import { getPDFFileNameFromURL, mozL10n } from './ui_utils';
import { createPromiseCapability } from './pdfjs';
import { OverlayManager } from './overlay_manager'; import { OverlayManager } from './overlay_manager';
/** /**
@ -44,10 +45,7 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() {
if (options.closeButton) { if (options.closeButton) {
options.closeButton.addEventListener('click', this.close.bind(this)); options.closeButton.addEventListener('click', this.close.bind(this));
} }
this._dataAvailableCapability = createPromiseCapability();
this.dataAvailablePromise = new Promise(function (resolve) {
this.resolveDataAvailable = resolve;
}.bind(this));
OverlayManager.register(this.overlayName, this.container, OverlayManager.register(this.overlayName, this.container,
this.close.bind(this)); this.close.bind(this));
@ -59,9 +57,9 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() {
*/ */
open: function PDFDocumentProperties_open() { open: function PDFDocumentProperties_open() {
Promise.all([OverlayManager.open(this.overlayName), Promise.all([OverlayManager.open(this.overlayName),
this.dataAvailablePromise]).then(function () { this._dataAvailableCapability.promise]).then(() => {
this._getProperties(); this._getProperties();
}.bind(this)); });
}, },
/** /**
@ -97,7 +95,7 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() {
function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) { function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) {
this.pdfDocument = pdfDocument; this.pdfDocument = pdfDocument;
this.url = url; this.url = url;
this.resolveDataAvailable(); this._dataAvailableCapability.resolve();
}, },
/** /**
@ -110,16 +108,16 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() {
return; return;
} }
// Get the file size (if it hasn't already been set). // 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) { if (data.length === this.rawFileSize) {
return; return;
} }
this.setFileSize(data.length); this.setFileSize(data.length);
this._updateUI(this.fields['fileSize'], this._parseFileSize()); this._updateUI(this.fields['fileSize'], this._parseFileSize());
}.bind(this)); });
// Get the document properties. // Get the document properties.
this.pdfDocument.getMetadata().then(function(data) { this.pdfDocument.getMetadata().then((data) => {
var content = { var content = {
'fileName': getPDFFileNameFromURL(this.url), 'fileName': getPDFFileNameFromURL(this.url),
'fileSize': this._parseFileSize(), 'fileSize': this._parseFileSize(),
@ -139,7 +137,7 @@ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() {
for (var identifier in content) { for (var identifier in content) {
this._updateUI(this.fields[identifier], content[identifier]); this._updateUI(this.fields[identifier], content[identifier]);
} }
}.bind(this)); });
}, },
/** /**

6
web/pdf_find_controller.js

@ -81,9 +81,9 @@ var PDFFindController = (function PDFFindControllerClosure() {
this.dirtyMatch = false; this.dirtyMatch = false;
this.findTimeout = null; this.findTimeout = null;
this.firstPagePromise = new Promise(function (resolve) { this._firstPagePromise = new Promise((resolve) => {
this.resolveFirstPage = resolve; this.resolveFirstPage = resolve;
}.bind(this)); });
}, },
normalize: function PDFFindController_normalize(text) { normalize: function PDFFindController_normalize(text) {
@ -277,7 +277,7 @@ var PDFFindController = (function PDFFindControllerClosure() {
this.state = state; this.state = state;
this.updateUIState(FindStates.FIND_PENDING); this.updateUIState(FindStates.FIND_PENDING);
this.firstPagePromise.then(function() { this._firstPagePromise.then(function() {
this.extractText(); this.extractText();
clearTimeout(this.findTimeout); clearTimeout(this.findTimeout);

15
web/pdf_page_view.js

@ -18,7 +18,8 @@ import {
roundToDivide roundToDivide
} from './ui_utils'; } from './ui_utils';
import { import {
CustomStyle, PDFJS, RenderingCancelledException, SVGGraphics createPromiseCapability, CustomStyle, PDFJS, RenderingCancelledException,
SVGGraphics
} from './pdfjs'; } from './pdfjs';
import { domEvents } from './dom_events'; import { domEvents } from './dom_events';
import { RenderingStates } from './pdf_rendering_queue'; import { RenderingStates } from './pdf_rendering_queue';
@ -493,14 +494,10 @@ var PDFPageView = (function PDFPageViewClosure() {
}, },
paintOnCanvas: function (canvasWrapper) { paintOnCanvas: function (canvasWrapper) {
var resolveRenderPromise, rejectRenderPromise; var renderCapability = createPromiseCapability();
var promise = new Promise(function (resolve, reject) {
resolveRenderPromise = resolve;
rejectRenderPromise = reject;
});
var result = { var result = {
promise: promise, promise: renderCapability.promise,
onRenderContinue: function (cont) { onRenderContinue: function (cont) {
cont(); cont();
}, },
@ -589,11 +586,11 @@ var PDFPageView = (function PDFPageViewClosure() {
renderTask.promise.then( renderTask.promise.then(
function pdfPageRenderCallback() { function pdfPageRenderCallback() {
showCanvas(); showCanvas();
resolveRenderPromise(undefined); renderCapability.resolve(undefined);
}, },
function pdfPageRenderError(error) { function pdfPageRenderError(error) {
showCanvas(); showCanvas();
rejectRenderPromise(error); renderCapability.reject(error);
} }
); );

16
web/pdf_thumbnail_view.js

@ -13,8 +13,8 @@
* limitations under the License. * limitations under the License.
*/ */
import { createPromiseCapability, RenderingCancelledException } from './pdfjs';
import { getOutputScale, mozL10n } from './ui_utils'; import { getOutputScale, mozL10n } from './ui_utils';
import { RenderingCancelledException } from './pdfjs';
import { RenderingStates } from './pdf_rendering_queue'; import { RenderingStates } from './pdf_rendering_queue';
var THUMBNAIL_WIDTH = 98; // px var THUMBNAIL_WIDTH = 98; // px
@ -275,11 +275,7 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
this.renderingState = RenderingStates.RUNNING; this.renderingState = RenderingStates.RUNNING;
var resolveRenderPromise, rejectRenderPromise; var renderCapability = createPromiseCapability();
var promise = new Promise(function (resolve, reject) {
resolveRenderPromise = resolve;
rejectRenderPromise = reject;
});
var self = this; var self = this;
function thumbnailDrawCallback(error) { function thumbnailDrawCallback(error) {
@ -293,7 +289,7 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
if (((typeof PDFJSDev === 'undefined' || if (((typeof PDFJSDev === 'undefined' ||
!PDFJSDev.test('PDFJS_NEXT')) && error === 'cancelled') || !PDFJSDev.test('PDFJS_NEXT')) && error === 'cancelled') ||
error instanceof RenderingCancelledException) { error instanceof RenderingCancelledException) {
resolveRenderPromise(undefined); renderCapability.resolve(undefined);
return; return;
} }
@ -301,9 +297,9 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
self._convertCanvasToImage(); self._convertCanvasToImage();
if (!error) { if (!error) {
resolveRenderPromise(undefined); renderCapability.resolve(undefined);
} else { } else {
rejectRenderPromise(error); renderCapability.reject(error);
} }
} }
@ -336,7 +332,7 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
thumbnailDrawCallback(error); thumbnailDrawCallback(error);
} }
); );
return promise; return renderCapability.promise;
}, },
setImage: function PDFThumbnailView_setImage(pageView) { setImage: function PDFThumbnailView_setImage(pageView) {

86
web/pdf_viewer.js

@ -13,17 +13,15 @@
* limitations under the License. * limitations under the License.
*/ */
import { createPromiseCapability, PDFJS } from './pdfjs';
import { import {
CSS_UNITS, DEFAULT_SCALE, DEFAULT_SCALE_VALUE, getVisibleElements, CSS_UNITS, DEFAULT_SCALE, DEFAULT_SCALE_VALUE, getVisibleElements,
MAX_AUTO_SCALE, RendererType, SCROLLBAR_PADDING, scrollIntoView, MAX_AUTO_SCALE, RendererType, SCROLLBAR_PADDING, scrollIntoView,
UNKNOWN_SCALE, VERTICAL_PADDING, watchScroll UNKNOWN_SCALE, VERTICAL_PADDING, watchScroll
} from './ui_utils'; } from './ui_utils';
import { import { PDFRenderingQueue, RenderingStates } from './pdf_rendering_queue';
PDFRenderingQueue, RenderingStates,
} from './pdf_rendering_queue';
import { AnnotationLayerBuilder } from './annotation_layer_builder'; import { AnnotationLayerBuilder } from './annotation_layer_builder';
import { domEvents } from './dom_events'; import { domEvents } from './dom_events';
import { PDFJS } from './pdfjs';
import { PDFPageView } from './pdf_page_view'; import { PDFPageView } from './pdf_page_view';
import { SimpleLinkService } from './pdf_link_service'; import { SimpleLinkService } from './pdf_link_service';
import { TextLayerBuilder } from './text_layer_builder'; import { TextLayerBuilder } from './text_layer_builder';
@ -313,41 +311,34 @@ var PDFViewer = (function pdfViewer() {
if (!pdfDocument) { if (!pdfDocument) {
return; return;
} }
var pagesCount = pdfDocument.numPages; var pagesCount = pdfDocument.numPages;
var self = this;
var resolvePagesPromise; var pagesCapability = createPromiseCapability();
var pagesPromise = new Promise(function (resolve) { this.pagesPromise = pagesCapability.promise;
resolvePagesPromise = resolve;
}); pagesCapability.promise.then(() => {
this.pagesPromise = pagesPromise; this._pageViewsReady = true;
pagesPromise.then(function () { this.eventBus.dispatch('pagesloaded', {
self._pageViewsReady = true; source: this,
self.eventBus.dispatch('pagesloaded', { pagesCount,
source: self,
pagesCount: pagesCount
}); });
}); });
var isOnePageRenderedResolved = false; var isOnePageRenderedResolved = false;
var resolveOnePageRendered = null; var onePageRenderedCapability = createPromiseCapability();
var onePageRendered = new Promise(function (resolve) { this.onePageRendered = onePageRenderedCapability.promise;
resolveOnePageRendered = resolve;
});
this.onePageRendered = onePageRendered;
var bindOnAfterAndBeforeDraw = function (pageView) { var bindOnAfterAndBeforeDraw = (pageView) => {
pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() { pageView.onBeforeDraw = () => {
// Add the page to the buffer at the start of drawing. That way it can // 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 // be evicted from the buffer and destroyed even if we pause its
// rendering. // rendering.
self._buffer.push(this); this._buffer.push(pageView);
}; };
pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { pageView.onAfterDraw = () => {
if (!isOnePageRenderedResolved) { if (!isOnePageRenderedResolved) {
isOnePageRenderedResolved = true; 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 // Fetch a single page so we can get a viewport that will be the default
// viewport for all pages // viewport for all pages
return firstPagePromise.then(function(pdfPage) { return firstPagePromise.then((pdfPage) => {
var scale = this.currentScale; var scale = this.currentScale;
var viewport = pdfPage.getViewport(scale * CSS_UNITS); var viewport = pdfPage.getViewport(scale * CSS_UNITS);
for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
@ -382,34 +373,31 @@ var PDFViewer = (function pdfViewer() {
this._pages.push(pageView); this._pages.push(pageView);
} }
var linkService = this.linkService;
// Fetch all the pages since the viewport is needed before printing // Fetch all the pages since the viewport is needed before printing
// starts to create the correct size canvas. Wait until one page is // starts to create the correct size canvas. Wait until one page is
// rendered so we don't tie up too many resources early on. // rendered so we don't tie up too many resources early on.
onePageRendered.then(function () { onePageRenderedCapability.promise.then(() => {
if (!PDFJS.disableAutoFetch) { 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 {
// XXX: Printing is semi-broken with auto fetch disabled. // 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) { if (this.defaultRenderingQueue) {
this.update(); this.update();
@ -418,7 +406,7 @@ var PDFViewer = (function pdfViewer() {
if (this.findController) { if (this.findController) {
this.findController.resolveFirstPage(); this.findController.resolveFirstPage();
} }
}.bind(this)); });
}, },
/** /**

Loading…
Cancel
Save