From 337cba736e4a0c6ac14f6a2d494941abd3f2eae6 Mon Sep 17 00:00:00 2001
From: Jonas Jenwald <jonas.jenwald@gmail.com>
Date: Thu, 13 Jul 2023 12:20:58 +0200
Subject: [PATCH 1/3] [ESM] Remove the remaining `require` from the gulpfile

---
 gulpfile.mjs | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/gulpfile.mjs b/gulpfile.mjs
index cada4f8d4..160b1a953 100644
--- a/gulpfile.mjs
+++ b/gulpfile.mjs
@@ -17,7 +17,7 @@
 import * as builder from "./external/builder/builder.mjs";
 import { exec, spawn, spawnSync } from "child_process";
 import autoprefixer from "autoprefixer";
-import { createRequire } from "module";
+import babel from "@babel/core";
 import crypto from "crypto";
 import { fileURLToPath } from "url";
 import fs from "fs";
@@ -41,7 +41,6 @@ import webpackStream from "webpack-stream";
 import zip from "gulp-zip";
 
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
-const require = createRequire(import.meta.url);
 
 const BUILD_DIR = "build/";
 const L10N_DIR = "l10n/";
@@ -1528,14 +1527,14 @@ function buildLibHelper(bundleDefines, inputStream, outputDir) {
   // __non_webpack_require__ has to be used.
   // In this target, we don't create a bundle, so we have to replace the
   // occurrences of __non_webpack_require__ ourselves.
-  function babelPluginReplaceNonWebpackImports(babel) {
+  function babelPluginReplaceNonWebpackImports(b) {
     return {
       visitor: {
         Identifier(curPath, state) {
           if (curPath.node.name === "__non_webpack_require__") {
-            curPath.replaceWith(babel.types.identifier("require"));
+            curPath.replaceWith(b.types.identifier("require"));
           } else if (curPath.node.name === "__non_webpack_import__") {
-            curPath.replaceWith(babel.types.identifier("import"));
+            curPath.replaceWith(b.types.identifier("import"));
           }
         },
       },
@@ -1562,7 +1561,6 @@ function buildLibHelper(bundleDefines, inputStream, outputDir) {
     );
     return licenseHeaderLibre + content;
   }
-  const babel = require("@babel/core");
   const ctx = {
     rootPath: __dirname,
     saveComments: false,

From 86a868189c58c2028482ef0cc8da7c40b34f8414 Mon Sep 17 00:00:00 2001
From: Jonas Jenwald <jonas.jenwald@gmail.com>
Date: Thu, 13 Jul 2023 13:10:06 +0200
Subject: [PATCH 2/3] Re-factor the `PDFScriptingManager`-class for the
 viewer-components

Currently this class contains a few "special" code-paths for the COMPONENTS build-target, which normally wouldn't be a problem. However, in this particular case that means accessing code that we don't want to include unconditionally in all builds.
This is currently implemented using build-time `require`-calls which we nowadays want to avoid, and we should strive to remove all such cases from the code-base. (Generally speaking `import` is the future, and build-tools may not always play well with a mix of both formats.)

We can easily improve things here by using sub-classing for the COMPONENTS build-target, and then use the ability to re-name when exporting (to avoid breaking existing code).
---
 test/unit/pdf_viewer.component_spec.js |  2 +-
 web/pdf_scripting_manager.component.js | 44 ++++++++++++++++++++++++++
 web/pdf_scripting_manager.js           | 24 --------------
 web/pdf_viewer.component.js            |  2 +-
 4 files changed, 46 insertions(+), 26 deletions(-)
 create mode 100644 web/pdf_scripting_manager.component.js

diff --git a/test/unit/pdf_viewer.component_spec.js b/test/unit/pdf_viewer.component_spec.js
index e4f4923bd..d527acace 100644
--- a/test/unit/pdf_viewer.component_spec.js
+++ b/test/unit/pdf_viewer.component_spec.js
@@ -33,7 +33,7 @@ import { GenericL10n } from "../../web/genericl10n.js";
 import { NullL10n } from "../../web/l10n_utils.js";
 import { PDFHistory } from "../../web/pdf_history.js";
 import { PDFPageView } from "../../web/pdf_page_view.js";
-import { PDFScriptingManager } from "../../web/pdf_scripting_manager.js";
+import { PDFScriptingManager } from "../../web/pdf_scripting_manager.component.js";
 import { PDFSinglePageViewer } from "../../web/pdf_single_page_viewer.js";
 import { PDFViewer } from "../../web/pdf_viewer.js";
 import { StructTreeLayerBuilder } from "../../web/struct_tree_layer_builder.js";
diff --git a/web/pdf_scripting_manager.component.js b/web/pdf_scripting_manager.component.js
new file mode 100644
index 000000000..e5b3796c2
--- /dev/null
+++ b/web/pdf_scripting_manager.component.js
@@ -0,0 +1,44 @@
+/* Copyright 2021 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.
+ */
+
+import { docProperties, GenericScripting } from "./generic_scripting.js";
+import { PDFScriptingManager } from "./pdf_scripting_manager.js";
+
+class PDFScriptingManagerComponents extends PDFScriptingManager {
+  constructor(options) {
+    // The default viewer already handles adding/removing of DOM events,
+    // hence limit this to only the viewer components.
+    if (!options.externalServices) {
+      window.addEventListener("updatefromsandbox", event => {
+        options.eventBus.dispatch("updatefromsandbox", {
+          source: window,
+          detail: event.detail,
+        });
+      });
+    }
+
+    options.externalServices ||= {
+      createScripting: ({ sandboxBundleSrc }) => {
+        return new GenericScripting(sandboxBundleSrc);
+      },
+    };
+    options.docProperties ||= pdfDocument => {
+      return docProperties(pdfDocument);
+    };
+    super(options);
+  }
+}
+
+export { PDFScriptingManagerComponents as PDFScriptingManager };
diff --git a/web/pdf_scripting_manager.js b/web/pdf_scripting_manager.js
index d67e60319..459c7050d 100644
--- a/web/pdf_scripting_manager.js
+++ b/web/pdf_scripting_manager.js
@@ -66,30 +66,6 @@ class PDFScriptingManager {
     }
     this.#externalServices = externalServices;
     this.#docProperties = docProperties;
-
-    if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("COMPONENTS")) {
-      const gs = require("./generic_scripting.js");
-
-      this.#externalServices ||= {
-        createScripting: options => {
-          return new gs.GenericScripting(options.sandboxBundleSrc);
-        },
-      };
-      this.#docProperties ||= pdfDocument => {
-        return gs.docProperties(pdfDocument);
-      };
-
-      // The default viewer already handles adding/removing of DOM events,
-      // hence limit this to only the viewer components.
-      if (!externalServices) {
-        window.addEventListener("updatefromsandbox", event => {
-          this.#eventBus.dispatch("updatefromsandbox", {
-            source: window,
-            detail: event.detail,
-          });
-        });
-      }
-    }
   }
 
   setViewer(pdfViewer) {
diff --git a/web/pdf_viewer.component.js b/web/pdf_viewer.component.js
index 1c44a58cf..c10d4aeb6 100644
--- a/web/pdf_viewer.component.js
+++ b/web/pdf_viewer.component.js
@@ -33,7 +33,7 @@ import { GenericL10n } from "./genericl10n.js";
 import { NullL10n } from "./l10n_utils.js";
 import { PDFHistory } from "./pdf_history.js";
 import { PDFPageView } from "./pdf_page_view.js";
-import { PDFScriptingManager } from "./pdf_scripting_manager.js";
+import { PDFScriptingManager } from "./pdf_scripting_manager.component.js";
 import { PDFSinglePageViewer } from "./pdf_single_page_viewer.js";
 import { PDFViewer } from "./pdf_viewer.js";
 import { StructTreeLayerBuilder } from "./struct_tree_layer_builder.js";

From bad4bfffdf4bfc15c66039eb1b8731d86f154dfa Mon Sep 17 00:00:00 2001
From: Jonas Jenwald <jonas.jenwald@gmail.com>
Date: Sat, 15 Jul 2023 10:17:26 +0200
Subject: [PATCH 3/3] Remove the `require` from the `web/pdfjs.js`

Having a `require` in this file has never made sense in e.g. the Firefox PDF Viewer and shouldn't really be necessary.
Possibly the idea was to facilitate some kind of third-party bundling, however the *built* `pdf.js` file has always exposed the API-contents globally.
---
 web/pdfjs.js | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/web/pdfjs.js b/web/pdfjs.js
index 25f5435c3..f119f2ef4 100644
--- a/web/pdfjs.js
+++ b/web/pdfjs.js
@@ -12,14 +12,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/* globals module, __non_webpack_require__ */
+/* globals module */
 
 "use strict";
 
-let pdfjsLib;
-if (typeof window !== "undefined" && window["pdfjs-dist/build/pdf"]) {
-  pdfjsLib = window["pdfjs-dist/build/pdf"];
-} else {
-  pdfjsLib = __non_webpack_require__("../build/pdf.js");
-}
-module.exports = pdfjsLib;
+module.exports = globalThis.pdfjsLib;