From 2d2b6463b8a9ac26b72d8b7de7a47f78cfdfd940 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 3 Jan 2022 13:36:49 +0100 Subject: [PATCH] [api-minor] Move `addLinkAttributes` and `LinkTarget` into the viewer As part of the changes/improvement in PR 14092, we're no longer using the `addLinkAttributes` directly in e.g. the AnnotationLayer-code. Given that the helper function is now *only* used in the viewer, hence it no longer seems necessary to expose it through the official API. *Please note:* It seems somewhat unlikely that third-party users were relying *directly* on the helper function, which is why it's not being exported as part of the viewer components. (If necessary, we can always change this later on.) --- src/display/display_utils.js | 85 ++++-------------------------------- src/pdf.js | 69 ++++++++++++----------------- web/app.js | 3 +- web/pdf_link_service.js | 71 ++++++++++++++++++++++++++++-- web/pdf_viewer.component.js | 7 ++- 5 files changed, 111 insertions(+), 124 deletions(-) diff --git a/src/display/display_utils.js b/src/display/display_utils.js index c34035f2c..be4b20c7c 100644 --- a/src/display/display_utils.js +++ b/src/display/display_utils.js @@ -13,24 +13,21 @@ * limitations under the License. */ -import { - assert, - BaseException, - isString, - removeNullCharacters, - shadow, - stringToBytes, - Util, - warn, -} from "../shared/util.js"; import { BaseCanvasFactory, BaseCMapReaderFactory, BaseStandardFontDataFactory, BaseSVGFactory, } from "./base_factory.js"; +import { + BaseException, + isString, + shadow, + stringToBytes, + Util, + warn, +} from "../shared/util.js"; -const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; const SVG_NS = "http://www.w3.org/2000/svg"; const PixelsPerInch = { @@ -316,70 +313,6 @@ class RenderingCancelledException extends BaseException { } } -const LinkTarget = { - NONE: 0, // Default value. - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4, -}; - -/** - * @typedef ExternalLinkParameters - * @typedef {Object} ExternalLinkParameters - * @property {string} url - An absolute URL. - * @property {LinkTarget} [target] - The link target. The default value is - * `LinkTarget.NONE`. - * @property {string} [rel] - The link relationship. The default value is - * `DEFAULT_LINK_REL`. - * @property {boolean} [enabled] - Whether the link should be enabled. The - * default value is true. - */ - -/** - * Adds various attributes (href, title, target, rel) to hyperlinks. - * @param {HTMLAnchorElement} link - The link element. - * @param {ExternalLinkParameters} params - */ -function addLinkAttributes(link, { url, target, rel, enabled = true } = {}) { - assert( - url && typeof url === "string", - 'addLinkAttributes: A valid "url" parameter must provided.' - ); - - const urlNullRemoved = removeNullCharacters(url); - if (enabled) { - link.href = link.title = urlNullRemoved; - } else { - link.href = ""; - link.title = `Disabled: ${urlNullRemoved}`; - link.onclick = () => { - return false; - }; - } - - let targetStr = ""; // LinkTarget.NONE - switch (target) { - case LinkTarget.NONE: - break; - case LinkTarget.SELF: - targetStr = "_self"; - break; - case LinkTarget.BLANK: - targetStr = "_blank"; - break; - case LinkTarget.PARENT: - targetStr = "_parent"; - break; - case LinkTarget.TOP: - targetStr = "_top"; - break; - } - link.target = targetStr; - - link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; -} - function isDataScheme(url) { const ii = url.length; let i = 0; @@ -632,7 +565,6 @@ function getXfaPageViewport(xfaPage, { scale = 1, rotation = 0 }) { } export { - addLinkAttributes, deprecated, DOMCanvasFactory, DOMCMapReaderFactory, @@ -644,7 +576,6 @@ export { isDataScheme, isPdfFile, isValidFetchUrl, - LinkTarget, loadScript, PageViewport, PDFDateString, diff --git a/src/pdf.js b/src/pdf.js index 3a4b38e0f..a69baeba9 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* eslint-disable sort-exports/sort-exports */ // eslint-disable-next-line max-len /** @typedef {import("./display/api").PDFDocumentLoadingTask} PDFDocumentLoadingTask */ @@ -20,19 +19,6 @@ /** @typedef {import("./display/api").PDFPageProxy} PDFPageProxy */ /** @typedef {import("./display/api").RenderTask} RenderTask */ -import { - addLinkAttributes, - getFilenameFromUrl, - getPdfFilenameFromUrl, - getXfaPageViewport, - isPdfFile, - isValidFetchUrl, - LinkTarget, - loadScript, - PDFDateString, - PixelsPerInch, - RenderingCancelledException, -} from "./display/display_utils.js"; import { AnnotationMode, CMapCompressionType, @@ -60,6 +46,17 @@ import { setPDFNetworkStreamFactory, version, } from "./display/api.js"; +import { + getFilenameFromUrl, + getPdfFilenameFromUrl, + getXfaPageViewport, + isPdfFile, + isValidFetchUrl, + loadScript, + PDFDateString, + PixelsPerInch, + RenderingCancelledException, +} from "./display/display_utils.js"; import { AnnotationLayer } from "./display/annotation_layer.js"; import { GlobalWorkerOptions } from "./display/worker_options.js"; import { isNodeJS } from "./shared/is_node.js"; @@ -108,49 +105,39 @@ if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("PRODUCTION")) { } export { - // From "./display/display_utils.js": - addLinkAttributes, - getFilenameFromUrl, - getPdfFilenameFromUrl, - isPdfFile, - LinkTarget, - loadScript, - PDFDateString, - PixelsPerInch, - RenderingCancelledException, - getXfaPageViewport, - // From "./shared/util.js": + AnnotationLayer, AnnotationMode, + build, CMapCompressionType, createObjectURL, createPromiseCapability, createValidAbsoluteUrl, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl, + getXfaPageViewport, + GlobalWorkerOptions, InvalidPDFException, + isPdfFile, + loadScript, + LoopbackPort, MissingPDFException, OPS, PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, PermissionFlag, + PixelsPerInch, removeNullCharacters, + RenderingCancelledException, + renderTextLayer, shadow, + SVGGraphics, UnexpectedResponseException, UNSUPPORTED_FEATURES, Util, VerbosityLevel, - // From "./display/api.js": - build, - getDocument, - LoopbackPort, - PDFDataRangeTransport, - PDFWorker, version, - // From "./display/annotation_layer.js": - AnnotationLayer, - // From "./display/worker_options.js": - GlobalWorkerOptions, - // From "./display/text_layer.js": - renderTextLayer, - // From "./display/svg.js": - SVGGraphics, - // From "./display/xfa_layer.js": XfaLayer, }; diff --git a/web/app.js b/web/app.js index 209ad0360..07402bd0d 100644 --- a/web/app.js +++ b/web/app.js @@ -46,7 +46,6 @@ import { GlobalWorkerOptions, InvalidPDFException, isPdfFile, - LinkTarget, loadScript, MissingPDFException, OPS, @@ -57,6 +56,7 @@ import { version, } from "pdfjs-lib"; import { CursorTool, PDFCursorTools } from "./pdf_cursor_tools.js"; +import { LinkTarget, PDFLinkService } from "./pdf_link_service.js"; import { OverlayManager } from "./overlay_manager.js"; import { PasswordPrompt } from "./password_prompt.js"; import { PDFAttachmentViewer } from "./pdf_attachment_viewer.js"; @@ -65,7 +65,6 @@ import { PDFFindBar } from "./pdf_find_bar.js"; import { PDFFindController } from "./pdf_find_controller.js"; import { PDFHistory } from "./pdf_history.js"; import { PDFLayerViewer } from "./pdf_layer_viewer.js"; -import { PDFLinkService } from "./pdf_link_service.js"; import { PDFOutlineViewer } from "./pdf_outline_viewer.js"; import { PDFPresentationMode } from "./pdf_presentation_mode.js"; import { PDFRenderingQueue } from "./pdf_rendering_queue.js"; diff --git a/web/pdf_link_service.js b/web/pdf_link_service.js index 3f6e4eb25..d74741beb 100644 --- a/web/pdf_link_service.js +++ b/web/pdf_link_service.js @@ -16,8 +16,73 @@ /** @typedef {import("./event_utils").EventBus} EventBus */ /** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */ -import { addLinkAttributes, LinkTarget } from "pdfjs-lib"; import { parseQueryString } from "./ui_utils.js"; +import { removeNullCharacters } from "pdfjs-lib"; + +const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; + +const LinkTarget = { + NONE: 0, // Default value. + SELF: 1, + BLANK: 2, + PARENT: 3, + TOP: 4, +}; + +/** + * @typedef ExternalLinkParameters + * @typedef {Object} ExternalLinkParameters + * @property {string} url - An absolute URL. + * @property {LinkTarget} [target] - The link target. The default value is + * `LinkTarget.NONE`. + * @property {string} [rel] - The link relationship. The default value is + * `DEFAULT_LINK_REL`. + * @property {boolean} [enabled] - Whether the link should be enabled. The + * default value is true. + */ + +/** + * Adds various attributes (href, title, target, rel) to hyperlinks. + * @param {HTMLAnchorElement} link - The link element. + * @param {ExternalLinkParameters} params + */ +function addLinkAttributes(link, { url, target, rel, enabled = true } = {}) { + if (!url || typeof url !== "string") { + throw new Error('A valid "url" parameter must provided.'); + } + + const urlNullRemoved = removeNullCharacters(url); + if (enabled) { + link.href = link.title = urlNullRemoved; + } else { + link.href = ""; + link.title = `Disabled: ${urlNullRemoved}`; + link.onclick = () => { + return false; + }; + } + + let targetStr = ""; // LinkTarget.NONE + switch (target) { + case LinkTarget.NONE: + break; + case LinkTarget.SELF: + targetStr = "_self"; + break; + case LinkTarget.BLANK: + targetStr = "_blank"; + break; + case LinkTarget.PARENT: + targetStr = "_parent"; + break; + case LinkTarget.TOP: + targetStr = "_top"; + break; + } + link.target = targetStr; + + link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; +} /** * @typedef {Object} PDFLinkServiceOptions @@ -230,7 +295,7 @@ class PDFLinkService { } /** - * Wrapper around the `addLinkAttributes`-function in the API. + * Wrapper around the `addLinkAttributes` helper function. * @param {HTMLAnchorElement} link * @param {string} url * @param {boolean} [newWindow] @@ -634,4 +699,4 @@ class SimpleLinkService { } } -export { PDFLinkService, SimpleLinkService }; +export { LinkTarget, PDFLinkService, SimpleLinkService }; diff --git a/web/pdf_viewer.component.js b/web/pdf_viewer.component.js index dce7d9b93..a7a918cf1 100644 --- a/web/pdf_viewer.component.js +++ b/web/pdf_viewer.component.js @@ -19,7 +19,11 @@ import { DefaultTextLayerFactory, DefaultXfaLayerFactory, } from "./default_factory.js"; -import { PDFLinkService, SimpleLinkService } from "./pdf_link_service.js"; +import { + LinkTarget, + PDFLinkService, + SimpleLinkService, +} from "./pdf_link_service.js"; import { PDFSinglePageViewer, PDFViewer } from "./pdf_viewer.js"; import { AnnotationLayerBuilder } from "./annotation_layer_builder.js"; import { DownloadManager } from "./download_manager.js"; @@ -49,6 +53,7 @@ export { DownloadManager, EventBus, GenericL10n, + LinkTarget, NullL10n, PDFFindController, PDFHistory,