|
|
|
@ -1045,6 +1045,88 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
@@ -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() {
@@ -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() {
@@ -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') {
@@ -2216,6 +2220,7 @@ if (typeof PDFJSDev !== 'undefined') {
|
|
|
|
|
|
|
|
|
|
export { |
|
|
|
|
getDocument, |
|
|
|
|
LoopbackPort, |
|
|
|
|
PDFDataRangeTransport, |
|
|
|
|
PDFWorker, |
|
|
|
|
PDFDocumentProxy, |
|
|
|
|