summaryrefslogtreecommitdiffstats
path: root/apps/files_pdfviewer/js/pdfjs/src/worker.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_pdfviewer/js/pdfjs/src/worker.js')
-rw-r--r--[-rwxr-xr-x]apps/files_pdfviewer/js/pdfjs/src/worker.js154
1 files changed, 81 insertions, 73 deletions
diff --git a/apps/files_pdfviewer/js/pdfjs/src/worker.js b/apps/files_pdfviewer/js/pdfjs/src/worker.js
index 67f1bf658e1..42bd610503f 100755..100644
--- a/apps/files_pdfviewer/js/pdfjs/src/worker.js
+++ b/apps/files_pdfviewer/js/pdfjs/src/worker.js
@@ -6,6 +6,8 @@
function MessageHandler(name, comObj) {
this.name = name;
this.comObj = comObj;
+ this.callbackIndex = 1;
+ var callbacks = this.callbacks = {};
var ah = this.actionHandler = {};
ah['console_log'] = [function ahConsoleLog(data) {
@@ -17,11 +19,32 @@ function MessageHandler(name, comObj) {
comObj.onmessage = function messageHandlerComObjOnMessage(event) {
var data = event.data;
- if (data.action in ah) {
+ if (data.isReply) {
+ var callbackId = data.callbackId;
+ if (data.callbackId in callbacks) {
+ var callback = callbacks[callbackId];
+ delete callbacks[callbackId];
+ callback(data.data);
+ } else {
+ error('Cannot resolve callback ' + callbackId);
+ }
+ } else if (data.action in ah) {
var action = ah[data.action];
- action[0].call(action[1], data.data);
+ if (data.callbackId) {
+ var promise = new Promise();
+ promise.then(function(resolvedData) {
+ comObj.postMessage({
+ isReply: true,
+ callbackId: data.callbackId,
+ data: resolvedData
+ });
+ });
+ action[0].call(action[1], data.data, promise);
+ } else {
+ action[0].call(action[1], data.data);
+ }
} else {
- throw 'Unkown action from worker: ' + data.action;
+ error('Unkown action from worker: ' + data.action);
}
};
}
@@ -30,44 +53,47 @@ MessageHandler.prototype = {
on: function messageHandlerOn(actionName, handler, scope) {
var ah = this.actionHandler;
if (ah[actionName]) {
- throw 'There is already an actionName called "' + actionName + '"';
+ error('There is already an actionName called "' + actionName + '"');
}
ah[actionName] = [handler, scope];
},
-
- send: function messageHandlerSend(actionName, data) {
- this.comObj.postMessage({
+ /**
+ * Sends a message to the comObj to invoke the action with the supplied data.
+ * @param {String} actionName Action to call.
+ * @param {JSON} data JSON data to send.
+ * @param {function} [callback] Optional callback that will handle a reply.
+ */
+ send: function messageHandlerSend(actionName, data, callback) {
+ var message = {
action: actionName,
data: data
- });
+ };
+ if (callback) {
+ var callbackId = this.callbackIndex++;
+ this.callbacks[callbackId] = callback;
+ message.callbackId = callbackId;
+ }
+ this.comObj.postMessage(message);
}
};
var WorkerMessageHandler = {
setup: function wphSetup(handler) {
- var pdfDoc = null;
+ var pdfModel = null;
handler.on('test', function wphSetupTest(data) {
handler.send('test', data instanceof Uint8Array);
});
- handler.on('workerSrc', function wphSetupWorkerSrc(data) {
- // In development, the `workerSrc` message is handled in the
- // `worker_loader.js` file. In production the workerProcessHandler is
- // called for this. This servers as a dummy to prevent calling an
- // undefined action `workerSrc`.
- });
-
handler.on('doc', function wphSetupDoc(data) {
// Create only the model of the PDFDoc, which is enough for
// processing the content of the pdf.
- pdfDoc = new PDFDocModel(new Stream(data));
+ pdfModel = new PDFDocModel(new Stream(data));
});
handler.on('page_request', function wphSetupPageRequest(pageNum) {
pageNum = parseInt(pageNum);
- var page = pdfDoc.getPage(pageNum);
// The following code does quite the same as
// Page.prototype.startRendering, but stops at one point and sends the
@@ -77,12 +103,42 @@ var WorkerMessageHandler = {
var start = Date.now();
var dependency = [];
+ var operatorList = null;
+ try {
+ var page = pdfModel.getPage(pageNum);
+ // Pre compile the pdf page and fetch the fonts/images.
+ operatorList = page.getOperatorList(handler, dependency);
+ } catch (e) {
+ var minimumStackMessage =
+ 'worker.js: while trying to getPage() and getOperatorList()';
+
+ // Turn the error into an obj that can be serialized
+ if (typeof e === 'string') {
+ e = {
+ message: e,
+ stack: minimumStackMessage
+ };
+ } else if (typeof e === 'object') {
+ e = {
+ message: e.message || e.toString(),
+ stack: e.stack || minimumStackMessage
+ };
+ } else {
+ e = {
+ message: 'Unknown exception type: ' + (typeof e),
+ stack: minimumStackMessage
+ };
+ }
- // Pre compile the pdf page and fetch the fonts/images.
- var IRQueue = page.getIRQueue(handler, dependency);
+ handler.send('page_error', {
+ pageNum: pageNum,
+ error: e
+ });
+ return;
+ }
- console.log('page=%d - getIRQueue: time=%dms, len=%d', pageNum,
- Date.now() - start, IRQueue.fnArray.length);
+ console.log('page=%d - getOperatorList: time=%dms, len=%d', pageNum,
+ Date.now() - start, operatorList.fnArray.length);
// Filter the dependecies for fonts.
var fonts = {};
@@ -95,59 +151,10 @@ var WorkerMessageHandler = {
handler.send('page', {
pageNum: pageNum,
- IRQueue: IRQueue,
+ operatorList: operatorList,
depFonts: Object.keys(fonts)
});
}, this);
-
- handler.on('font', function wphSetupFont(data) {
- var objId = data[0];
- var name = data[1];
- var file = data[2];
- var properties = data[3];
-
- var font = {
- name: name,
- file: file,
- properties: properties
- };
-
- // Some fonts don't have a file, e.g. the build in ones like Arial.
- if (file) {
- var fontFileDict = new Dict();
- fontFileDict.map = file.dict.map;
-
- var fontFile = new Stream(file.bytes, file.start,
- file.end - file.start, fontFileDict);
-
- // Check if this is a FlateStream. Otherwise just use the created
- // Stream one. This makes complex_ttf_font.pdf work.
- var cmf = file.bytes[0];
- if ((cmf & 0x0f) == 0x08) {
- font.file = new FlateStream(fontFile);
- } else {
- font.file = fontFile;
- }
- }
-
- var obj = new Font(font.name, font.file, font.properties);
-
- var str = '';
- var objData = obj.data;
- if (objData) {
- var length = objData.length;
- for (var j = 0; j < length; ++j)
- str += String.fromCharCode(objData[j]);
- }
-
- obj.str = str;
-
- // Remove the data array form the font object, as it's not needed
- // anymore as we sent over the ready str.
- delete obj.data;
-
- handler.send('font_ready', [objId, obj]);
- });
}
};
@@ -168,6 +175,7 @@ var workerConsole = {
action: 'console_error',
data: args
});
+ throw 'pdf.js execution error';
},
time: function time(name) {
@@ -177,7 +185,7 @@ var workerConsole = {
timeEnd: function timeEnd(name) {
var time = consoleTimer[name];
if (time == null) {
- throw 'Unkown timer name ' + name;
+ error('Unkown timer name ' + name);
}
this.log('Timer:', name, Date.now() - time);
}