diff --git a/web/app.js b/web/app.js index 3c5e80856..02436ff4a 100644 --- a/web/app.js +++ b/web/app.js @@ -1004,16 +1004,6 @@ const PDFViewerApplication = { AppOptions.set("docBaseUrl", this.baseUrl); } - // On Android, there is almost no chance to have the font we want so we - // don't use the system fonts in this case. - if ( - typeof PDFJSDev === "undefined" - ? window.isGECKOVIEW - : PDFJSDev.test("GECKOVIEW") - ) { - args.useSystemFonts = false; - } - // Set the necessary API parameters, using all the available options. const apiParams = AppOptions.getAll(OptionKind.API); const loadingTask = getDocument({ diff --git a/web/app_options.js b/web/app_options.js index acb18e434..7940d9786 100644 --- a/web/app_options.js +++ b/web/app_options.js @@ -39,6 +39,14 @@ if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { compatParams.set("maxCanvasPixels", 5242880); } })(); + + // Don't use system fonts on Android (issue 18210). + // Support: Android + (function () { + if (isAndroid) { + compatParams.set("useSystemFonts", false); + } + })(); } const OptionKind = { @@ -47,6 +55,7 @@ const OptionKind = { API: 0x04, WORKER: 0x08, EVENT_DISPATCH: 0x10, + UNDEF_ALLOWED: 0x20, PREFERENCE: 0x80, }; @@ -385,6 +394,19 @@ const defaultOptions = { : "../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 + OptionKind.UNDEF_ALLOWED, + }, verbosity: { /** @type {number} */ value: 1, @@ -472,6 +494,11 @@ if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING || LIB")) { if (kind & OptionKind.BROWSER) { throw new Error(`Cannot mix "PREFERENCE" and "BROWSER" kind: ${name}`); } + if (kind & OptionKind.UNDEF_ALLOWED) { + throw new Error( + `Cannot allow \`undefined\` value for "PREFERENCE" kind: ${name}` + ); + } if (typeof compatParams === "object" && compatParams.has(name)) { throw new Error( `Should not have compatibility-value for "PREFERENCE" kind: ${name}` @@ -486,6 +513,11 @@ if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING || LIB")) { throw new Error(`Invalid value for "PREFERENCE" kind: ${name}`); } } else if (kind & OptionKind.BROWSER) { + if (kind & OptionKind.UNDEF_ALLOWED) { + throw new Error( + `Cannot allow \`undefined\` value for "BROWSER" kind: ${name}` + ); + } if (typeof compatParams === "object" && compatParams.has(name)) { throw new Error( `Should not have compatibility-value for "BROWSER" kind: ${name}` @@ -514,23 +546,30 @@ class AppOptions { static getAll(kind = null, defaultOnly = false) { const options = Object.create(null); for (const name in defaultOptions) { - const defaultOption = defaultOptions[name]; + const defaultOpt = defaultOptions[name]; - if (kind && !(kind & defaultOption.kind)) { + if (kind && !(kind & defaultOpt.kind)) { continue; } options[name] = !defaultOnly && userOptions.has(name) ? userOptions.get(name) - : defaultOption.value; + : defaultOpt.value; } return options; } static set(name, value) { - const defaultOption = defaultOptions[name]; + const defaultOpt = defaultOptions[name]; - if (!defaultOption || typeof value !== typeof defaultOption.value) { + if ( + !defaultOpt || + !( + typeof value === typeof defaultOpt.value || + (defaultOpt.kind & OptionKind.UNDEF_ALLOWED && + (value === undefined || defaultOpt.value === undefined)) + ) + ) { return; } userOptions.set(name, value); @@ -540,23 +579,30 @@ class AppOptions { let events; for (const name in options) { - const defaultOption = defaultOptions[name], - userOption = options[name]; + const defaultOpt = defaultOptions[name], + userOpt = options[name]; - if (!defaultOption || typeof userOption !== typeof defaultOption.value) { + if ( + !defaultOpt || + !( + typeof userOpt === typeof defaultOpt.value || + (defaultOpt.kind & OptionKind.UNDEF_ALLOWED && + (userOpt === undefined || defaultOpt.value === undefined)) + ) + ) { continue; } if (prefs) { - const { kind } = defaultOption; + const { kind } = defaultOpt; if (!(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)) { continue; } if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) { - (events ||= new Map()).set(name, userOption); + (events ||= new Map()).set(name, userOpt); } } - userOptions.set(name, userOption); + userOptions.set(name, userOpt); } if (events) { diff --git a/web/viewer-geckoview.html b/web/viewer-geckoview.html index 7d0d936f7..dee94a04d 100644 --- a/web/viewer-geckoview.html +++ b/web/viewer-geckoview.html @@ -42,6 +42,12 @@ See https://github.com/adobe-type-tools/cmap-resources + +