mirror of
https://github.com/mozilla/pdf.js.git
synced 2026-08-01 03:47:20 +02:00
The chrome is now authored against Firefox design-token names with the shipped value as a fallback `var(--fx-token, <literal>)` so colors, borders and radii follow Firefox instead of having to be re-synced by hand. In MOZCENTRAL viewer.css imports chrome://global/skin/design-system/tokens-brand.css, gated on the new pdfjs.enableNova pref (default false, read straight from CSS via -moz-pref()). With the pref off the sheet isn't applied, every fallback resolves, and the viewer renders as before, as it also does in the GENERIC and components builds, which never see the chrome sheet. Consuming a token means never declaring its name in an unlayered rule, which would shadow Firefox's for the whole subtree; --focus-outline, --border-color and --text-color/--button-border-color are therefore renamed to --editor-selection-outline, --signature-border-color and --views-*. In forced colors each state reads a matching background/foreground/border triple so it can't collapse to a single system color. The dialog button styling also moves out of `.dialog .mainContainer button` into a shared .primaryButton/.secondaryButton primitive (buttons.css, imported from pdf_viewer.css so the components build gets it too). The password, document-properties, print and undo-bar buttons use it in place of .dialogButton, and the custom radio appearance gives way to native controls tinted with accent-color.
1094 lines
25 KiB
JavaScript
1094 lines
25 KiB
JavaScript
/* Copyright 2018 Mozilla Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) {
|
|
var compatParams = new Map(); // eslint-disable-line no-var
|
|
const { maxTouchPoints, platform, userAgent } = navigator;
|
|
|
|
const isAndroid = /Android/.test(userAgent);
|
|
const isIOS =
|
|
/\b(?:iPad|iPhone|iPod)(?=;)/.test(userAgent) ||
|
|
(platform === "MacIntel" && maxTouchPoints > 1);
|
|
|
|
// Limit canvas size to 5 mega-pixels on mobile.
|
|
// Support: Android, iOS
|
|
if (isIOS || isAndroid) {
|
|
compatParams.set("maxCanvasPixels", 5242880);
|
|
}
|
|
|
|
// Don't use system fonts on Android (issue 18210).
|
|
// Support: Android
|
|
if (isAndroid) {
|
|
compatParams.set("useSystemFonts", false);
|
|
}
|
|
}
|
|
|
|
const OptionKind = {
|
|
BROWSER: 0x01,
|
|
VIEWER: 0x02,
|
|
API: 0x04,
|
|
WORKER: 0x08,
|
|
EVENT_DISPATCH: 0x10,
|
|
PREFERENCE: 0x80,
|
|
};
|
|
|
|
// Should only be used with options that allow multiple types.
|
|
const Type = {
|
|
BOOLEAN: 0x01,
|
|
NUMBER: 0x02,
|
|
OBJECT: 0x04,
|
|
STRING: 0x08,
|
|
UNDEFINED: 0x10,
|
|
};
|
|
|
|
/**
|
|
* NOTE: These options are used to generate the `default_preferences.json` file,
|
|
* see `OptionKind.PREFERENCE`, hence the values below must use only
|
|
* primitive types and cannot rely on any imported types.
|
|
*/
|
|
const defaultOptions = new Map([
|
|
// Begin OptionKind.BROWSER
|
|
[
|
|
"allowedGlobalEvents",
|
|
{
|
|
/** @type {Object} */
|
|
value: null,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"canvasMaxAreaInBytes",
|
|
{
|
|
/** @type {number} */
|
|
value: -1,
|
|
kind: OptionKind.BROWSER + OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"isInAutomation",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"localeProperties",
|
|
{
|
|
/** @type {Object} */
|
|
value:
|
|
typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")
|
|
? { lang: navigator.language || "en-US" }
|
|
: null,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"maxCanvasDim",
|
|
{
|
|
/** @type {number} */
|
|
value: 32767,
|
|
kind: OptionKind.BROWSER + OptionKind.VIEWER,
|
|
},
|
|
],
|
|
[
|
|
"nimbusDataStr",
|
|
{
|
|
/** @type {string} */
|
|
value: "",
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"supportsCaretBrowsingMode",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"supportsDocumentFonts",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"supportsDownloading",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"supportsIntegratedFind",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"supportsMouseWheelZoomCtrlKey",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"supportsMouseWheelZoomMetaKey",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"supportsPinchToZoom",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"supportsPrinting",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.BROWSER,
|
|
},
|
|
],
|
|
[
|
|
"toolbarDensity",
|
|
{
|
|
/** @type {number} */
|
|
value: 0, // 0 = "normal", 1 = "compact", 2 = "touch"
|
|
kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH,
|
|
},
|
|
],
|
|
// End OptionKind.BROWSER
|
|
|
|
// Begin OptionKind.VIEWER
|
|
[
|
|
"altTextLearnMoreUrl",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")
|
|
? "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/pdf-alt-text"
|
|
: "",
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"annotationEditorMode",
|
|
{
|
|
/** @type {number} */
|
|
value: 0,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"annotationMode",
|
|
{
|
|
/** @type {number} */
|
|
value: 2,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"capCanvasAreaFactor",
|
|
{
|
|
/** @type {number} */
|
|
value: 200,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"commentLearnMoreUrl",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
typeof PDFJSDev === "undefined" || PDFJSDev.test("MOZCENTRAL")
|
|
? "https://support.mozilla.org/%LOCALE%/kb/view-pdf-files-firefox-or-choose-another-viewer#w_add-a-comment-to-a-pdf"
|
|
: "",
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"cursorToolOnLoad",
|
|
{
|
|
/** @type {number} */
|
|
value: 0,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"debuggerSrc",
|
|
{
|
|
/** @type {string} */
|
|
value: "./debugger.mjs",
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
...(typeof PDFJSDev === "undefined" || !PDFJSDev.test("MOZCENTRAL")
|
|
? [
|
|
[
|
|
"defaultUrl",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
typeof PDFJSDev !== "undefined" && PDFJSDev.test("CHROME")
|
|
? ""
|
|
: "compressed.tracemonkey-pldi-09.pdf",
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
]
|
|
: []),
|
|
[
|
|
"defaultZoomDelay",
|
|
{
|
|
/** @type {number} */
|
|
value: 400,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"defaultZoomValue",
|
|
{
|
|
/** @type {string} */
|
|
value: "",
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"disableHistory",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
[
|
|
"disablePageLabels",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
...(typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")
|
|
? [
|
|
[
|
|
"disablePreferences",
|
|
{
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev !== "undefined" && PDFJSDev.test("TESTING"),
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
]
|
|
: []),
|
|
...(typeof PDFJSDev !== "undefined" && PDFJSDev.test("CHROME")
|
|
? [
|
|
[
|
|
"disableTelemetry",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
]
|
|
: []),
|
|
[
|
|
"enableAltText",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableAltTextModelDownload",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind:
|
|
OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,
|
|
},
|
|
],
|
|
[
|
|
"enableAutoLinking",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableComment",
|
|
{
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev === "undefined",
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableDetailCanvas",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
...(typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")
|
|
? [
|
|
[
|
|
"enableFakeMLManager",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
]
|
|
: []),
|
|
[
|
|
"enableGuessAltText",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind:
|
|
OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,
|
|
},
|
|
],
|
|
[
|
|
"enableHighlightFloatingButton",
|
|
{
|
|
// We'll probably want to make some experiments before enabling this
|
|
// in Firefox release, but it has to be temporary.
|
|
// TODO: remove it when unnecessary.
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING"),
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableMerge",
|
|
{
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING"),
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableNewAltTextWhenAddingImage",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableNewBadge",
|
|
{
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev === "undefined" || PDFJSDev.test("MOZCENTRAL"),
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
// Whether the viewer follows the Firefox design system (see the pref-gated
|
|
// @import of tokens-brand.css in viewer.css). Read from CSS via
|
|
// -moz-pref(), not from JS, so it is Firefox-only and has no effect
|
|
// elsewhere.
|
|
"enableNova",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableOptimizedPartialRendering",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enablePermissions",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enablePrintAutoRotate",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableScripting",
|
|
{
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev === "undefined" || !PDFJSDev.test("CHROME"),
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableSelectionRendering",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableSignatureEditor",
|
|
{
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING"),
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableSignatureVerification",
|
|
{
|
|
// On in MOZCENTRAL (NSS provides the verification path) and in
|
|
// local dev builds; off in shipping GENERIC builds, where no
|
|
// verifier is wired up by default.
|
|
/** @type {boolean} */
|
|
value:
|
|
typeof PDFJSDev === "undefined" ||
|
|
PDFJSDev.test("TESTING || MOZCENTRAL"),
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableSplitMerge",
|
|
{
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING"),
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableUpdatedAddImage",
|
|
{
|
|
// We'll probably want to make some experiments before enabling this
|
|
// in Firefox release, but it has to be temporary.
|
|
// TODO: remove it when unnecessary.
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"externalLinkRel",
|
|
{
|
|
/** @type {string} */
|
|
value: "noopener noreferrer nofollow",
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
[
|
|
"externalLinkTarget",
|
|
{
|
|
/** @type {number} */
|
|
value: 0,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
...(typeof PDFJSDev === "undefined" ||
|
|
PDFJSDev.test("MOZCENTRAL && !GECKOVIEW")
|
|
? [
|
|
[
|
|
"featuresNotificationDismissed",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind:
|
|
OptionKind.VIEWER +
|
|
OptionKind.PREFERENCE +
|
|
OptionKind.EVENT_DISPATCH,
|
|
},
|
|
],
|
|
]
|
|
: []),
|
|
[
|
|
"highlightEditorColors",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
"yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F," +
|
|
"yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043",
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"historyUpdateUrl",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"ignoreDestinationZoom",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"imageResourcesPath",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")
|
|
? "resource://pdf.js/web/images/"
|
|
: "./images/",
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
[
|
|
"imagesRightClickMinSize",
|
|
{
|
|
/** @type {number} */
|
|
value:
|
|
typeof PDFJSDev === "undefined" ||
|
|
// Firefox mobile does not support right-clicking on images,
|
|
// see https://bugzilla.mozilla.org/show_bug.cgi?id=2014081.
|
|
// This option is disabled by default outside of MOZCENTRAL
|
|
// because it degrades the text selection experience in Chrome
|
|
// and Safari.
|
|
PDFJSDev.test("MOZCENTRAL && !GECKOVIEW")
|
|
? 16
|
|
: -1,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"maxCanvasPixels",
|
|
{
|
|
/** @type {number} */
|
|
value: 2 ** 25,
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
[
|
|
"minDurationToUpdateCanvas",
|
|
{
|
|
/** @type {number} */
|
|
value: 500, // ms
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
[
|
|
"forcePageColors",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"pageColorsBackground",
|
|
{
|
|
/** @type {string} */
|
|
value: "Canvas",
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"pageColorsForeground",
|
|
{
|
|
/** @type {string} */
|
|
value: "CanvasText",
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"pdfBugEnabled",
|
|
{
|
|
/** @type {boolean} */
|
|
value: typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING"),
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"postMessageAfterPrintCallback",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"printResolution",
|
|
{
|
|
/** @type {number} */
|
|
value: 150,
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
...(typeof PDFJSDev === "undefined" || !PDFJSDev.test("MOZCENTRAL")
|
|
? [
|
|
[
|
|
"sandboxBundleSrc",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
typeof PDFJSDev === "undefined"
|
|
? "../build/dev-sandbox/pdf.sandbox.mjs"
|
|
: "../build/pdf.sandbox.mjs",
|
|
kind: OptionKind.VIEWER,
|
|
},
|
|
],
|
|
]
|
|
: []),
|
|
[
|
|
"sidebarViewOnLoad",
|
|
{
|
|
/** @type {number} */
|
|
value: -1,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"scrollModeOnLoad",
|
|
{
|
|
/** @type {number} */
|
|
value: -1,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"spreadModeOnLoad",
|
|
{
|
|
/** @type {number} */
|
|
value: -1,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"textLayerMode",
|
|
{
|
|
/** @type {number} */
|
|
value: 1,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"viewerCssTheme",
|
|
{
|
|
/** @type {number} */
|
|
value: typeof PDFJSDev !== "undefined" && PDFJSDev.test("CHROME") ? 2 : 0,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"viewOnLoad",
|
|
{
|
|
/** @type {boolean} */
|
|
value: 0,
|
|
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
// End OptionKind.VIEWER
|
|
|
|
// Begin OptionKind.API
|
|
[
|
|
"cMapPacked",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"cMapUrl",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
// eslint-disable-next-line no-nested-ternary
|
|
typeof PDFJSDev === "undefined"
|
|
? "../external/bcmaps/"
|
|
: PDFJSDev.test("MOZCENTRAL")
|
|
? "resource://pdf.js/web/cmaps/"
|
|
: "../web/cmaps/",
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"disableAutoFetch",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.API + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"disableFontFace",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.API + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"disableRange",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.API + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"disableStream",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.API + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"docBaseUrl",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
typeof PDFJSDev === "undefined"
|
|
? // NOTE: We cannot use the `updateUrlHash` function here, because of
|
|
// the default preferences generation (see `gulpfile.mjs`).
|
|
// However, the following line is *only* used in development mode.
|
|
document.URL.split("#", 1)[0]
|
|
: "",
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"enableHWA",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.API + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableWebGPU",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.API + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"enableXfa",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.API + OptionKind.PREFERENCE,
|
|
},
|
|
],
|
|
[
|
|
"fontExtraProperties",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"iccUrl",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
// eslint-disable-next-line no-nested-ternary
|
|
typeof PDFJSDev === "undefined"
|
|
? "../external/iccs/"
|
|
: PDFJSDev.test("MOZCENTRAL")
|
|
? "resource://pdf.js/web/iccs/"
|
|
: "../web/iccs/",
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"isOffscreenCanvasSupported",
|
|
{
|
|
/** @type {boolean} */
|
|
value: true,
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"maxImageSize",
|
|
{
|
|
/** @type {number} */
|
|
value: -1,
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"pdfBug",
|
|
{
|
|
/** @type {boolean} */
|
|
value: false,
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"standardFontDataUrl",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
// eslint-disable-next-line no-nested-ternary
|
|
typeof PDFJSDev === "undefined"
|
|
? "../external/standard_fonts/"
|
|
: PDFJSDev.test("MOZCENTRAL")
|
|
? "resource://pdf.js/web/standard_fonts/"
|
|
: "../web/standard_fonts/",
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"useSystemFonts",
|
|
{
|
|
// On Android, there is almost no chance to have the font we want so we
|
|
// don't use the system fonts in this case (bug 1882613).
|
|
/** @type {boolean|undefined} */
|
|
value: (
|
|
typeof PDFJSDev === "undefined"
|
|
? window.isGECKOVIEW
|
|
: PDFJSDev.test("GECKOVIEW")
|
|
)
|
|
? false
|
|
: undefined,
|
|
kind: OptionKind.API,
|
|
type: Type.BOOLEAN + Type.UNDEFINED,
|
|
},
|
|
],
|
|
[
|
|
"verbosity",
|
|
{
|
|
/** @type {number} */
|
|
value: 1,
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
[
|
|
"wasmUrl",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")
|
|
? "resource://pdf.js/web/wasm/"
|
|
: "../web/wasm/",
|
|
kind: OptionKind.API,
|
|
},
|
|
],
|
|
// End OptionKind.API
|
|
|
|
// Begin OptionKind.WORKER
|
|
[
|
|
"workerPort",
|
|
{
|
|
/** @type {Object} */
|
|
value:
|
|
typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")
|
|
? globalThis.pdfjsPreloadedWorker || null
|
|
: null,
|
|
kind: OptionKind.WORKER,
|
|
},
|
|
],
|
|
[
|
|
"workerSrc",
|
|
{
|
|
/** @type {string} */
|
|
value:
|
|
// eslint-disable-next-line no-nested-ternary
|
|
typeof PDFJSDev === "undefined"
|
|
? "../src/pdf.worker.js"
|
|
: PDFJSDev.test("MOZCENTRAL")
|
|
? "resource://pdf.js/build/pdf.worker.mjs"
|
|
: "../build/pdf.worker.mjs",
|
|
kind: OptionKind.WORKER,
|
|
},
|
|
],
|
|
// End OptionKind.WORKER
|
|
]);
|
|
|
|
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
|
|
// Ensure that the `defaultOptions` are correctly specified.
|
|
for (const [name, { value, kind, type }] of defaultOptions) {
|
|
if (kind & OptionKind.PREFERENCE) {
|
|
if (kind === OptionKind.PREFERENCE) {
|
|
throw new Error(`Cannot use only "PREFERENCE" kind: ${name}`);
|
|
}
|
|
if (kind & OptionKind.BROWSER) {
|
|
throw new Error(`Cannot mix "PREFERENCE" and "BROWSER" kind: ${name}`);
|
|
}
|
|
if (type !== undefined) {
|
|
throw new Error(
|
|
`Cannot have \`type\`-field for "PREFERENCE" kind: ${name}`
|
|
);
|
|
}
|
|
if (typeof compatParams === "object" && compatParams.has(name)) {
|
|
throw new Error(
|
|
`Should not have compatibility-value for "PREFERENCE" kind: ${name}`
|
|
);
|
|
}
|
|
// Only "simple" preference-values are allowed.
|
|
if (
|
|
typeof value !== "boolean" &&
|
|
typeof value !== "string" &&
|
|
!Number.isInteger(value)
|
|
) {
|
|
throw new Error(`Invalid value for "PREFERENCE" kind: ${name}`);
|
|
}
|
|
} else if (kind & OptionKind.BROWSER) {
|
|
if (type !== undefined) {
|
|
throw new Error(
|
|
`Cannot have \`type\`-field for "BROWSER" kind: ${name}`
|
|
);
|
|
}
|
|
if (typeof compatParams === "object" && compatParams.has(name)) {
|
|
throw new Error(
|
|
`Should not have compatibility-value for "BROWSER" kind: ${name}`
|
|
);
|
|
}
|
|
if (value === undefined) {
|
|
throw new Error(`Invalid value for "BROWSER" kind: ${name}`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class AppOptions {
|
|
static eventBus;
|
|
|
|
static #opts = new Map();
|
|
|
|
static {
|
|
// Initialize all the user-options.
|
|
for (const [name, defaultOpt] of defaultOptions) {
|
|
this.#opts.set(name, defaultOpt.value);
|
|
}
|
|
|
|
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) {
|
|
// Apply any compatibility-values to the user-options.
|
|
for (const [name, value] of compatParams) {
|
|
this.#opts.set(name, value);
|
|
}
|
|
this._hasInvokedSet = false;
|
|
|
|
this._checkDisablePreferences = () => {
|
|
if (this.get("disablePreferences")) {
|
|
// Give custom implementations of the default viewer a simpler way to
|
|
// opt-out of having the `Preferences` override existing `AppOptions`.
|
|
return true;
|
|
}
|
|
if (this._hasInvokedSet) {
|
|
console.warn(
|
|
"The Preferences may override manually set AppOptions; " +
|
|
'please use the "disablePreferences"-option to prevent that.'
|
|
);
|
|
}
|
|
return false;
|
|
};
|
|
}
|
|
}
|
|
|
|
constructor() {
|
|
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
|
|
throw new Error("Cannot initialize AppOptions.");
|
|
}
|
|
}
|
|
|
|
static get(name) {
|
|
return this.#opts.get(name);
|
|
}
|
|
|
|
static getAll(kind = null, defaultOnly = false) {
|
|
const options = Object.create(null);
|
|
for (const [name, defaultOpt] of defaultOptions) {
|
|
if (kind && !(kind & defaultOpt.kind)) {
|
|
continue;
|
|
}
|
|
options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value;
|
|
}
|
|
return options;
|
|
}
|
|
|
|
static set(name, value) {
|
|
this.setAll({ [name]: value });
|
|
}
|
|
|
|
static setAll(options, prefs = false) {
|
|
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) {
|
|
this._hasInvokedSet ||= true;
|
|
}
|
|
let events;
|
|
|
|
for (const name in options) {
|
|
const defaultOpt = defaultOptions.get(name),
|
|
userOpt = options[name];
|
|
|
|
if (
|
|
!defaultOpt ||
|
|
!(
|
|
typeof userOpt === typeof defaultOpt.value ||
|
|
Type[(typeof userOpt).toUpperCase()] & defaultOpt.type
|
|
)
|
|
) {
|
|
continue;
|
|
}
|
|
const { kind } = defaultOpt;
|
|
|
|
if (
|
|
prefs &&
|
|
!(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)
|
|
) {
|
|
continue;
|
|
}
|
|
if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) {
|
|
(events ||= new Map()).set(name, userOpt);
|
|
}
|
|
this.#opts.set(name, userOpt);
|
|
}
|
|
|
|
if (events) {
|
|
for (const [name, value] of events) {
|
|
this.eventBus.dispatch(name.toLowerCase(), { source: this, value });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export { AppOptions, OptionKind };
|