Merge pull request #7624 from Snuffleupagus/yury-fake-cloning
Adding "proper" message port for fake worker.
This commit is contained in:
commit
230b1e3275
@ -12,7 +12,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/* globals pdfjsFilePath, pdfjsVersion, pdfjsBuild */
|
||||
/* globals pdfjsFilePath, pdfjsVersion, pdfjsBuild, WeakMap */
|
||||
|
||||
'use strict';
|
||||
|
||||
@ -50,6 +50,7 @@ var deprecated = sharedUtil.deprecated;
|
||||
var getVerbosityLevel = sharedUtil.getVerbosityLevel;
|
||||
var info = sharedUtil.info;
|
||||
var isInt = sharedUtil.isInt;
|
||||
var isArray = sharedUtil.isArray;
|
||||
var isArrayBuffer = sharedUtil.isArrayBuffer;
|
||||
var isSameOrigin = sharedUtil.isSameOrigin;
|
||||
var loadJpegStream = sharedUtil.loadJpegStream;
|
||||
@ -1075,6 +1076,84 @@ var PDFWorker = (function PDFWorkerClosure() {
|
||||
return fakeWorkerFilesLoadedCapability.promise;
|
||||
}
|
||||
|
||||
function FakeWorkerPort(defer) {
|
||||
this._listeners = [];
|
||||
this._defer = defer;
|
||||
this._deferred = Promise.resolve(undefined);
|
||||
}
|
||||
FakeWorkerPort.prototype = {
|
||||
postMessage: function (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: function (name, listener) {
|
||||
this._listeners.push(listener);
|
||||
},
|
||||
removeEventListener: function (name, listener) {
|
||||
var i = this._listeners.indexOf(listener);
|
||||
this._listeners.splice(i, 1);
|
||||
},
|
||||
terminate: function () {
|
||||
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
|
||||
@ -1244,24 +1323,11 @@ var PDFWorker = (function PDFWorkerClosure() {
|
||||
return;
|
||||
}
|
||||
|
||||
// If we don't use a worker, just post/sendMessage to the main thread.
|
||||
var port = {
|
||||
_listeners: [],
|
||||
postMessage: function (obj) {
|
||||
var e = {data: obj};
|
||||
this._listeners.forEach(function (listener) {
|
||||
listener.call(this, e);
|
||||
}, this);
|
||||
},
|
||||
addEventListener: function (name, listener) {
|
||||
this._listeners.push(listener);
|
||||
},
|
||||
removeEventListener: function (name, listener) {
|
||||
var i = this._listeners.indexOf(listener);
|
||||
this._listeners.splice(i, 1);
|
||||
},
|
||||
terminate: function () {}
|
||||
};
|
||||
// We cannot turn on proper fake port simulation (this includes
|
||||
// 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);
|
||||
this._port = port;
|
||||
|
||||
// All fake workers use the same port, making id unique.
|
||||
|
Loading…
Reference in New Issue
Block a user