Skip to content

Commit

Permalink
Disable system fonts on Android (issue 18210)
Browse files Browse the repository at this point in the history
To avoid introducing any inline "hacks" in the viewer-code this meant adding `useSystemFonts` to the AppOptions, which thus required some new functionality since the default value should be `undefined` given how the option is handled in the API; note [this code](https://github.com/mozilla/pdf.js/blob/ed83d7c5e16798a56c493d56aaa8200dd280bb17/src/display/api.js#L298-L301).

Finally, also moves the definition of the development-mode `window.isGECKOVIEW` property to the HTML file such that it's guaranteed to be set regardless of how and when it's accessed.
  • Loading branch information
Snuffleupagus committed Jul 21, 2024
1 parent 98f7af3 commit 03b9a80
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 15 deletions.
10 changes: 0 additions & 10 deletions web/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -1003,16 +1003,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({
Expand Down
50 changes: 48 additions & 2 deletions web/app_options.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand All @@ -47,6 +55,7 @@ const OptionKind = {
API: 0x04,
WORKER: 0x08,
EVENT_DISPATCH: 0x10,
UNDEF_ALLOWED: 0x20,
PREFERENCE: 0x80,
};

Expand Down Expand Up @@ -377,6 +386,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,
Expand Down Expand Up @@ -464,6 +486,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}`
Expand All @@ -478,6 +505,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}`
Expand Down Expand Up @@ -522,7 +554,14 @@ class AppOptions {
static set(name, value) {
const defaultOpt = defaultOptions[name];

if (!defaultOpt || typeof value !== typeof defaultOpt.value) {
if (
!defaultOpt ||
!(
typeof value === typeof defaultOpt.value ||
(defaultOpt.kind & OptionKind.UNDEF_ALLOWED &&
(value === undefined || defaultOpt.value === undefined))
)
) {
return;
}
userOptions.set(name, value);
Expand All @@ -535,7 +574,14 @@ class AppOptions {
const defaultOpt = defaultOptions[name],
userOpt = options[name];

if (!defaultOpt || typeof userOpt !== typeof defaultOpt.value) {
if (
!defaultOpt ||
!(
typeof userOpt === typeof defaultOpt.value ||
(defaultOpt.kind & OptionKind.UNDEF_ALLOWED &&
(userOpt === undefined || defaultOpt.value === undefined))
)
) {
continue;
}
if (prefs) {
Expand Down
6 changes: 6 additions & 0 deletions web/viewer-geckoview.html
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@
<!--#endif-->

<!--#if !MOZCENTRAL-->
<script>
if (typeof PDFJSDev === "undefined") {
window.isGECKOVIEW = true;
}
</script>

<script type="importmap">
{
"imports": {
Expand Down
3 changes: 0 additions & 3 deletions web/viewer-geckoview.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,6 @@ function getViewerConfiguration() {
function webViewerLoad() {
const config = getViewerConfiguration();

if (typeof PDFJSDev === "undefined") {
window.isGECKOVIEW = true;
}
PDFViewerApplication.run(config);
}

Expand Down

0 comments on commit 03b9a80

Please sign in to comment.