Merge pull request #8673 from Snuffleupagus/api-pageMode
[api-minor] Add support for PageMode in the API and viewer (issue 8657)
This commit is contained in:
commit
af71ea7a7d
@ -102,6 +102,10 @@
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"disablePageMode": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"disableTelemetry": {
|
||||
"title": "Disable telemetry",
|
||||
"type": "boolean",
|
||||
|
@ -329,6 +329,24 @@ var Catalog = (function CatalogClosure() {
|
||||
return pageLabels;
|
||||
},
|
||||
|
||||
get pageMode() {
|
||||
let obj = this.catDict.get('PageMode');
|
||||
let pageMode = 'UseNone'; // Default value.
|
||||
|
||||
if (isName(obj)) {
|
||||
switch (obj.name) {
|
||||
case 'UseNone':
|
||||
case 'UseOutlines':
|
||||
case 'UseThumbs':
|
||||
case 'FullScreen':
|
||||
case 'UseOC':
|
||||
case 'UseAttachments':
|
||||
pageMode = obj.name;
|
||||
}
|
||||
}
|
||||
return shadow(this, 'pageMode', pageMode);
|
||||
},
|
||||
|
||||
get attachments() {
|
||||
var xref = this.xref;
|
||||
var attachments = null, nameTreeRef;
|
||||
|
@ -772,6 +772,10 @@ var WorkerMessageHandler = {
|
||||
}
|
||||
);
|
||||
|
||||
handler.on('GetPageMode', function wphSetupGetPageMode(data) {
|
||||
return pdfManager.ensureCatalog('pageMode');
|
||||
});
|
||||
|
||||
handler.on('GetAttachments',
|
||||
function wphSetupGetAttachments(data) {
|
||||
return pdfManager.ensureCatalog('attachments');
|
||||
|
@ -568,6 +568,13 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
|
||||
getPageLabels: function PDFDocumentProxy_getPageLabels() {
|
||||
return this.transport.getPageLabels();
|
||||
},
|
||||
/**
|
||||
* @return {Promise} A promise that is resolved with a {string} containing
|
||||
* the PageMode name.
|
||||
*/
|
||||
getPageMode() {
|
||||
return this.transport.getPageMode();
|
||||
},
|
||||
/**
|
||||
* @return {Promise} A promise that is resolved with a lookup table for
|
||||
* mapping named attachments to their content.
|
||||
@ -1939,6 +1946,10 @@ var WorkerTransport = (function WorkerTransportClosure() {
|
||||
return this.messageHandler.sendWithPromise('GetPageLabels', null);
|
||||
},
|
||||
|
||||
getPageMode() {
|
||||
return this.messageHandler.sendWithPromise('GetPageMode', null);
|
||||
},
|
||||
|
||||
getAttachments: function WorkerTransport_getAttachments() {
|
||||
return this.messageHandler.sendWithPromise('GetAttachments', null);
|
||||
},
|
||||
|
@ -630,6 +630,28 @@ describe('api', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('gets default page mode', function(done) {
|
||||
var loadingTask = getDocument(buildGetDocumentParams('tracemonkey.pdf'));
|
||||
|
||||
loadingTask.promise.then(function(pdfDocument) {
|
||||
return pdfDocument.getPageMode();
|
||||
}).then(function(mode) {
|
||||
expect(mode).toEqual('UseNone');
|
||||
|
||||
loadingTask.destroy().then(done);
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets non-default page mode', function(done) {
|
||||
doc.getPageMode().then(function(mode) {
|
||||
expect(mode).toEqual('UseOutlines');
|
||||
done();
|
||||
}).catch(function(reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
|
||||
it('gets non-existent attachments', function(done) {
|
||||
var promise = doc.getAttachments();
|
||||
promise.then(function (data) {
|
||||
|
91
web/app.js
91
web/app.js
@ -141,6 +141,7 @@ let PDFViewerApplication = {
|
||||
pdfBugEnabled: false,
|
||||
showPreviousViewOnLoad: true,
|
||||
defaultZoomValue: '',
|
||||
disablePageMode: false,
|
||||
disablePageLabels: false,
|
||||
renderer: 'canvas',
|
||||
enhanceTextSelection: false,
|
||||
@ -255,6 +256,9 @@ let PDFViewerApplication = {
|
||||
preferences.get('renderInteractiveForms').then(function resolved(value) {
|
||||
viewerPrefs['renderInteractiveForms'] = value;
|
||||
}),
|
||||
preferences.get('disablePageMode').then(function resolved(value) {
|
||||
viewerPrefs['disablePageMode'] = value;
|
||||
}),
|
||||
preferences.get('disablePageLabels').then(function resolved(value) {
|
||||
viewerPrefs['disablePageLabels'] = value;
|
||||
}),
|
||||
@ -883,6 +887,11 @@ let PDFViewerApplication = {
|
||||
});
|
||||
});
|
||||
|
||||
// Since the `setInitialView` call below depends on this being resolved,
|
||||
// fetch it early to avoid delaying initial rendering of the PDF document.
|
||||
let pageModePromise = pdfDocument.getPageMode().catch(
|
||||
function() { /* Avoid breaking initial rendering; ignoring errors. */ });
|
||||
|
||||
this.toolbar.setPagesCount(pdfDocument.numPages, false);
|
||||
this.secondaryToolbar.setPagesCount(pdfDocument.numPages);
|
||||
|
||||
@ -932,37 +941,39 @@ let PDFViewerApplication = {
|
||||
bookmark: this.initialBookmark,
|
||||
hash: null,
|
||||
};
|
||||
let storedHash = this.viewerPrefs['defaultZoomValue'] ?
|
||||
('zoom=' + this.viewerPrefs['defaultZoomValue']) : null;
|
||||
let sidebarView = this.viewerPrefs['sidebarViewOnLoad'];
|
||||
let storePromise = store.getMultiple({
|
||||
exists: false,
|
||||
page: '1',
|
||||
zoom: DEFAULT_SCALE_VALUE,
|
||||
scrollLeft: '0',
|
||||
scrollTop: '0',
|
||||
sidebarView: SidebarView.NONE,
|
||||
}).catch(() => { /* Unable to read from storage; ignoring errors. */ });
|
||||
|
||||
new Promise((resolve, reject) => {
|
||||
if (!this.viewerPrefs['showPreviousViewOnLoad']) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
store.getMultiple({
|
||||
exists: false,
|
||||
page: '1',
|
||||
zoom: DEFAULT_SCALE_VALUE,
|
||||
scrollLeft: '0',
|
||||
scrollTop: '0',
|
||||
sidebarView: SidebarView.NONE,
|
||||
}).then((values) => {
|
||||
if (!values.exists) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
storedHash = 'page=' + values.page +
|
||||
Promise.all([storePromise, pageModePromise]).then(
|
||||
([values = {}, pageMode]) => {
|
||||
// Initialize the default values, from user preferences.
|
||||
let hash = this.viewerPrefs['defaultZoomValue'] ?
|
||||
('zoom=' + this.viewerPrefs['defaultZoomValue']) : null;
|
||||
let sidebarView = this.viewerPrefs['sidebarViewOnLoad'];
|
||||
|
||||
if (values.exists && this.viewerPrefs['showPreviousViewOnLoad']) {
|
||||
hash = 'page=' + values.page +
|
||||
'&zoom=' + (this.viewerPrefs['defaultZoomValue'] || values.zoom) +
|
||||
',' + values.scrollLeft + ',' + values.scrollTop;
|
||||
sidebarView = this.viewerPrefs['sidebarViewOnLoad'] ||
|
||||
(values.sidebarView | 0);
|
||||
resolve();
|
||||
}).catch(resolve);
|
||||
}).then(() => {
|
||||
this.setInitialView(storedHash, { sidebarView, scale, });
|
||||
initialParams.hash = storedHash;
|
||||
sidebarView = sidebarView || (values.sidebarView | 0);
|
||||
}
|
||||
if (pageMode && !this.viewerPrefs['disablePageMode']) {
|
||||
// Always let the user preference/history take precedence.
|
||||
sidebarView = sidebarView || apiPageModeToSidebarView(pageMode);
|
||||
}
|
||||
return {
|
||||
hash,
|
||||
sidebarView,
|
||||
};
|
||||
}).then(({ hash, sidebarView, }) => {
|
||||
this.setInitialView(hash, { sidebarView, scale, });
|
||||
initialParams.hash = hash;
|
||||
|
||||
// Make all navigation keys work on document load,
|
||||
// unless the viewer is embedded in a web page.
|
||||
@ -2293,6 +2304,30 @@ function webViewerKeyDown(evt) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts API PageMode values to the format used by `PDFSidebar`.
|
||||
* NOTE: There's also a "FullScreen" parameter which is not possible to support,
|
||||
* since the Fullscreen API used in browsers requires that entering
|
||||
* fullscreen mode only occurs as a result of a user-initiated event.
|
||||
* @param {string} mode - The API PageMode value.
|
||||
* @returns {number} A value from {SidebarView}.
|
||||
*/
|
||||
function apiPageModeToSidebarView(mode) {
|
||||
switch (mode) {
|
||||
case 'UseNone':
|
||||
return SidebarView.NONE;
|
||||
case 'UseThumbs':
|
||||
return SidebarView.THUMBS;
|
||||
case 'UseOutlines':
|
||||
return SidebarView.OUTLINE;
|
||||
case 'UseAttachments':
|
||||
return SidebarView.ATTACHMENTS;
|
||||
case 'UseOC':
|
||||
// Not implemented, since we don't support Optional Content Groups yet.
|
||||
}
|
||||
return SidebarView.NONE; // Default value.
|
||||
}
|
||||
|
||||
/* Abstract factory for the print service. */
|
||||
let PDFPrintServiceFactory = {
|
||||
instance: {
|
||||
|
@ -17,5 +17,6 @@
|
||||
"renderer": "canvas",
|
||||
"renderInteractiveForms": false,
|
||||
"enablePrintAutoRotate": false,
|
||||
"disablePageMode": false,
|
||||
"disablePageLabels": false
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user