Refactor API to be async.
This commit is contained in:
parent
73cab9c302
commit
fd58f04117
47
src/api.js
47
src/api.js
@ -35,6 +35,7 @@
|
|||||||
// all requirements to run parts of pdf.js in a web worker.
|
// all requirements to run parts of pdf.js in a web worker.
|
||||||
// Right now, the requirement is, that an Uint8Array is still an Uint8Array
|
// Right now, the requirement is, that an Uint8Array is still an Uint8Array
|
||||||
// as it arrives on the worker. Chrome added this with version 15.
|
// as it arrives on the worker. Chrome added this with version 15.
|
||||||
|
globalScope.PDFJS.disableWorker = true;
|
||||||
if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
|
if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
|
||||||
var workerSrc = PDFJS.workerSrc;
|
var workerSrc = PDFJS.workerSrc;
|
||||||
if (typeof workerSrc === 'undefined') {
|
if (typeof workerSrc === 'undefined') {
|
||||||
@ -57,6 +58,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
var messageHandler = new MessageHandler('main', worker);
|
var messageHandler = new MessageHandler('main', worker);
|
||||||
|
this.messageHandler = messageHandler;
|
||||||
|
|
||||||
messageHandler.on('test', function pdfDocTest(supportTypedArray) {
|
messageHandler.on('test', function pdfDocTest(supportTypedArray) {
|
||||||
if (supportTypedArray) {
|
if (supportTypedArray) {
|
||||||
@ -112,20 +114,20 @@
|
|||||||
|
|
||||||
messageHandler.on('getpage', function pdfDocPage(data) {
|
messageHandler.on('getpage', function pdfDocPage(data) {
|
||||||
var pageInfo = data.pageInfo;
|
var pageInfo = data.pageInfo;
|
||||||
var page = new PdfPageWrapper(pageInfo, transport);
|
var page = new PdfPageWrapper(pageInfo, this);
|
||||||
this.pageCache[pageInfo.pageNumber] = pageInfo;
|
this.pageCache[pageInfo.pageNumber] = page;
|
||||||
var promises = this.pagePromises[pageInfo.pageNumber];
|
var promises = this.pagePromises[pageInfo.pageNumber];
|
||||||
delete this.pagePromises[pageInfo.pageNumber];
|
delete this.pagePromises[pageInfo.pageNumber];
|
||||||
for (var i = 0, ii = promises.length; i < ii; ++i)
|
for (var i = 0, ii = promises.length; i < ii; ++i)
|
||||||
promises.resolve(page);
|
promises[i].resolve(page);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
messageHandler.on('page', function pdfDocPage(data) {
|
messageHandler.on('page', function pdfDocPage(data) {
|
||||||
var pageNum = data.pageNum;
|
var pageNum = data.pageNum;
|
||||||
var page = this.pageCache[pageNum];
|
var page = this.pageCache[pageNum - 1];
|
||||||
var depFonts = data.depFonts;
|
var depFonts = data.depFonts;
|
||||||
|
|
||||||
page.stats.timeEnd('Page Request');
|
//page.stats.timeEnd('Page Request');
|
||||||
page.startRenderingFromOperatorList(data.operatorList, depFonts);
|
page.startRenderingFromOperatorList(data.operatorList, depFonts);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
@ -208,26 +210,26 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
sendData: function WorkerTransport_sendData(data) {
|
sendData: function WorkerTransport_sendData(data) {
|
||||||
this.messageHandler.send('doc', data);
|
this.messageHandler.send('doc_request', data);
|
||||||
},
|
},
|
||||||
|
|
||||||
getPage: function WorkerTransport_getPage(n, promise) {
|
getPage: function WorkerTransport_getPage(n, promise) {
|
||||||
if (this.pageCache[n]) {
|
if (this.pageCache[n - 1]) {
|
||||||
promise.resolve(pageCache[n]);
|
promise.resolve(pageCache[n - 1]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (n in this.pagePromises) {
|
if ((n - 1) in this.pagePromises) {
|
||||||
this.pagePromises[n].push(promise);
|
this.pagePromises[n - 1].push(promise);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.pagePromises[n] = [promise];
|
this.pagePromises[n - 1] = [promise];
|
||||||
this.messageHandler.send('getpage', {page: n});
|
this.messageHandler.send('getpage_request', {pageNumber: n - 1});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
function PdfPageWrapper(page, transport) {
|
function PdfPageWrapper(pageInfo, transport) {
|
||||||
this.pageInfo = pageInfo;
|
this.pageInfo = pageInfo;
|
||||||
this.transport = transport;
|
this.transport = transport;
|
||||||
this.stats = new StatTimer();
|
this._stats = new StatTimer();
|
||||||
this.objs = transport.objs;
|
this.objs = transport.objs;
|
||||||
}
|
}
|
||||||
PdfPageWrapper.prototype = {
|
PdfPageWrapper.prototype = {
|
||||||
@ -238,7 +240,7 @@
|
|||||||
return this.pageInfo.rotate;
|
return this.pageInfo.rotate;
|
||||||
},
|
},
|
||||||
get stats() {
|
get stats() {
|
||||||
return this.stats;
|
return this._stats;
|
||||||
},
|
},
|
||||||
get ref() {
|
get ref() {
|
||||||
return this.pageInfo.ref;
|
return this.pageInfo.ref;
|
||||||
@ -258,18 +260,17 @@
|
|||||||
return promise;
|
return promise;
|
||||||
},
|
},
|
||||||
render: function(renderContext) {
|
render: function(renderContext) {
|
||||||
var promise;
|
var promise = new Promise();
|
||||||
var stats = this.stats;
|
var stats = this.stats;
|
||||||
stats.time('Overall');
|
stats.time('Overall');
|
||||||
// If there is no displayReadyPromise yet, then the operatorList was never
|
// If there is no displayReadyPromise yet, then the operatorList was never
|
||||||
// requested before. Make the request and create the promise.
|
// requested before. Make the request and create the promise.
|
||||||
if (!this.displayReadyPromise) {
|
if (!this.displayReadyPromise) {
|
||||||
this.displayReadyPromise = promise = new Promise();
|
this.displayReadyPromise = new Promise();
|
||||||
|
|
||||||
this.stats.time('Page Request');
|
//this.stats.time('Page Request');
|
||||||
this.messageHandler.send('page_request', this.pageNumber + 1);
|
this.transport.messageHandler.send('page_request', this.pageNumber + 1);
|
||||||
} else
|
}
|
||||||
promise = this.displayReadyPromise;
|
|
||||||
|
|
||||||
var callback = (function complete(error) {
|
var callback = (function complete(error) {
|
||||||
if (error)
|
if (error)
|
||||||
@ -345,14 +346,14 @@
|
|||||||
var stats = this.stats;
|
var stats = this.stats;
|
||||||
stats.time('Rendering');
|
stats.time('Rendering');
|
||||||
|
|
||||||
/* REMOVE ??? */
|
/* REMOVE ???
|
||||||
var xref = this.xref;
|
var xref = this.xref;
|
||||||
var resources = this.resources;
|
var resources = this.resources;
|
||||||
assertWellFormed(isDict(resources), 'invalid page resources');
|
assertWellFormed(isDict(resources), 'invalid page resources');
|
||||||
|
|
||||||
gfx.xref = xref;
|
gfx.xref = xref;
|
||||||
gfx.res = resources;
|
gfx.res = resources;
|
||||||
/* REMOVE END */
|
REMOVE END */
|
||||||
|
|
||||||
gfx.beginDrawing(viewport);
|
gfx.beginDrawing(viewport);
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ var WorkerMessageHandler = {
|
|||||||
handler.send('test', data instanceof Uint8Array);
|
handler.send('test', data instanceof Uint8Array);
|
||||||
});
|
});
|
||||||
|
|
||||||
handler.on('doc', function wphSetupDoc(data) {
|
handler.on('doc_request', function wphSetupDoc(data) {
|
||||||
// Create only the model of the PDFDoc, which is enough for
|
// Create only the model of the PDFDoc, which is enough for
|
||||||
// processing the content of the pdf.
|
// processing the content of the pdf.
|
||||||
pdfModel = new PDFDocModel(new Stream(data));
|
pdfModel = new PDFDocModel(new Stream(data));
|
||||||
@ -100,8 +100,8 @@ var WorkerMessageHandler = {
|
|||||||
handler.send('doc', {pdfInfo: doc});
|
handler.send('doc', {pdfInfo: doc});
|
||||||
});
|
});
|
||||||
|
|
||||||
handler.on('getpage', function wphSetupTest(data) {
|
handler.on('getpage_request', function wphSetupTest(data) {
|
||||||
var pdfPage = pdfModel.getPage(data.pageNumber);
|
var pdfPage = pdfModel.getPage(data.pageNumber + 1);
|
||||||
var page = {
|
var page = {
|
||||||
pageNumber: data.pageNumber,
|
pageNumber: data.pageNumber,
|
||||||
rotate: pdfPage.rotate,
|
rotate: pdfPage.rotate,
|
||||||
|
@ -986,7 +986,7 @@ var PageView = function pageView(container, pdfPage, id, scale,
|
|||||||
if (error)
|
if (error)
|
||||||
PDFView.error('An error occurred while rendering the page.', error);
|
PDFView.error('An error occurred while rendering the page.', error);
|
||||||
|
|
||||||
self.stats = content.stats;
|
self.stats = pdfPage.stats;
|
||||||
self.updateStats();
|
self.updateStats();
|
||||||
if (self.onAfterDraw)
|
if (self.onAfterDraw)
|
||||||
self.onAfterDraw();
|
self.onAfterDraw();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user