Rename FakeWorkerPort to LoopbackPort and export it

This commit is contained in:
Tobias Schneider 2017-05-02 10:20:13 -07:00
parent de7002dc6c
commit a80c405941
4 changed files with 89 additions and 80 deletions

View File

@ -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,

View File

@ -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;

View File

@ -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;

View File

@ -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;