[api-major] Refactor PDFWorker to be initialized with a parameter object, rather than a bunch of regular parameters

This commit is contained in:
Jonas Jenwald 2018-02-14 16:03:54 +01:00
parent c3c1fc511d
commit 83d52518da
2 changed files with 34 additions and 15 deletions

View File

@ -125,8 +125,8 @@ function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {
* @property {number} rangeChunkSize - Optional parameter to specify
* maximum number of bytes fetched per range request. The default value is
* 2^16 = 65536.
* @property {PDFWorker} worker - The worker that will be used for the loading
* and parsing of the PDF data.
* @property {PDFWorker} worker - (optional) The worker that will be used for
* the loading and parsing of the PDF data.
* @property {string} docBaseUrl - (optional) The base URL of the document,
* used when attempting to recover valid absolute URLs for annotations, and
* outline items, that (incorrectly) only specify relative URLs.
@ -193,7 +193,7 @@ function getDocument(src) {
var params = {};
var rangeTransport = null;
var worker = null;
let worker = null;
var CMapReaderFactory = DOMCMapReaderFactory;
for (var key in source) {
@ -240,10 +240,17 @@ function getDocument(src) {
}
if (!worker) {
const workerParams = {
};
// Worker was not provided -- creating and owning our own. If message port
// is specified in global worker options, using it.
let workerPort = GlobalWorkerOptions.workerPort;
worker = workerPort ? PDFWorker.fromPort(workerPort) : new PDFWorker();
if (workerPort) {
workerParams.port = workerPort;
worker = PDFWorker.fromPort(workerParams);
} else {
worker = new PDFWorker(workerParams);
}
task._worker = worker;
}
var docId = task.docId;
@ -1192,9 +1199,15 @@ class LoopbackPort {
}
}
/**
* @typedef {Object} PDFWorkerParameters
* @property {string} name - (optional) The name of the worker.
* @property {Object} port - (optional) The `workerPort`.
*/
/**
* PDF.js web worker abstraction, it controls instantiation of PDF documents and
* WorkerTransport for them. If creation of a web worker is not possible,
* WorkerTransport for them. If creation of a web worker is not possible,
* a "fake" worker will be used instead.
* @class
*/
@ -1280,7 +1293,10 @@ var PDFWorker = (function PDFWorkerClosure() {
let pdfWorkerPorts = new WeakMap();
function PDFWorker(name, port) {
/**
* @param {PDFWorkerParameters} params - The worker initialization parameters.
*/
function PDFWorker({ name = null, port = null, } = {}) {
if (port && pdfWorkerPorts.has(port)) {
throw new Error('Cannot use more than one PDFWorker per port');
}
@ -1495,11 +1511,14 @@ var PDFWorker = (function PDFWorkerClosure() {
},
};
PDFWorker.fromPort = function (port) {
if (pdfWorkerPorts.has(port)) {
return pdfWorkerPorts.get(port);
/**
* @param {PDFWorkerParameters} params - The worker initialization parameters.
*/
PDFWorker.fromPort = function(params) {
if (pdfWorkerPorts.has(params.port)) {
return pdfWorkerPorts.get(params.port);
}
return new PDFWorker(null, port);
return new PDFWorker(params);
};
PDFWorker.getWorkerSrc = function() {

View File

@ -324,7 +324,7 @@ describe('api', function() {
}
it('worker created or destroyed', function (done) {
var worker = new PDFWorker('test1');
var worker = new PDFWorker({ name: 'test1', });
worker.promise.then(function () {
expect(worker.name).toEqual('test1');
expect(!!worker.port).toEqual(true);
@ -361,7 +361,7 @@ describe('api', function() {
});
});
it('worker created and can be used in getDocument', function (done) {
var worker = new PDFWorker('test1');
var worker = new PDFWorker({ name: 'test1', });
var loadingTask = getDocument(
buildGetDocumentParams(basicApiFileName, {
worker,
@ -386,9 +386,9 @@ describe('api', function() {
});
});
it('creates more than one worker', function (done) {
var worker1 = new PDFWorker('test1');
var worker2 = new PDFWorker('test2');
var worker3 = new PDFWorker('test3');
var worker1 = new PDFWorker({ name: 'test1', });
var worker2 = new PDFWorker({ name: 'test2', });
var worker3 = new PDFWorker({ name: 'test3', });
var ready = Promise.all([worker1.promise, worker2.promise,
worker3.promise]);
ready.then(function () {