Convert the WorkerTransport class, in src/display/api.js, to ES6 syntax

This commit is contained in:
Tim van der Meij 2018-08-26 18:32:25 +02:00
parent 9c37599fd3
commit 4874e9ace0
No known key found for this signature in database
GPG Key ID: 8C3FD2925A5F2762

View File

@ -1629,8 +1629,8 @@ var PDFWorker = (function PDFWorkerClosure() {
* For internal use only. * For internal use only.
* @ignore * @ignore
*/ */
var WorkerTransport = (function WorkerTransportClosure() { class WorkerTransport {
function WorkerTransport(messageHandler, loadingTask, networkStream, params) { constructor(messageHandler, loadingTask, networkStream, params) {
this.messageHandler = messageHandler; this.messageHandler = messageHandler;
this.loadingTask = loadingTask; this.loadingTask = loadingTask;
this.commonObjs = new PDFObjects(); this.commonObjs = new PDFObjects();
@ -1655,8 +1655,8 @@ var WorkerTransport = (function WorkerTransportClosure() {
this.setupMessageHandler(); this.setupMessageHandler();
} }
WorkerTransport.prototype = {
destroy: function WorkerTransport_destroy() { destroy() {
if (this.destroyCapability) { if (this.destroyCapability) {
return this.destroyCapability.promise; return this.destroyCapability.promise;
} }
@ -1669,7 +1669,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
new Error('Worker was destroyed during onPassword callback')); new Error('Worker was destroyed during onPassword callback'));
} }
var waitOn = []; const waitOn = [];
// We need to wait for all renderings to be completed, e.g. // We need to wait for all renderings to be completed, e.g.
// timeout/rAF can take a long time. // timeout/rAF can take a long time.
this.pageCache.forEach(function(page) { this.pageCache.forEach(function(page) {
@ -1680,7 +1680,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
this.pageCache = []; this.pageCache = [];
this.pagePromises = []; this.pagePromises = [];
// We also need to wait for the worker to finish its long running tasks. // We also need to wait for the worker to finish its long running tasks.
var terminated = this.messageHandler.sendWithPromise('Terminate', null); const terminated = this.messageHandler.sendWithPromise('Terminate', null);
waitOn.push(terminated); waitOn.push(terminated);
Promise.all(waitOn).then(() => { Promise.all(waitOn).then(() => {
this.fontLoader.clear(); this.fontLoader.clear();
@ -1695,11 +1695,10 @@ var WorkerTransport = (function WorkerTransportClosure() {
this.destroyCapability.resolve(); this.destroyCapability.resolve();
}, this.destroyCapability.reject); }, this.destroyCapability.reject);
return this.destroyCapability.promise; return this.destroyCapability.promise;
}, }
setupMessageHandler: function WorkerTransport_setupMessageHandler() { setupMessageHandler() {
var messageHandler = this.messageHandler; const { messageHandler, loadingTask, } = this;
var loadingTask = this.loadingTask;
messageHandler.on('GetReader', function(data, sink) { messageHandler.on('GetReader', function(data, sink) {
assert(this._networkStream); assert(this._networkStream);
@ -1731,21 +1730,19 @@ var WorkerTransport = (function WorkerTransportClosure() {
}, this); }, this);
messageHandler.on('ReaderHeadersReady', function(data) { messageHandler.on('ReaderHeadersReady', function(data) {
let headersCapability = createPromiseCapability(); const headersCapability = createPromiseCapability();
let fullReader = this._fullReader; const fullReader = this._fullReader;
fullReader.headersReady.then(() => { fullReader.headersReady.then(() => {
// If stream or range are disabled, it's our only way to report // If stream or range are disabled, it's our only way to report
// loading progress. // loading progress.
if (!fullReader.isStreamingSupported || if (!fullReader.isStreamingSupported ||
!fullReader.isRangeSupported) { !fullReader.isRangeSupported) {
if (this._lastProgress) { if (this._lastProgress) {
let loadingTask = this.loadingTask;
if (loadingTask.onProgress) { if (loadingTask.onProgress) {
loadingTask.onProgress(this._lastProgress); loadingTask.onProgress(this._lastProgress);
} }
} }
fullReader.onProgress = (evt) => { fullReader.onProgress = (evt) => {
let loadingTask = this.loadingTask;
if (loadingTask.onProgress) { if (loadingTask.onProgress) {
loadingTask.onProgress({ loadingTask.onProgress({
loaded: evt.loaded, loaded: evt.loaded,
@ -1767,11 +1764,11 @@ var WorkerTransport = (function WorkerTransportClosure() {
messageHandler.on('GetRangeReader', function(data, sink) { messageHandler.on('GetRangeReader', function(data, sink) {
assert(this._networkStream); assert(this._networkStream);
let _rangeReader = const rangeReader =
this._networkStream.getRangeReader(data.begin, data.end); this._networkStream.getRangeReader(data.begin, data.end);
sink.onPull = () => { sink.onPull = () => {
_rangeReader.read().then(function({ value, done, }) { rangeReader.read().then(function({ value, done, }) {
if (done) { if (done) {
sink.close(); sink.close();
return; return;
@ -1784,24 +1781,21 @@ var WorkerTransport = (function WorkerTransportClosure() {
}; };
sink.onCancel = (reason) => { sink.onCancel = (reason) => {
_rangeReader.cancel(reason); rangeReader.cancel(reason);
}; };
}, this); }, this);
messageHandler.on('GetDoc', function transportDoc({ pdfInfo, }) { messageHandler.on('GetDoc', function({ pdfInfo, }) {
this.numPages = pdfInfo.numPages; this.numPages = pdfInfo.numPages;
var loadingTask = this.loadingTask; this.pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);
var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask); loadingTask._capability.resolve(this.pdfDocument);
this.pdfDocument = pdfDocument;
loadingTask._capability.resolve(pdfDocument);
}, this); }, this);
messageHandler.on('PasswordRequest', messageHandler.on('PasswordRequest', function(exception) {
function transportPasswordRequest(exception) {
this._passwordCapability = createPromiseCapability(); this._passwordCapability = createPromiseCapability();
if (loadingTask.onPassword) { if (loadingTask.onPassword) {
var updatePassword = (password) => { const updatePassword = (password) => {
this._passwordCapability.resolve({ this._passwordCapability.resolve({
password, password,
}); });
@ -1818,80 +1812,76 @@ var WorkerTransport = (function WorkerTransportClosure() {
return this._passwordCapability.promise; return this._passwordCapability.promise;
}, this); }, this);
messageHandler.on('PasswordException', messageHandler.on('PasswordException', function(exception) {
function transportPasswordException(exception) {
loadingTask._capability.reject( loadingTask._capability.reject(
new PasswordException(exception.message, exception.code)); new PasswordException(exception.message, exception.code));
}, this); }, this);
messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) { messageHandler.on('InvalidPDF', function(exception) {
this.loadingTask._capability.reject( loadingTask._capability.reject(
new InvalidPDFException(exception.message)); new InvalidPDFException(exception.message));
}, this); }, this);
messageHandler.on('MissingPDF', function transportMissingPDF(exception) { messageHandler.on('MissingPDF', function(exception) {
this.loadingTask._capability.reject( loadingTask._capability.reject(
new MissingPDFException(exception.message)); new MissingPDFException(exception.message));
}, this); }, this);
messageHandler.on('UnexpectedResponse', messageHandler.on('UnexpectedResponse', function(exception) {
function transportUnexpectedResponse(exception) { loadingTask._capability.reject(
this.loadingTask._capability.reject(
new UnexpectedResponseException(exception.message, exception.status)); new UnexpectedResponseException(exception.message, exception.status));
}, this); }, this);
messageHandler.on('UnknownError', messageHandler.on('UnknownError', function(exception) {
function transportUnknownError(exception) { loadingTask._capability.reject(
this.loadingTask._capability.reject(
new UnknownErrorException(exception.message, exception.details)); new UnknownErrorException(exception.message, exception.details));
}, this); }, this);
messageHandler.on('DataLoaded', function transportPage(data) { messageHandler.on('DataLoaded', function(data) {
this.downloadInfoCapability.resolve(data); this.downloadInfoCapability.resolve(data);
}, this); }, this);
messageHandler.on('StartRenderPage', function transportRender(data) { messageHandler.on('StartRenderPage', function(data) {
if (this.destroyed) { if (this.destroyed) {
return; // Ignore any pending requests if the worker was terminated. return; // Ignore any pending requests if the worker was terminated.
} }
var page = this.pageCache[data.pageIndex];
const page = this.pageCache[data.pageIndex];
page._stats.timeEnd('Page Request'); page._stats.timeEnd('Page Request');
page._startRenderPage(data.transparency, data.intent); page._startRenderPage(data.transparency, data.intent);
}, this); }, this);
messageHandler.on('RenderPageChunk', function transportRender(data) { messageHandler.on('RenderPageChunk', function(data) {
if (this.destroyed) { if (this.destroyed) {
return; // Ignore any pending requests if the worker was terminated. return; // Ignore any pending requests if the worker was terminated.
} }
var page = this.pageCache[data.pageIndex];
const page = this.pageCache[data.pageIndex];
page._renderPageChunk(data.operatorList, data.intent); page._renderPageChunk(data.operatorList, data.intent);
}, this); }, this);
messageHandler.on('commonobj', function transportObj(data) { messageHandler.on('commonobj', function(data) {
if (this.destroyed) { if (this.destroyed) {
return; // Ignore any pending requests if the worker was terminated. return; // Ignore any pending requests if the worker was terminated.
} }
var id = data[0]; const [id, type, exportedData] = data;
var type = data[1];
if (this.commonObjs.hasData(id)) { if (this.commonObjs.hasData(id)) {
return; return;
} }
switch (type) { switch (type) {
case 'Font': case 'Font':
var exportedData = data[2]; const params = this._params;
let params = this._params;
if ('error' in exportedData) { if ('error' in exportedData) {
var exportedError = exportedData.error; const exportedError = exportedData.error;
warn('Error during font loading: ' + exportedError); warn(`Error during font loading: ${exportedError}`);
this.commonObjs.resolve(id, exportedError); this.commonObjs.resolve(id, exportedError);
break; break;
} }
var fontRegistry = null;
let fontRegistry = null;
if (params.pdfBug && globalScope.FontInspector && if (params.pdfBug && globalScope.FontInspector &&
globalScope.FontInspector.enabled) { globalScope.FontInspector.enabled) {
fontRegistry = { fontRegistry = {
@ -1900,44 +1890,40 @@ var WorkerTransport = (function WorkerTransportClosure() {
}, },
}; };
} }
var font = new FontFaceObject(exportedData, { const font = new FontFaceObject(exportedData, {
isEvalSupported: params.isEvalSupported, isEvalSupported: params.isEvalSupported,
disableFontFace: params.disableFontFace, disableFontFace: params.disableFontFace,
ignoreErrors: params.ignoreErrors, ignoreErrors: params.ignoreErrors,
onUnsupportedFeature: this._onUnsupportedFeature.bind(this), onUnsupportedFeature: this._onUnsupportedFeature.bind(this),
fontRegistry, fontRegistry,
}); });
var fontReady = (fontObjs) => { const fontReady = (fontObjs) => {
this.commonObjs.resolve(id, font); this.commonObjs.resolve(id, font);
}; };
this.fontLoader.bind([font], fontReady); this.fontLoader.bind([font], fontReady);
break; break;
case 'FontPath': case 'FontPath':
this.commonObjs.resolve(id, data[2]); this.commonObjs.resolve(id, exportedData);
break; break;
default: default:
throw new Error(`Got unknown common object type ${type}`); throw new Error(`Got unknown common object type ${type}`);
} }
}, this); }, this);
messageHandler.on('obj', function transportObj(data) { messageHandler.on('obj', function(data) {
if (this.destroyed) { if (this.destroyed) {
return; // Ignore any pending requests if the worker was terminated. return; // Ignore any pending requests if the worker was terminated.
} }
var id = data[0]; const [id, pageIndex, type, imageData] = data;
var pageIndex = data[1]; const pageProxy = this.pageCache[pageIndex];
var type = data[2];
var pageProxy = this.pageCache[pageIndex];
var imageData;
if (pageProxy.objs.hasData(id)) { if (pageProxy.objs.hasData(id)) {
return; return;
} }
switch (type) { switch (type) {
case 'JpegStream': case 'JpegStream':
imageData = data[3];
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const img = new Image(); const img = new Image();
img.onload = function() { img.onload = function() {
@ -1955,11 +1941,10 @@ var WorkerTransport = (function WorkerTransportClosure() {
pageProxy.objs.resolve(id, img); pageProxy.objs.resolve(id, img);
}); });
case 'Image': case 'Image':
imageData = data[3];
pageProxy.objs.resolve(id, imageData); pageProxy.objs.resolve(id, imageData);
// heuristics that will allow not to store large data // Heuristic that will allow us not to store large data.
var MAX_IMAGE_SIZE_TO_STORE = 8000000; const MAX_IMAGE_SIZE_TO_STORE = 8000000;
if (imageData && 'data' in imageData && if (imageData && 'data' in imageData &&
imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) { imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
pageProxy.cleanupAfterRender = true; pageProxy.cleanupAfterRender = true;
@ -1970,12 +1955,11 @@ var WorkerTransport = (function WorkerTransportClosure() {
} }
}, this); }, this);
messageHandler.on('DocProgress', function transportDocProgress(data) { messageHandler.on('DocProgress', function(data) {
if (this.destroyed) { if (this.destroyed) {
return; // Ignore any pending requests if the worker was terminated. return; // Ignore any pending requests if the worker was terminated.
} }
var loadingTask = this.loadingTask;
if (loadingTask.onProgress) { if (loadingTask.onProgress) {
loadingTask.onProgress({ loadingTask.onProgress({
loaded: data.loaded, loaded: data.loaded,
@ -1984,13 +1968,13 @@ var WorkerTransport = (function WorkerTransportClosure() {
} }
}, this); }, this);
messageHandler.on('PageError', function transportError(data) { messageHandler.on('PageError', function(data) {
if (this.destroyed) { if (this.destroyed) {
return; // Ignore any pending requests if the worker was terminated. return; // Ignore any pending requests if the worker was terminated.
} }
var page = this.pageCache[data.pageNum - 1]; const page = this.pageCache[data.pageNum - 1];
var intentState = page.intentStates[data.intent]; const intentState = page.intentStates[data.intent];
if (intentState.displayReadyCapability) { if (intentState.displayReadyCapability) {
intentState.displayReadyCapability.reject(data.error); intentState.displayReadyCapability.reject(data.error);
@ -2001,7 +1985,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
if (intentState.operatorList) { if (intentState.operatorList) {
// Mark operator list as complete. // Mark operator list as complete.
intentState.operatorList.lastChunk = true; intentState.operatorList.lastChunk = true;
for (var i = 0; i < intentState.renderTasks.length; i++) { for (let i = 0; i < intentState.renderTasks.length; i++) {
intentState.renderTasks[i].operatorListChanged(); intentState.renderTasks[i].operatorListChanged();
} }
} }
@ -2020,37 +2004,35 @@ var WorkerTransport = (function WorkerTransportClosure() {
return Promise.reject(new Error('"document" is not defined.')); return Promise.reject(new Error('"document" is not defined.'));
} }
var imageUrl = data[0]; const [imageUrl, components] = data;
var components = data[1];
if (components !== 3 && components !== 1) { if (components !== 3 && components !== 1) {
return Promise.reject( return Promise.reject(
new Error('Only 3 components or 1 component can be returned')); new Error('Only 3 components or 1 component can be returned'));
} }
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
var img = new Image(); const img = new Image();
img.onload = function () { img.onload = function () {
var width = img.width; const width = img.width;
var height = img.height; const height = img.height;
var size = width * height; const size = width * height;
var rgbaLength = size * 4; const rgbaLength = size * 4;
var buf = new Uint8ClampedArray(size * components); const buf = new Uint8ClampedArray(size * components);
var tmpCanvas = document.createElement('canvas'); const tmpCanvas = document.createElement('canvas');
tmpCanvas.width = width; tmpCanvas.width = width;
tmpCanvas.height = height; tmpCanvas.height = height;
var tmpCtx = tmpCanvas.getContext('2d'); const tmpCtx = tmpCanvas.getContext('2d');
tmpCtx.drawImage(img, 0, 0); tmpCtx.drawImage(img, 0, 0);
var data = tmpCtx.getImageData(0, 0, width, height).data; const data = tmpCtx.getImageData(0, 0, width, height).data;
var i, j;
if (components === 3) { if (components === 3) {
for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) { for (let i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
buf[j] = data[i]; buf[j] = data[i];
buf[j + 1] = data[i + 1]; buf[j + 1] = data[i + 1];
buf[j + 2] = data[i + 2]; buf[j + 2] = data[i + 2];
} }
} else if (components === 1) { } else if (components === 1) {
for (i = 0, j = 0; i < rgbaLength; i += 4, j++) { for (let i = 0, j = 0; i < rgbaLength; i += 4, j++) {
buf[j] = data[i]; buf[j] = data[i];
} }
} }
@ -2071,21 +2053,20 @@ var WorkerTransport = (function WorkerTransportClosure() {
name: data.name, name: data.name,
}); });
}, this); }, this);
}, }
_onUnsupportedFeature({ featureId, }) { _onUnsupportedFeature({ featureId, }) {
if (this.destroyed) { if (this.destroyed) {
return; // Ignore any pending requests if the worker was terminated. return; // Ignore any pending requests if the worker was terminated.
} }
let loadingTask = this.loadingTask; if (this.loadingTask.onUnsupportedFeature) {
if (loadingTask.onUnsupportedFeature) { this.loadingTask.onUnsupportedFeature(featureId);
loadingTask.onUnsupportedFeature(featureId); }
} }
},
getData: function WorkerTransport_getData() { getData() {
return this.messageHandler.sendWithPromise('GetData', null); return this.messageHandler.sendWithPromise('GetData', null);
}, }
getPage(pageNumber) { getPage(pageNumber) {
if (!Number.isInteger(pageNumber) || if (!Number.isInteger(pageNumber) ||
@ -2093,74 +2074,74 @@ var WorkerTransport = (function WorkerTransportClosure() {
return Promise.reject(new Error('Invalid page request')); return Promise.reject(new Error('Invalid page request'));
} }
var pageIndex = pageNumber - 1; const pageIndex = pageNumber - 1;
if (pageIndex in this.pagePromises) { if (pageIndex in this.pagePromises) {
return this.pagePromises[pageIndex]; return this.pagePromises[pageIndex];
} }
var promise = this.messageHandler.sendWithPromise('GetPage', { const promise = this.messageHandler.sendWithPromise('GetPage', {
pageIndex, pageIndex,
}).then((pageInfo) => { }).then((pageInfo) => {
if (this.destroyed) { if (this.destroyed) {
throw new Error('Transport destroyed'); throw new Error('Transport destroyed');
} }
let page = new PDFPageProxy(pageIndex, pageInfo, this, const page = new PDFPageProxy(pageIndex, pageInfo, this,
this._params.pdfBug); this._params.pdfBug);
this.pageCache[pageIndex] = page; this.pageCache[pageIndex] = page;
return page; return page;
}); });
this.pagePromises[pageIndex] = promise; this.pagePromises[pageIndex] = promise;
return promise; return promise;
}, }
getPageIndex: function WorkerTransport_getPageIndexByRef(ref) { getPageIndex(ref) {
return this.messageHandler.sendWithPromise('GetPageIndex', { return this.messageHandler.sendWithPromise('GetPageIndex', {
ref, ref,
}).catch(function(reason) { }).catch(function(reason) {
return Promise.reject(new Error(reason)); return Promise.reject(new Error(reason));
}); });
}, }
getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { getAnnotations(pageIndex, intent) {
return this.messageHandler.sendWithPromise('GetAnnotations', { return this.messageHandler.sendWithPromise('GetAnnotations', {
pageIndex, pageIndex,
intent, intent,
}); });
}, }
getDestinations: function WorkerTransport_getDestinations() { getDestinations() {
return this.messageHandler.sendWithPromise('GetDestinations', null); return this.messageHandler.sendWithPromise('GetDestinations', null);
}, }
getDestination: function WorkerTransport_getDestination(id) { getDestination(id) {
if (typeof id !== 'string') { if (typeof id !== 'string') {
return Promise.reject(new Error('Invalid destination request.')); return Promise.reject(new Error('Invalid destination request.'));
} }
return this.messageHandler.sendWithPromise('GetDestination', { return this.messageHandler.sendWithPromise('GetDestination', {
id, id,
}); });
}, }
getPageLabels: function WorkerTransport_getPageLabels() { getPageLabels() {
return this.messageHandler.sendWithPromise('GetPageLabels', null); return this.messageHandler.sendWithPromise('GetPageLabels', null);
}, }
getPageMode() { getPageMode() {
return this.messageHandler.sendWithPromise('GetPageMode', null); return this.messageHandler.sendWithPromise('GetPageMode', null);
}, }
getAttachments: function WorkerTransport_getAttachments() { getAttachments() {
return this.messageHandler.sendWithPromise('GetAttachments', null); return this.messageHandler.sendWithPromise('GetAttachments', null);
}, }
getJavaScript: function WorkerTransport_getJavaScript() { getJavaScript() {
return this.messageHandler.sendWithPromise('GetJavaScript', null); return this.messageHandler.sendWithPromise('GetJavaScript', null);
}, }
getOutline: function WorkerTransport_getOutline() { getOutline() {
return this.messageHandler.sendWithPromise('GetOutline', null); return this.messageHandler.sendWithPromise('GetOutline', null);
}, }
getMetadata: function WorkerTransport_getMetadata() { getMetadata() {
return this.messageHandler.sendWithPromise('GetMetadata', null). return this.messageHandler.sendWithPromise('GetMetadata', null).
then((results) => { then((results) => {
return { return {
@ -2170,16 +2151,16 @@ var WorkerTransport = (function WorkerTransportClosure() {
this._fullReader.filename : null), this._fullReader.filename : null),
}; };
}); });
}, }
getStats: function WorkerTransport_getStats() { getStats() {
return this.messageHandler.sendWithPromise('GetStats', null); return this.messageHandler.sendWithPromise('GetStats', null);
}, }
startCleanup: function WorkerTransport_startCleanup() { startCleanup() {
this.messageHandler.sendWithPromise('Cleanup', null).then(() => { this.messageHandler.sendWithPromise('Cleanup', null).then(() => {
for (var i = 0, ii = this.pageCache.length; i < ii; i++) { for (let i = 0, ii = this.pageCache.length; i < ii; i++) {
var page = this.pageCache[i]; const page = this.pageCache[i];
if (page) { if (page) {
page.cleanup(); page.cleanup();
} }
@ -2187,21 +2168,18 @@ var WorkerTransport = (function WorkerTransportClosure() {
this.commonObjs.clear(); this.commonObjs.clear();
this.fontLoader.clear(); this.fontLoader.clear();
}); });
}, }
get loadingParams() { get loadingParams() {
let params = this._params; const params = this._params;
return shadow(this, 'loadingParams', { return shadow(this, 'loadingParams', {
disableAutoFetch: params.disableAutoFetch, disableAutoFetch: params.disableAutoFetch,
disableCreateObjectURL: params.disableCreateObjectURL, disableCreateObjectURL: params.disableCreateObjectURL,
disableFontFace: params.disableFontFace, disableFontFace: params.disableFontFace,
nativeImageDecoderSupport: params.nativeImageDecoderSupport, nativeImageDecoderSupport: params.nativeImageDecoderSupport,
}); });
}, }
}; }
return WorkerTransport;
})();
/** /**
* A PDF document and page is built of many objects. E.g. there are objects * A PDF document and page is built of many objects. E.g. there are objects