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] 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";