From 3d4e8bb17e888c9c66f2dbe5111cb89edc1e0878 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 28 Apr 2025 12:52:42 +0200 Subject: [PATCH] Add a basic `navigator` polyfill for older Node.js versions Modern Node.js versions now include a `navigator` implementation, with a few basic properties, that's actually enough for the PDF.js use-cases; please see https://nodejs.org/api/globals.html#navigator Unfortunately we still support Node.js version `20`, hence we add a basic polyfill since that allows simplifying the code slightly. --- src/display/node_utils.js | 7 +++++++ src/shared/util.js | 30 ++++++++---------------------- web/app_options.js | 13 ++++++++----- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/display/node_utils.js b/src/display/node_utils.js index 0085825f6..724cca78b 100644 --- a/src/display/node_utils.js +++ b/src/display/node_utils.js @@ -67,6 +67,13 @@ if (isNodeJS) { warn("Cannot polyfill `Path2D`, rendering may be broken."); } } + if (!globalThis.navigator?.language) { + globalThis.navigator = { + language: "en-US", + platform: "", + userAgent: "", + }; + } } } diff --git a/src/shared/util.js b/src/shared/util.js index a0eaf7c01..0ced6e137 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -643,30 +643,16 @@ class FeatureTest { } static get platform() { - if ( - (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) || - (typeof navigator !== "undefined" && - typeof navigator?.platform === "string" && - typeof navigator?.userAgent === "string") - ) { - const { platform, userAgent } = navigator; + const { platform, userAgent } = navigator; - return shadow(this, "platform", { - isAndroid: userAgent.includes("Android"), - isLinux: platform.includes("Linux"), - isMac: platform.includes("Mac"), - isWindows: platform.includes("Win"), - isFirefox: - (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) || - userAgent.includes("Firefox"), - }); - } return shadow(this, "platform", { - isAndroid: false, - isLinux: false, - isMac: false, - isWindows: false, - isFirefox: false, + isAndroid: userAgent.includes("Android"), + isLinux: platform.includes("Linux"), + isMac: platform.includes("Mac"), + isWindows: platform.includes("Win"), + isFirefox: + (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) || + userAgent.includes("Firefox"), }); } diff --git a/web/app_options.js b/web/app_options.js index df4b6a57b..d9b8d3fed 100644 --- a/web/app_options.js +++ b/web/app_options.js @@ -19,13 +19,16 @@ if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { if ( typeof PDFJSDev !== "undefined" && PDFJSDev.test("LIB") && - typeof navigator === "undefined" + !globalThis.navigator?.language ) { - globalThis.navigator = Object.create(null); + globalThis.navigator = { + language: "en-US", + maxTouchPoints: 1, + platform: "", + userAgent: "", + }; } - const userAgent = navigator.userAgent || ""; - const platform = navigator.platform || ""; - const maxTouchPoints = navigator.maxTouchPoints || 1; + const { maxTouchPoints, platform, userAgent } = navigator; const isAndroid = /Android/.test(userAgent); const isIOS =