[api-minor] Add a wrapper around the addLinkAttributes-function, in the API, to the PDFLinkService implementations

This patch helps reduce some duplication, given that we now have a few essentially identical `addLinkAttributes` call-sites in the code-base.
To prevent runtime errors in the Annotation/XFA-layer code, we'll warn if a custom/incomplete `PDFLinkService` is being used (limited to GENERIC builds).
This commit is contained in:
Jonas Jenwald 2021-09-30 13:30:55 +02:00
parent bb9c905c5d
commit 8cb6efec2d
9 changed files with 67 additions and 45 deletions

View File

@ -13,13 +13,6 @@
* limitations under the License. * limitations under the License.
*/ */
import {
addLinkAttributes,
DOMSVGFactory,
getFilenameFromUrl,
LinkTarget,
PDFDateString,
} from "./display_utils.js";
import { import {
AnnotationBorderStyleType, AnnotationBorderStyleType,
AnnotationType, AnnotationType,
@ -30,6 +23,11 @@ import {
Util, Util,
warn, warn,
} from "../shared/util.js"; } from "../shared/util.js";
import {
DOMSVGFactory,
getFilenameFromUrl,
PDFDateString,
} from "./display_utils.js";
import { AnnotationStorage } from "./annotation_storage.js"; import { AnnotationStorage } from "./annotation_storage.js";
import { ColorConverters } from "../shared/scripting_utils.js"; import { ColorConverters } from "../shared/scripting_utils.js";
@ -443,14 +441,15 @@ class LinkAnnotationElement extends AnnotationElement {
const link = document.createElement("a"); const link = document.createElement("a");
if (data.url) { if (data.url) {
addLinkAttributes(link, { if (
url: data.url, (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) &&
target: data.newWindow !linkService.addLinkAttributes
? LinkTarget.BLANK ) {
: linkService.externalLinkTarget, warn(
rel: linkService.externalLinkRel, "LinkAnnotationElement.render - missing `addLinkAttributes`-method on the `linkService`-instance."
enabled: linkService.externalLinkEnabled, );
}); }
linkService.addLinkAttributes?.(link, data.url, data.newWindow);
} else if (data.action) { } else if (data.action) {
this._bindNamedAction(link, data.action); this._bindNamedAction(link, data.action);
} else if (data.dest) { } else if (data.dest) {

View File

@ -338,7 +338,7 @@ const LinkTarget = {
/** /**
* Adds various attributes (href, title, target, rel) to hyperlinks. * Adds various attributes (href, title, target, rel) to hyperlinks.
* @param {HTMLLinkElement} link - The link element. * @param {HTMLAnchorElement} link - The link element.
* @param {ExternalLinkParameters} params * @param {ExternalLinkParameters} params
*/ */
function addLinkAttributes(link, { url, target, rel, enabled = true } = {}) { function addLinkAttributes(link, { url, target, rel, enabled = true } = {}) {
@ -633,7 +633,6 @@ function getXfaPageViewport(xfaPage, { scale = 1, rotation = 0 }) {
export { export {
addLinkAttributes, addLinkAttributes,
DEFAULT_LINK_REL,
deprecated, deprecated,
DOMCanvasFactory, DOMCanvasFactory,
DOMCMapReaderFactory, DOMCMapReaderFactory,

View File

@ -13,7 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { addLinkAttributes, LinkTarget } from "./display_utils.js"; import { warn } from "../shared/util.js";
import { XfaText } from "./xfa_text.js"; import { XfaText } from "./xfa_text.js";
class XfaLayer { class XfaLayer {
@ -119,14 +119,19 @@ class XfaLayer {
} }
if (isHTMLAnchorElement) { if (isHTMLAnchorElement) {
addLinkAttributes(html, { if (
url: attributes.href, (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) &&
target: attributes.newWindow !linkService.addLinkAttributes
? LinkTarget.BLANK ) {
: linkService.externalLinkTarget, warn(
rel: linkService.externalLinkRel, "XfaLayer.setAttribute - missing `addLinkAttributes`-method on the `linkService`-instance."
enabled: linkService.externalLinkEnabled, );
}); }
linkService.addLinkAttributes?.(
html,
attributes.href,
attributes.newWindow
);
} }
// Set the value after the others to be sure overwrite // Set the value after the others to be sure overwrite

View File

@ -1358,7 +1358,6 @@ class BaseViewer {
* @param {PDFPage} pdfPage * @param {PDFPage} pdfPage
* @param {AnnotationStorage} [annotationStorage] - Storage for annotation * @param {AnnotationStorage} [annotationStorage] - Storage for annotation
* data in forms. * data in forms.
* @property {IPDFLinkService} linkService
* @returns {XfaLayerBuilder} * @returns {XfaLayerBuilder}
*/ */
createXfaLayerBuilder(pageDiv, pdfPage, annotationStorage = null) { createXfaLayerBuilder(pageDiv, pdfPage, annotationStorage = null) {

View File

@ -63,6 +63,13 @@ class IPDFLinkService {
*/ */
goToPage(val) {} goToPage(val) {}
/**
* @param {HTMLAnchorElement} link
* @param {string} url
* @param {boolean} [newWindow]
*/
addLinkAttributes(link, url, newWindow = false) {}
/** /**
* @param dest - The PDF destination object. * @param dest - The PDF destination object.
* @returns {string} The hyperlink to the PDF object. * @returns {string} The hyperlink to the PDF object.

View File

@ -15,6 +15,7 @@
/** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */ /** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */
import { addLinkAttributes, LinkTarget } from "pdfjs-lib";
import { parseQueryString } from "./ui_utils.js"; import { parseQueryString } from "./ui_utils.js";
/** /**
@ -227,6 +228,21 @@ class PDFLinkService {
this.pdfViewer.scrollPageIntoView({ pageNumber }); this.pdfViewer.scrollPageIntoView({ pageNumber });
} }
/**
* Wrapper around the `addLinkAttributes`-function in the API.
* @param {HTMLAnchorElement} link
* @param {string} url
* @param {boolean} [newWindow]
*/
addLinkAttributes(link, url, newWindow = false) {
addLinkAttributes(link, {
url,
target: newWindow ? LinkTarget.BLANK : this.externalLinkTarget,
rel: this.externalLinkRel,
enabled: this.externalLinkEnabled,
});
}
/** /**
* @param {string|Array} dest - The PDF destination object. * @param {string|Array} dest - The PDF destination object.
* @returns {string} The hyperlink to the PDF object. * @returns {string} The hyperlink to the PDF object.
@ -514,10 +530,7 @@ function isValidExplicitDestination(dest) {
*/ */
class SimpleLinkService { class SimpleLinkService {
constructor() { constructor() {
this.externalLinkTarget = null;
this.externalLinkRel = null;
this.externalLinkEnabled = true; this.externalLinkEnabled = true;
this._ignoreDestinationZoom = false;
} }
/** /**
@ -561,6 +574,15 @@ class SimpleLinkService {
*/ */
goToPage(val) {} goToPage(val) {}
/**
* @param {HTMLAnchorElement} link
* @param {string} url
* @param {boolean} [newWindow]
*/
addLinkAttributes(link, url, newWindow = false) {
addLinkAttributes(link, { url, enabled: this.externalLinkEnabled });
}
/** /**
* @param dest - The PDF destination object. * @param dest - The PDF destination object.
* @returns {string} The hyperlink to the PDF object. * @returns {string} The hyperlink to the PDF object.

View File

@ -13,12 +13,8 @@
* limitations under the License. * limitations under the License.
*/ */
import {
addLinkAttributes,
createPromiseCapability,
LinkTarget,
} from "pdfjs-lib";
import { BaseTreeViewer } from "./base_tree_viewer.js"; import { BaseTreeViewer } from "./base_tree_viewer.js";
import { createPromiseCapability } from "pdfjs-lib";
import { SidebarView } from "./ui_utils.js"; import { SidebarView } from "./ui_utils.js";
/** /**
@ -115,12 +111,7 @@ class PDFOutlineViewer extends BaseTreeViewer {
const { linkService } = this; const { linkService } = this;
if (url) { if (url) {
addLinkAttributes(element, { linkService.addLinkAttributes(element, url, newWindow);
url,
target: newWindow ? LinkTarget.BLANK : linkService.externalLinkTarget,
rel: linkService.externalLinkRel,
enabled: linkService.externalLinkEnabled,
});
return; return;
} }

View File

@ -31,8 +31,8 @@ import { PDFSinglePageViewer } from "./pdf_single_page_viewer.js";
* @property {HTMLButtonElement} printButton - Button to print the document. * @property {HTMLButtonElement} printButton - Button to print the document.
* @property {HTMLButtonElement} downloadButton - Button to download the * @property {HTMLButtonElement} downloadButton - Button to download the
* document. * document.
* @property {HTMLLinkElement} viewBookmarkButton - Button to obtain a bookmark * @property {HTMLAnchorElement} viewBookmarkButton - Button to obtain a
* link to the current location in the document. * bookmark link to the current location in the document.
* @property {HTMLButtonElement} firstPageButton - Button to go to the first * @property {HTMLButtonElement} firstPageButton - Button to go to the first
* page in the document. * page in the document.
* @property {HTMLButtonElement} lastPageButton - Button to go to the last page * @property {HTMLButtonElement} lastPageButton - Button to go to the last page

View File

@ -43,8 +43,8 @@ const PAGE_NUMBER_LOADING_INDICATOR = "visiblePageIsLoading";
* @property {HTMLButtonElement} presentationModeButton - Button to switch to * @property {HTMLButtonElement} presentationModeButton - Button to switch to
* presentation mode. * presentation mode.
* @property {HTMLButtonElement} download - Button to download the document. * @property {HTMLButtonElement} download - Button to download the document.
* @property {HTMLAElement} viewBookmark - Element to link current url of * @property {HTMLAnchorElement} viewBookmark - Button to obtain a bookmark link
* the page view. * to the current location in the document.
*/ */
class Toolbar { class Toolbar {