[api-minor] Add support for OpenAction destinations (issue 10332)
Note that the OpenAction dictionary may contain other information besides just a destination array, e.g. instructions for auto-printing[1]. Given first of all that an arbitrary `Dict` cannot be sent from the Worker (since cloning would fail), and second of all that the data obviously needs to be validated, this patch purposely only adds support for fetching a destination from the OpenAction entry[2]. --- [1] This information is, currently in PDF.js, being included through the `getJavaScript` API method. [2] This significantly reduces the complexity of the implementation, which seems fine for now. If there's ever need for other kinds of OpenAction to be fetched, additional API methods could/should be implemented as necessary (could e.g. follow the `getOpenActionWhatever` naming scheme).
This commit is contained in:
parent
ba2edeae18
commit
b05f053287
@ -392,6 +392,28 @@ class Catalog {
|
|||||||
return shadow(this, 'pageMode', pageMode);
|
return shadow(this, 'pageMode', pageMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get openActionDestination() {
|
||||||
|
const obj = this.catDict.get('OpenAction');
|
||||||
|
let openActionDest = null;
|
||||||
|
|
||||||
|
if (isDict(obj)) {
|
||||||
|
// Convert the OpenAction dictionary into a format that works with
|
||||||
|
// `parseDestDictionary`, to avoid having to re-implement those checks.
|
||||||
|
const destDict = new Dict(this.xref);
|
||||||
|
destDict.set('A', obj);
|
||||||
|
|
||||||
|
const resultObj = { url: null, dest: null, };
|
||||||
|
Catalog.parseDestDictionary({ destDict, resultObj, });
|
||||||
|
|
||||||
|
if (Array.isArray(resultObj.dest)) {
|
||||||
|
openActionDest = resultObj.dest;
|
||||||
|
}
|
||||||
|
} else if (Array.isArray(obj)) {
|
||||||
|
openActionDest = obj;
|
||||||
|
}
|
||||||
|
return shadow(this, 'openActionDestination', openActionDest);
|
||||||
|
}
|
||||||
|
|
||||||
get attachments() {
|
get attachments() {
|
||||||
const obj = this.catDict.get('Names');
|
const obj = this.catDict.get('Names');
|
||||||
let attachments = null;
|
let attachments = null;
|
||||||
|
@ -531,6 +531,10 @@ var WorkerMessageHandler = {
|
|||||||
return pdfManager.ensureCatalog('pageMode');
|
return pdfManager.ensureCatalog('pageMode');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
handler.on('getOpenActionDestination', function(data) {
|
||||||
|
return pdfManager.ensureCatalog('openActionDestination');
|
||||||
|
});
|
||||||
|
|
||||||
handler.on('GetAttachments',
|
handler.on('GetAttachments',
|
||||||
function wphSetupGetAttachments(data) {
|
function wphSetupGetAttachments(data) {
|
||||||
return pdfManager.ensureCatalog('attachments');
|
return pdfManager.ensureCatalog('attachments');
|
||||||
|
@ -650,6 +650,14 @@ class PDFDocumentProxy {
|
|||||||
return this._transport.getPageMode();
|
return this._transport.getPageMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {Promise} A promise that is resolved with an {Array} containing the
|
||||||
|
* destination, or `null` when no open action is present in the PDF file.
|
||||||
|
*/
|
||||||
|
getOpenActionDestination() {
|
||||||
|
return this._transport.getOpenActionDestination();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {Promise} A promise that is resolved with a lookup table for
|
* @return {Promise} A promise that is resolved with a lookup table for
|
||||||
* mapping named attachments to their content.
|
* mapping named attachments to their content.
|
||||||
@ -2152,6 +2160,11 @@ class WorkerTransport {
|
|||||||
return this.messageHandler.sendWithPromise('GetPageMode', null);
|
return this.messageHandler.sendWithPromise('GetPageMode', null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getOpenActionDestination() {
|
||||||
|
return this.messageHandler.sendWithPromise('getOpenActionDestination',
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
getAttachments() {
|
getAttachments() {
|
||||||
return this.messageHandler.sendWithPromise('GetAttachments', null);
|
return this.messageHandler.sendWithPromise('GetAttachments', null);
|
||||||
}
|
}
|
||||||
|
@ -650,6 +650,24 @@ describe('api', function() {
|
|||||||
}).catch(done.fail);
|
}).catch(done.fail);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('gets default open action destination', function(done) {
|
||||||
|
var loadingTask = getDocument(buildGetDocumentParams('tracemonkey.pdf'));
|
||||||
|
|
||||||
|
loadingTask.promise.then(function(pdfDocument) {
|
||||||
|
return pdfDocument.getOpenActionDestination();
|
||||||
|
}).then(function(dest) {
|
||||||
|
expect(dest).toEqual(null);
|
||||||
|
|
||||||
|
loadingTask.destroy().then(done);
|
||||||
|
}).catch(done.fail);
|
||||||
|
});
|
||||||
|
it('gets non-default open action destination', function(done) {
|
||||||
|
doc.getOpenActionDestination().then(function(dest) {
|
||||||
|
expect(dest).toEqual([{ num: 15, gen: 0, }, { name: 'FitH', }, null]);
|
||||||
|
done();
|
||||||
|
}).catch(done.fail);
|
||||||
|
});
|
||||||
|
|
||||||
it('gets non-existent attachments', function(done) {
|
it('gets non-existent attachments', function(done) {
|
||||||
var promise = doc.getAttachments();
|
var promise = doc.getAttachments();
|
||||||
promise.then(function (data) {
|
promise.then(function (data) {
|
||||||
|
Loading…
Reference in New Issue
Block a user