Re-factor DefaultExternalServices into a regular class, without static methods

The `DefaultExternalServices` code, which is used to provide build-specific functionality, is very old. This results in a pattern where we first initialize `PDFViewerApplication.externalServices` and then *override* it for the different builds.

By converting `DefaultExternalServices` into a "regular" class, and leveraging import maps, we can directly initialize the correct instance depending on the build.
This commit is contained in:
Jonas Jenwald 2024-01-26 14:31:42 +01:00
parent d1080e785a
commit 5dd25b6e80
9 changed files with 80 additions and 61 deletions

View File

@ -271,6 +271,7 @@ function createWebpackConfig(
"web-annotation_editor_params": "web/annotation_editor_params.js", "web-annotation_editor_params": "web/annotation_editor_params.js",
"web-com": "", "web-com": "",
"web-download_manager": "", "web-download_manager": "",
"web-external_services": "",
"web-l10n_utils": "web/stubs.js", "web-l10n_utils": "web/stubs.js",
"web-pdf_attachment_viewer": "web/pdf_attachment_viewer.js", "web-pdf_attachment_viewer": "web/pdf_attachment_viewer.js",
"web-pdf_cursor_tools": "web/pdf_cursor_tools.js", "web-pdf_cursor_tools": "web/pdf_cursor_tools.js",
@ -292,6 +293,7 @@ function createWebpackConfig(
viewerAlias["web-com"] = "web/chromecom.js"; viewerAlias["web-com"] = "web/chromecom.js";
viewerAlias["web-download_manager"] = "web/download_manager.js"; viewerAlias["web-download_manager"] = "web/download_manager.js";
viewerAlias["web-external_services"] = "web/chromecom.js";
viewerAlias["web-preferences"] = "web/chromecom.js"; viewerAlias["web-preferences"] = "web/chromecom.js";
viewerAlias["web-print_service"] = "web/pdf_print_service.js"; viewerAlias["web-print_service"] = "web/pdf_print_service.js";
} else if (bundleDefines.GENERIC) { } else if (bundleDefines.GENERIC) {
@ -305,6 +307,7 @@ function createWebpackConfig(
viewerAlias["web-com"] = "web/genericcom.js"; viewerAlias["web-com"] = "web/genericcom.js";
viewerAlias["web-download_manager"] = "web/download_manager.js"; viewerAlias["web-download_manager"] = "web/download_manager.js";
viewerAlias["web-external_services"] = "web/genericcom.js";
viewerAlias["web-l10n_utils"] = "web/l10n_utils.js"; viewerAlias["web-l10n_utils"] = "web/l10n_utils.js";
viewerAlias["web-preferences"] = "web/genericcom.js"; viewerAlias["web-preferences"] = "web/genericcom.js";
viewerAlias["web-print_service"] = "web/pdf_print_service.js"; viewerAlias["web-print_service"] = "web/pdf_print_service.js";
@ -320,6 +323,7 @@ function createWebpackConfig(
} }
viewerAlias["web-com"] = "web/firefoxcom.js"; viewerAlias["web-com"] = "web/firefoxcom.js";
viewerAlias["web-download_manager"] = "web/firefoxcom.js"; viewerAlias["web-download_manager"] = "web/firefoxcom.js";
viewerAlias["web-external_services"] = "web/firefoxcom.js";
viewerAlias["web-preferences"] = "web/firefoxcom.js"; viewerAlias["web-preferences"] = "web/firefoxcom.js";
viewerAlias["web-print_service"] = "web/firefox_print_service.js"; viewerAlias["web-print_service"] = "web/firefox_print_service.js";
} }

View File

@ -29,6 +29,7 @@
"web-annotation_editor_params": "../../web/annotation_editor_params.js", "web-annotation_editor_params": "../../web/annotation_editor_params.js",
"web-com": "../../web/genericcom.js", "web-com": "../../web/genericcom.js",
"web-download_manager": "../../web/download_manager.js", "web-download_manager": "../../web/download_manager.js",
"web-external_services": "../../web/genericcom.js",
"web-l10n_utils": "../../web/l10n_utils.js", "web-l10n_utils": "../../web/l10n_utils.js",
"web-pdf_attachment_viewer": "../../web/pdf_attachment_viewer.js", "web-pdf_attachment_viewer": "../../web/pdf_attachment_viewer.js",
"web-pdf_cursor_tools": "../../web/pdf_cursor_tools.js", "web-pdf_cursor_tools": "../../web/pdf_cursor_tools.js",

View File

@ -57,6 +57,7 @@ import { LinkTarget, PDFLinkService } from "./pdf_link_service.js";
import { AltTextManager } from "web-alt_text_manager"; import { AltTextManager } from "web-alt_text_manager";
import { AnnotationEditorParams } from "web-annotation_editor_params"; import { AnnotationEditorParams } from "web-annotation_editor_params";
import { DownloadManager } from "web-download_manager"; import { DownloadManager } from "web-download_manager";
import { ExternalServices } from "web-external_services";
import { OverlayManager } from "./overlay_manager.js"; import { OverlayManager } from "./overlay_manager.js";
import { PasswordPrompt } from "./password_prompt.js"; import { PasswordPrompt } from "./password_prompt.js";
import { PDFAttachmentViewer } from "web-pdf_attachment_viewer"; import { PDFAttachmentViewer } from "web-pdf_attachment_viewer";
@ -87,36 +88,6 @@ const ViewOnLoad = {
INITIAL: 1, INITIAL: 1,
}; };
class DefaultExternalServices {
constructor() {
throw new Error("Cannot initialize DefaultExternalServices.");
}
static updateFindControlState(data) {}
static updateFindMatchesCount(data) {}
static initPassiveLoading(callbacks) {}
static reportTelemetry(data) {}
static async createL10n() {
throw new Error("Not implemented: createL10n");
}
static createScripting() {
throw new Error("Not implemented: createScripting");
}
static updateEditorStates(data) {
throw new Error("Not implemented: updateEditorStates");
}
static getNimbusExperimentData() {
return shadow(this, "getNimbusExperimentData", Promise.resolve(null));
}
}
const PDFViewerApplication = { const PDFViewerApplication = {
initialBookmark: document.location.hash.substring(1), initialBookmark: document.location.hash.substring(1),
_initializedCapability: new PromiseCapability(), _initializedCapability: new PromiseCapability(),
@ -174,7 +145,7 @@ const PDFViewerApplication = {
url: "", url: "",
baseUrl: "", baseUrl: "",
_downloadUrl: "", _downloadUrl: "",
externalServices: DefaultExternalServices, externalServices: new ExternalServices(),
_boundEvents: Object.create(null), _boundEvents: Object.create(null),
documentInfo: null, documentInfo: null,
metadata: null, metadata: null,
@ -3217,8 +3188,4 @@ const PDFPrintServiceFactory = {
}, },
}; };
export { export { PDFPrintServiceFactory, PDFViewerApplication };
DefaultExternalServices,
PDFPrintServiceFactory,
PDFViewerApplication,
};

View File

@ -14,11 +14,12 @@
*/ */
/* globals chrome */ /* globals chrome */
import { DefaultExternalServices, PDFViewerApplication } from "./app.js";
import { AppOptions } from "./app_options.js"; import { AppOptions } from "./app_options.js";
import { BaseExternalServices } from "./external_services.js";
import { BasePreferences } from "./preferences.js"; import { BasePreferences } from "./preferences.js";
import { GenericL10n } from "./genericl10n.js"; import { GenericL10n } from "./genericl10n.js";
import { GenericScripting } from "./generic_scripting.js"; import { GenericScripting } from "./generic_scripting.js";
import { PDFViewerApplication } from "./app.js";
if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("CHROME")) { if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("CHROME")) {
throw new Error( throw new Error(
@ -414,8 +415,8 @@ class Preferences extends BasePreferences {
} }
} }
class ChromeExternalServices extends DefaultExternalServices { class ExternalServices extends BaseExternalServices {
static initPassiveLoading(callbacks) { initPassiveLoading(callbacks) {
// defaultUrl is set in viewer.js // defaultUrl is set in viewer.js
ChromeCom.resolvePDFFile( ChromeCom.resolvePDFFile(
AppOptions.get("defaultUrl"), AppOptions.get("defaultUrl"),
@ -426,14 +427,13 @@ class ChromeExternalServices extends DefaultExternalServices {
); );
} }
static async createL10n() { async createL10n() {
return new GenericL10n(navigator.language); return new GenericL10n(navigator.language);
} }
static createScripting() { createScripting() {
return new GenericScripting(AppOptions.get("sandboxBundleSrc")); return new GenericScripting(AppOptions.get("sandboxBundleSrc"));
} }
} }
PDFViewerApplication.externalServices = ChromeExternalServices;
export { ChromeCom, Preferences }; export { ChromeCom, ExternalServices, Preferences };

46
web/external_services.js Normal file
View File

@ -0,0 +1,46 @@
/* Copyright 2024 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.
*/
class BaseExternalServices {
constructor() {
if (this.constructor === BaseExternalServices) {
throw new Error("Cannot initialize BaseExternalServices.");
}
}
updateFindControlState(data) {}
updateFindMatchesCount(data) {}
initPassiveLoading(callbacks) {}
reportTelemetry(data) {}
async createL10n() {
throw new Error("Not implemented: createL10n");
}
createScripting() {
throw new Error("Not implemented: createScripting");
}
updateEditorStates(data) {
throw new Error("Not implemented: updateEditorStates");
}
async getNimbusExperimentData() {}
}
export { BaseExternalServices };

View File

@ -13,11 +13,12 @@
* limitations under the License. * limitations under the License.
*/ */
import { DefaultExternalServices, PDFViewerApplication } from "./app.js";
import { isPdfFile, PDFDataRangeTransport } from "pdfjs-lib"; import { isPdfFile, PDFDataRangeTransport } from "pdfjs-lib";
import { BaseExternalServices } from "./external_services.js";
import { BasePreferences } from "./preferences.js"; import { BasePreferences } from "./preferences.js";
import { DEFAULT_SCALE_VALUE } from "./ui_utils.js"; import { DEFAULT_SCALE_VALUE } from "./ui_utils.js";
import { L10n } from "./l10n.js"; import { L10n } from "./l10n.js";
import { PDFViewerApplication } from "./app.js";
if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("MOZCENTRAL")) { if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("MOZCENTRAL")) {
throw new Error( throw new Error(
@ -309,16 +310,16 @@ class FirefoxScripting {
} }
} }
class FirefoxExternalServices extends DefaultExternalServices { class ExternalServices extends BaseExternalServices {
static updateFindControlState(data) { updateFindControlState(data) {
FirefoxCom.request("updateFindControlState", data); FirefoxCom.request("updateFindControlState", data);
} }
static updateFindMatchesCount(data) { updateFindMatchesCount(data) {
FirefoxCom.request("updateFindMatchesCount", data); FirefoxCom.request("updateFindMatchesCount", data);
} }
static initPassiveLoading(callbacks) { initPassiveLoading(callbacks) {
let pdfDataRangeTransport; let pdfDataRangeTransport;
window.addEventListener("message", function windowMessage(e) { window.addEventListener("message", function windowMessage(e) {
@ -378,15 +379,15 @@ class FirefoxExternalServices extends DefaultExternalServices {
FirefoxCom.request("initPassiveLoading", null); FirefoxCom.request("initPassiveLoading", null);
} }
static reportTelemetry(data) { reportTelemetry(data) {
FirefoxCom.request("reportTelemetry", JSON.stringify(data)); FirefoxCom.request("reportTelemetry", JSON.stringify(data));
} }
static updateEditorStates(data) { updateEditorStates(data) {
FirefoxCom.request("updateEditorStates", data); FirefoxCom.request("updateEditorStates", data);
} }
static async createL10n() { async createL10n() {
const [localeProperties] = await Promise.all([ const [localeProperties] = await Promise.all([
FirefoxCom.requestAsync("getLocaleProperties", null), FirefoxCom.requestAsync("getLocaleProperties", null),
document.l10n.ready, document.l10n.ready,
@ -394,11 +395,11 @@ class FirefoxExternalServices extends DefaultExternalServices {
return new L10n(localeProperties, document.l10n); return new L10n(localeProperties, document.l10n);
} }
static createScripting() { createScripting() {
return FirefoxScripting; return FirefoxScripting;
} }
static async getNimbusExperimentData() { async getNimbusExperimentData() {
const nimbusData = await FirefoxCom.requestAsync( const nimbusData = await FirefoxCom.requestAsync(
"getNimbusExperimentData", "getNimbusExperimentData",
null null
@ -406,6 +407,5 @@ class FirefoxExternalServices extends DefaultExternalServices {
return nimbusData && JSON.parse(nimbusData); return nimbusData && JSON.parse(nimbusData);
} }
} }
PDFViewerApplication.externalServices = FirefoxExternalServices;
export { DownloadManager, FirefoxCom, Preferences }; export { DownloadManager, ExternalServices, FirefoxCom, Preferences };

View File

@ -13,8 +13,8 @@
* limitations under the License. * limitations under the License.
*/ */
import { DefaultExternalServices, PDFViewerApplication } from "./app.js";
import { AppOptions } from "./app_options.js"; import { AppOptions } from "./app_options.js";
import { BaseExternalServices } from "./external_services.js";
import { BasePreferences } from "./preferences.js"; import { BasePreferences } from "./preferences.js";
import { GenericL10n } from "./genericl10n.js"; import { GenericL10n } from "./genericl10n.js";
import { GenericScripting } from "./generic_scripting.js"; import { GenericScripting } from "./generic_scripting.js";
@ -37,15 +37,14 @@ class Preferences extends BasePreferences {
} }
} }
class GenericExternalServices extends DefaultExternalServices { class ExternalServices extends BaseExternalServices {
static async createL10n() { async createL10n() {
return new GenericL10n(AppOptions.get("locale")); return new GenericL10n(AppOptions.get("locale"));
} }
static createScripting() { createScripting() {
return new GenericScripting(AppOptions.get("sandboxBundleSrc")); return new GenericScripting(AppOptions.get("sandboxBundleSrc"));
} }
} }
PDFViewerApplication.externalServices = GenericExternalServices;
export { GenericCom, Preferences }; export { ExternalServices, GenericCom, Preferences };

View File

@ -62,6 +62,7 @@ See https://github.com/adobe-type-tools/cmap-resources
"web-annotation_editor_params": "./stubs-geckoview.js", "web-annotation_editor_params": "./stubs-geckoview.js",
"web-com": "./genericcom.js", "web-com": "./genericcom.js",
"web-download_manager": "./download_manager.js", "web-download_manager": "./download_manager.js",
"web-external_services": "./genericcom.js",
"web-l10n_utils": "./l10n_utils.js", "web-l10n_utils": "./l10n_utils.js",
"web-pdf_attachment_viewer": "./stubs-geckoview.js", "web-pdf_attachment_viewer": "./stubs-geckoview.js",
"web-pdf_cursor_tools": "./stubs-geckoview.js", "web-pdf_cursor_tools": "./stubs-geckoview.js",

View File

@ -71,6 +71,7 @@ See https://github.com/adobe-type-tools/cmap-resources
"web-annotation_editor_params": "./annotation_editor_params.js", "web-annotation_editor_params": "./annotation_editor_params.js",
"web-com": "./genericcom.js", "web-com": "./genericcom.js",
"web-download_manager": "./download_manager.js", "web-download_manager": "./download_manager.js",
"web-external_services": "./genericcom.js",
"web-l10n_utils": "./l10n_utils.js", "web-l10n_utils": "./l10n_utils.js",
"web-pdf_attachment_viewer": "./pdf_attachment_viewer.js", "web-pdf_attachment_viewer": "./pdf_attachment_viewer.js",
"web-pdf_cursor_tools": "./pdf_cursor_tools.js", "web-pdf_cursor_tools": "./pdf_cursor_tools.js",