From a80c40594193e60a1b2f7a74f901c0b3a9aa93d5 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Tue, 2 May 2017 10:20:13 -0700 Subject: [PATCH] Rename FakeWorkerPort to LoopbackPort and export it --- src/display/api.js | 163 ++++++++++++++++++++++-------------------- src/display/global.js | 4 +- src/main_loader.js | 1 + src/pdf.js | 1 + 4 files changed, 89 insertions(+), 80 deletions(-) diff --git a/src/display/api.js b/src/display/api.js index 4ae4fff75..f9c262565 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -1045,6 +1045,88 @@ var PDFPageProxy = (function PDFPageProxyClosure() { return PDFPageProxy; })(); +class LoopbackPort { + constructor(defer) { + this._listeners = []; + this._defer = defer; + this._deferred = Promise.resolve(undefined); + } + + postMessage(obj, transfers) { + function cloneValue(value) { + // Trying to perform a structured clone close to the spec, including + // transfers. + if (typeof value !== 'object' || value === null) { + return value; + } + if (cloned.has(value)) { // already cloned the object + return cloned.get(value); + } + var result; + var buffer; + if ((buffer = value.buffer) && isArrayBuffer(buffer)) { + // We found object with ArrayBuffer (typed array). + var transferable = transfers && transfers.indexOf(buffer) >= 0; + if (value === buffer) { + // Special case when we are faking typed arrays in compatibility.js. + result = value; + } else if (transferable) { + result = new value.constructor(buffer, value.byteOffset, + value.byteLength); + } else { + result = new value.constructor(value); + } + cloned.set(value, result); + return result; + } + result = isArray(value) ? [] : {}; + cloned.set(value, result); // adding to cache now for cyclic references + // Cloning all value and object properties, however ignoring properties + // defined via getter. + for (var i in value) { + var desc, p = value; + while (!(desc = Object.getOwnPropertyDescriptor(p, i))) { + p = Object.getPrototypeOf(p); + } + if (typeof desc.value === 'undefined' || + typeof desc.value === 'function') { + continue; + } + result[i] = cloneValue(desc.value); + } + return result; + } + + if (!this._defer) { + this._listeners.forEach(function (listener) { + listener.call(this, {data: obj}); + }, this); + return; + } + + var cloned = new WeakMap(); + var e = {data: cloneValue(obj)}; + this._deferred.then(function () { + this._listeners.forEach(function (listener) { + listener.call(this, e); + }, this); + }.bind(this)); + } + + addEventListener(name, listener) { + this._listeners.push(listener); + } + + removeEventListener(name, listener) { + var i = this._listeners.indexOf(listener); + this._listeners.splice(i, 1); + } + + terminate() { + this._listeners = []; + } +} + /** * PDF.js web worker abstraction, it controls instantiation of PDF documents and * WorkerTransport for them. If creation of a web worker is not possible, @@ -1113,84 +1195,6 @@ var PDFWorker = (function PDFWorkerClosure() { return fakeWorkerFilesLoadedCapability.promise; } - function FakeWorkerPort(defer) { - this._listeners = []; - this._defer = defer; - this._deferred = Promise.resolve(undefined); - } - FakeWorkerPort.prototype = { - postMessage(obj, transfers) { - function cloneValue(value) { - // Trying to perform a structured clone close to the spec, including - // transfers. - if (typeof value !== 'object' || value === null) { - return value; - } - if (cloned.has(value)) { // already cloned the object - return cloned.get(value); - } - var result; - var buffer; - if ((buffer = value.buffer) && isArrayBuffer(buffer)) { - // We found object with ArrayBuffer (typed array). - var transferable = transfers && transfers.indexOf(buffer) >= 0; - if (value === buffer) { - // Special case when we are faking typed arrays in compatibility.js. - result = value; - } else if (transferable) { - result = new value.constructor(buffer, value.byteOffset, - value.byteLength); - } else { - result = new value.constructor(value); - } - cloned.set(value, result); - return result; - } - result = isArray(value) ? [] : {}; - cloned.set(value, result); // adding to cache now for cyclic references - // Cloning all value and object properties, however ignoring properties - // defined via getter. - for (var i in value) { - var desc, p = value; - while (!(desc = Object.getOwnPropertyDescriptor(p, i))) { - p = Object.getPrototypeOf(p); - } - if (typeof desc.value === 'undefined' || - typeof desc.value === 'function') { - continue; - } - result[i] = cloneValue(desc.value); - } - return result; - } - - if (!this._defer) { - this._listeners.forEach(function (listener) { - listener.call(this, {data: obj}); - }, this); - return; - } - - var cloned = new WeakMap(); - var e = {data: cloneValue(obj)}; - this._deferred.then(function () { - this._listeners.forEach(function (listener) { - listener.call(this, e); - }, this); - }.bind(this)); - }, - addEventListener(name, listener) { - this._listeners.push(listener); - }, - removeEventListener(name, listener) { - var i = this._listeners.indexOf(listener); - this._listeners.splice(i, 1); - }, - terminate() { - this._listeners = []; - } - }; - function createCDNWrapper(url) { // We will rely on blob URL's property to specify origin. // We want this function to fail in case if createObjectURL or Blob do not @@ -1379,7 +1383,7 @@ var PDFWorker = (function PDFWorkerClosure() { // structured cloning) when typed arrays are not supported. Relying // on a chance that messages will be sent in proper order. var isTypedArraysPresent = Uint8Array !== Float32Array; - var port = new FakeWorkerPort(isTypedArraysPresent); + var port = new LoopbackPort(isTypedArraysPresent); this._port = port; // All fake workers use the same port, making id unique. @@ -2216,6 +2220,7 @@ if (typeof PDFJSDev !== 'undefined') { export { getDocument, + LoopbackPort, PDFDataRangeTransport, PDFWorker, PDFDocumentProxy, diff --git a/src/display/global.js b/src/display/global.js index afa1f6e56..f4af802bd 100644 --- a/src/display/global.js +++ b/src/display/global.js @@ -14,7 +14,8 @@ */ import { - _UnsupportedManager, getDocument, PDFDataRangeTransport, PDFWorker + _UnsupportedManager, getDocument, LoopbackPort, PDFDataRangeTransport, + PDFWorker } from './api'; import { addLinkAttributes, CustomStyle, DEFAULT_LINK_REL, getFilenameFromUrl, @@ -281,6 +282,7 @@ if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('MOZCENTRAL')) { } PDFJS.getDocument = getDocument; +PDFJS.LoopbackPort = LoopbackPort; PDFJS.PDFDataRangeTransport = PDFDataRangeTransport; PDFJS.PDFWorker = PDFWorker; diff --git a/src/main_loader.js b/src/main_loader.js index 0d3c24ba1..aef74011a 100644 --- a/src/main_loader.js +++ b/src/main_loader.js @@ -44,6 +44,7 @@ exports.version = displayAPI.version; exports.getDocument = displayAPI.getDocument; exports.PDFDataRangeTransport = displayAPI.PDFDataRangeTransport; + exports.LoopbackPort = displayAPI.LoopbackPort; exports.PDFWorker = displayAPI.PDFWorker; exports.renderTextLayer = displayTextLayer.renderTextLayer; exports.AnnotationLayer = displayAnnotationLayer.AnnotationLayer; diff --git a/src/pdf.js b/src/pdf.js index 38fc45211..ed8b6c710 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -31,6 +31,7 @@ exports.PDFJS = pdfjsDisplayGlobal.PDFJS; exports.build = pdfjsDisplayAPI.build; exports.version = pdfjsDisplayAPI.version; exports.getDocument = pdfjsDisplayAPI.getDocument; +exports.LoobpackPort = pdfjsDisplayAPI.LoopbackPort; exports.PDFDataRangeTransport = pdfjsDisplayAPI.PDFDataRangeTransport; exports.PDFWorker = pdfjsDisplayAPI.PDFWorker; exports.renderTextLayer = pdfjsDisplayTextLayer.renderTextLayer;