Merge pull request #5952 from Snuffleupagus/api-externalLinkTarget
[api-minor] Add an option to PDFJS for specifying the |target| attribute of external links (bug 976541)
This commit is contained in:
commit
2096a2a94a
@ -15,7 +15,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/* globals PDFJS, Util, AnnotationType, AnnotationBorderStyleType, warn,
|
/* globals PDFJS, Util, AnnotationType, AnnotationBorderStyleType, warn,
|
||||||
CustomStyle */
|
CustomStyle, isExternalLinkTargetSet, LinkTargetStringMap */
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
@ -261,8 +261,9 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
|
|||||||
|
|
||||||
var link = document.createElement('a');
|
var link = document.createElement('a');
|
||||||
link.href = link.title = item.url || '';
|
link.href = link.title = item.url || '';
|
||||||
if (item.url && PDFJS.openExternalLinksInNewWindow) {
|
|
||||||
link.target = '_blank';
|
if (item.url && isExternalLinkTargetSet()) {
|
||||||
|
link.target = LinkTargetStringMap[PDFJS.externalLinkTarget];
|
||||||
}
|
}
|
||||||
|
|
||||||
container.appendChild(link);
|
container.appendChild(link);
|
||||||
|
@ -169,14 +169,27 @@ PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ?
|
|||||||
16777216 : PDFJS.maxCanvasPixels);
|
16777216 : PDFJS.maxCanvasPixels);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens external links in a new window if enabled. The default behavior opens
|
* (Deprecated) Opens external links in a new window if enabled.
|
||||||
* external links in the PDF.js window.
|
* The default behavior opens external links in the PDF.js window.
|
||||||
* @var {boolean}
|
* @var {boolean}
|
||||||
*/
|
*/
|
||||||
PDFJS.openExternalLinksInNewWindow = (
|
PDFJS.openExternalLinksInNewWindow = (
|
||||||
PDFJS.openExternalLinksInNewWindow === undefined ?
|
PDFJS.openExternalLinksInNewWindow === undefined ?
|
||||||
false : PDFJS.openExternalLinksInNewWindow);
|
false : PDFJS.openExternalLinksInNewWindow);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the |target| attribute for external links.
|
||||||
|
* The constants from PDFJS.LinkTarget should be used:
|
||||||
|
* - NONE [default]
|
||||||
|
* - SELF
|
||||||
|
* - BLANK
|
||||||
|
* - PARENT
|
||||||
|
* - TOP
|
||||||
|
* @var {number}
|
||||||
|
*/
|
||||||
|
PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ?
|
||||||
|
PDFJS.LinkTarget.NONE : PDFJS.externalLinkTarget);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if we can eval strings as JS. Primarily used to improve
|
* Determines if we can eval strings as JS. Primarily used to improve
|
||||||
* performance for font rendering.
|
* performance for font rendering.
|
||||||
|
@ -328,6 +328,49 @@ function shadow(obj, prop, value) {
|
|||||||
}
|
}
|
||||||
PDFJS.shadow = shadow;
|
PDFJS.shadow = shadow;
|
||||||
|
|
||||||
|
var LinkTarget = PDFJS.LinkTarget = {
|
||||||
|
NONE: 0, // Default value.
|
||||||
|
SELF: 1,
|
||||||
|
BLANK: 2,
|
||||||
|
PARENT: 3,
|
||||||
|
TOP: 4,
|
||||||
|
};
|
||||||
|
var LinkTargetStringMap = [
|
||||||
|
'',
|
||||||
|
'_self',
|
||||||
|
'_blank',
|
||||||
|
'_parent',
|
||||||
|
'_top'
|
||||||
|
];
|
||||||
|
|
||||||
|
function isExternalLinkTargetSet() {
|
||||||
|
//#if GENERIC
|
||||||
|
if (PDFJS.openExternalLinksInNewWindow) {
|
||||||
|
warn('PDFJS.openExternalLinksInNewWindow is deprecated, ' +
|
||||||
|
'use PDFJS.externalLinkTarget instead.');
|
||||||
|
if (PDFJS.externalLinkTarget === LinkTarget.NONE) {
|
||||||
|
PDFJS.externalLinkTarget = LinkTarget.BLANK;
|
||||||
|
}
|
||||||
|
// Reset the deprecated parameter, to suppress further warnings.
|
||||||
|
PDFJS.openExternalLinksInNewWindow = false;
|
||||||
|
}
|
||||||
|
//#endif
|
||||||
|
switch (PDFJS.externalLinkTarget) {
|
||||||
|
case LinkTarget.NONE:
|
||||||
|
return false;
|
||||||
|
case LinkTarget.SELF:
|
||||||
|
case LinkTarget.BLANK:
|
||||||
|
case LinkTarget.PARENT:
|
||||||
|
case LinkTarget.TOP:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget);
|
||||||
|
// Reset the external link target, to suppress further warnings.
|
||||||
|
PDFJS.externalLinkTarget = LinkTarget.NONE;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet;
|
||||||
|
|
||||||
var PasswordResponses = PDFJS.PasswordResponses = {
|
var PasswordResponses = PDFJS.PasswordResponses = {
|
||||||
NEED_PASSWORD: 1,
|
NEED_PASSWORD: 1,
|
||||||
INCORRECT_PASSWORD: 2
|
INCORRECT_PASSWORD: 2
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
||||||
/* globals expect, it, describe, combineUrl, Dict, isDict, Name,
|
/* globals expect, it, describe, combineUrl, Dict, isDict, Name, PDFJS,
|
||||||
stringToPDFString */
|
stringToPDFString, isExternalLinkTargetSet, LinkTarget */
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
@ -99,4 +99,32 @@ describe('util', function() {
|
|||||||
expect(stringToPDFString(str2)).toEqual('');
|
expect(stringToPDFString(str2)).toEqual('');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('isExternalLinkTargetSet', function() {
|
||||||
|
// Save the current state, to avoid interfering with other tests.
|
||||||
|
var previousExternalLinkTarget = PDFJS.externalLinkTarget;
|
||||||
|
|
||||||
|
it('handles the predefined LinkTargets', function() {
|
||||||
|
for (var key in LinkTarget) {
|
||||||
|
var linkTarget = LinkTarget[key];
|
||||||
|
PDFJS.externalLinkTarget = linkTarget;
|
||||||
|
|
||||||
|
expect(isExternalLinkTargetSet()).toEqual(!!linkTarget);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles incorrect LinkTargets', function() {
|
||||||
|
var targets = [true, '', false, -1, '_blank', null];
|
||||||
|
|
||||||
|
for (var i = 0, ii = targets.length; i < ii; i++) {
|
||||||
|
var linkTarget = targets[i];
|
||||||
|
PDFJS.externalLinkTarget = linkTarget;
|
||||||
|
|
||||||
|
expect(isExternalLinkTargetSet()).toEqual(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Reset the state.
|
||||||
|
PDFJS.externalLinkTarget = previousExternalLinkTarget;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -32,5 +32,6 @@ var DEFAULT_PREFERENCES = {
|
|||||||
disableAutoFetch: false,
|
disableAutoFetch: false,
|
||||||
disableFontFace: false,
|
disableFontFace: false,
|
||||||
disableTextLayer: false,
|
disableTextLayer: false,
|
||||||
useOnlyCssZoom: false
|
useOnlyCssZoom: false,
|
||||||
|
externalLinkTarget: 0,
|
||||||
};
|
};
|
||||||
|
@ -288,12 +288,24 @@ var PDFViewerApplication = {
|
|||||||
}),
|
}),
|
||||||
Preferences.get('useOnlyCssZoom').then(function resolved(value) {
|
Preferences.get('useOnlyCssZoom').then(function resolved(value) {
|
||||||
PDFJS.useOnlyCssZoom = value;
|
PDFJS.useOnlyCssZoom = value;
|
||||||
})
|
}),
|
||||||
|
Preferences.get('externalLinkTarget').then(function resolved(value) {
|
||||||
|
if (PDFJS.isExternalLinkTargetSet()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PDFJS.externalLinkTarget = value;
|
||||||
|
}),
|
||||||
// TODO move more preferences and other async stuff here
|
// TODO move more preferences and other async stuff here
|
||||||
]).catch(function (reason) { });
|
]).catch(function (reason) { });
|
||||||
|
|
||||||
return initializedPromise.then(function () {
|
return initializedPromise.then(function () {
|
||||||
PDFViewerApplication.initialized = true;
|
if (self.isViewerEmbedded && !PDFJS.isExternalLinkTargetSet()) {
|
||||||
|
// Prevent external links from "replacing" the viewer,
|
||||||
|
// when it's embedded in e.g. an iframe or an object.
|
||||||
|
PDFJS.externalLinkTarget = PDFJS.LinkTarget.TOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.initialized = true;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user