mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-20 15:18:08 +02:00
Merge pull request #19577 from Snuffleupagus/isValidExplicitDest-reuse
Re-use the `isValidExplicitDest` helper function in the worker/viewer
This commit is contained in:
commit
be6ef64a2c
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 { FileSpec } from "./file_spec.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
|
||||
|
@ -3485,6 +3491,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