mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-23 08:38:06 +02:00
Re-use the isValidExplicitDest
helper function in the worker/viewer
Currently we re-implement the same helper function twice, which in hindsight seems like the wrong decision since that way it's quite easy for the implementations to accidentally diverge. The reason for doing it this way was because the code in the worker-thread is able to check for `Ref`- and `Name`-instances directly, which obviously isn't possible in the viewer but can be solved by passing validation-functions to the helper.
This commit is contained in:
parent
5f4d923618
commit
165d90fe26
7 changed files with 90 additions and 119 deletions
|
@ -14,15 +14,7 @@
|
|||
*/
|
||||
|
||||
import {
|
||||
collectActions,
|
||||
isNumberArray,
|
||||
MissingDataException,
|
||||
PDF_VERSION_REGEXP,
|
||||
recoverJsURL,
|
||||
toRomanNumerals,
|
||||
XRefEntryException,
|
||||
} from "./core_utils.js";
|
||||
import {
|
||||
_isValidExplicitDest,
|
||||
createValidAbsoluteUrl,
|
||||
DocumentActionEventType,
|
||||
FormatError,
|
||||
|
@ -34,6 +26,15 @@ import {
|
|||
stringToUTF8String,
|
||||
warn,
|
||||
} from "../shared/util.js";
|
||||
import {
|
||||
collectActions,
|
||||
isNumberArray,
|
||||
MissingDataException,
|
||||
PDF_VERSION_REGEXP,
|
||||
recoverJsURL,
|
||||
toRomanNumerals,
|
||||
XRefEntryException,
|
||||
} from "./core_utils.js";
|
||||
import {
|
||||
Dict,
|
||||
isDict,
|
||||
|
@ -53,52 +54,13 @@ import { GlobalImageCache } from "./image_utils.js";
|
|||
import { MetadataParser } from "./metadata_parser.js";
|
||||
import { StructTreeRoot } from "./struct_tree.js";
|
||||
|
||||
function isValidExplicitDest(dest) {
|
||||
if (!Array.isArray(dest) || dest.length < 2) {
|
||||
return false;
|
||||
}
|
||||
const [page, zoom, ...args] = dest;
|
||||
if (!(page instanceof Ref) && !Number.isInteger(page)) {
|
||||
return false;
|
||||
}
|
||||
if (!(zoom instanceof Name)) {
|
||||
return false;
|
||||
}
|
||||
const argsLen = args.length;
|
||||
let allowNull = true;
|
||||
switch (zoom.name) {
|
||||
case "XYZ":
|
||||
if (argsLen < 2 || argsLen > 3) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case "Fit":
|
||||
case "FitB":
|
||||
return argsLen === 0;
|
||||
case "FitH":
|
||||
case "FitBH":
|
||||
case "FitV":
|
||||
case "FitBV":
|
||||
if (argsLen > 1) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case "FitR":
|
||||
if (argsLen !== 4) {
|
||||
return false;
|
||||
}
|
||||
allowNull = false;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
for (const arg of args) {
|
||||
if (!(typeof arg === "number" || (allowNull && arg === null))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
const isRef = v => v instanceof Ref;
|
||||
|
||||
const isValidExplicitDest = _isValidExplicitDest.bind(
|
||||
null,
|
||||
/* validRef = */ isRef,
|
||||
/* validName = */ isName
|
||||
);
|
||||
|
||||
function fetchDest(dest) {
|
||||
if (dest instanceof Dict) {
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
|
||||
import {
|
||||
_isValidExplicitDest,
|
||||
AbortException,
|
||||
AnnotationMode,
|
||||
assert,
|
||||
|
@ -595,15 +596,20 @@ function getFactoryUrlProp(val) {
|
|||
throw new Error(`Invalid factory url: "${val}" must include trailing slash.`);
|
||||
}
|
||||
|
||||
function isRefProxy(ref) {
|
||||
return (
|
||||
typeof ref === "object" &&
|
||||
Number.isInteger(ref?.num) &&
|
||||
ref.num >= 0 &&
|
||||
Number.isInteger(ref?.gen) &&
|
||||
ref.gen >= 0
|
||||
);
|
||||
}
|
||||
const isRefProxy = v =>
|
||||
typeof v === "object" &&
|
||||
Number.isInteger(v?.num) &&
|
||||
v.num >= 0 &&
|
||||
Number.isInteger(v?.gen) &&
|
||||
v.gen >= 0;
|
||||
|
||||
const isNameProxy = v => typeof v === "object" && typeof v?.name === "string";
|
||||
|
||||
const isValidExplicitDest = _isValidExplicitDest.bind(
|
||||
null,
|
||||
/* validRef = */ isRefProxy,
|
||||
/* validName = */ isNameProxy
|
||||
);
|
||||
|
||||
/**
|
||||
* @typedef {Object} OnProgressParameters
|
||||
|
@ -3484,6 +3490,7 @@ const build =
|
|||
export {
|
||||
build,
|
||||
getDocument,
|
||||
isValidExplicitDest,
|
||||
LoopbackPort,
|
||||
PDFDataRangeTransport,
|
||||
PDFDocumentLoadingTask,
|
||||
|
|
|
@ -45,6 +45,7 @@ import {
|
|||
import {
|
||||
build,
|
||||
getDocument,
|
||||
isValidExplicitDest,
|
||||
PDFDataRangeTransport,
|
||||
PDFWorker,
|
||||
version,
|
||||
|
@ -117,6 +118,7 @@ export {
|
|||
InvalidPDFException,
|
||||
isDataScheme,
|
||||
isPdfFile,
|
||||
isValidExplicitDest,
|
||||
noContextMenu,
|
||||
normalizeUnicode,
|
||||
OPS,
|
||||
|
|
|
@ -1080,6 +1080,54 @@ function getUuid() {
|
|||
|
||||
const AnnotationPrefix = "pdfjs_internal_id_";
|
||||
|
||||
function _isValidExplicitDest(validRef, validName, dest) {
|
||||
if (!Array.isArray(dest) || dest.length < 2) {
|
||||
return false;
|
||||
}
|
||||
const [page, zoom, ...args] = dest;
|
||||
if (!validRef(page) && !Number.isInteger(page)) {
|
||||
return false;
|
||||
}
|
||||
if (!validName(zoom)) {
|
||||
return false;
|
||||
}
|
||||
const argsLen = args.length;
|
||||
let allowNull = true;
|
||||
switch (zoom.name) {
|
||||
case "XYZ":
|
||||
if (argsLen < 2 || argsLen > 3) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case "Fit":
|
||||
case "FitB":
|
||||
return argsLen === 0;
|
||||
case "FitH":
|
||||
case "FitBH":
|
||||
case "FitV":
|
||||
case "FitBV":
|
||||
if (argsLen > 1) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case "FitR":
|
||||
if (argsLen !== 4) {
|
||||
return false;
|
||||
}
|
||||
allowNull = false;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
for (const arg of args) {
|
||||
if (typeof arg === "number" || (allowNull && arg === null)) {
|
||||
continue;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: Remove this once `Uint8Array.prototype.toHex` is generally available.
|
||||
function toHexUtil(arr) {
|
||||
if (Uint8Array.prototype.toHex) {
|
||||
|
@ -1119,6 +1167,7 @@ if (
|
|||
}
|
||||
|
||||
export {
|
||||
_isValidExplicitDest,
|
||||
AbortException,
|
||||
AnnotationActionEventType,
|
||||
AnnotationBorderStyleType,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue