From 25a07d92d0b3127aa8b47cce776a4382341a1551 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Thu, 22 Jun 2023 15:02:54 +0200 Subject: [PATCH 1/2] [Firefox] Stub out the `isValidFetchUrl` function in MOZCENTRAL builds This helper function is completely unused in the Firefox PDF Viewer. --- src/display/display_utils.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/display/display_utils.js b/src/display/display_utils.js index 2ff4860f23755..fe51836ff9969 100644 --- a/src/display/display_utils.js +++ b/src/display/display_utils.js @@ -697,6 +697,9 @@ class StatTimer { } function isValidFetchUrl(url, baseUrl) { + if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { + throw new Error("Not implemented: isValidFetchUrl"); + } try { const { protocol } = baseUrl ? new URL(url, baseUrl) : new URL(url); // The Fetch API only supports the http/https protocols, and not file/ftp. From 0bbadce066b84fa9eed8ab32f47562f8fedd64d7 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Thu, 22 Jun 2023 15:16:25 +0200 Subject: [PATCH 2/2] Add a unit-test to check that the *official* PDF.js API exposes the expected functionality Until now we've not actually had *any* tests that ensure that the *official* PDF.js API exposes the intended functionality, which means that things can easily break accidentally. --- test/unit/clitests.json | 1 + test/unit/jasmine-boot.js | 3 +- test/unit/pdf_spec.js | 125 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 test/unit/pdf_spec.js diff --git a/test/unit/clitests.json b/test/unit/clitests.json index 8dd259caf02be..8aacd4a352b7a 100644 --- a/test/unit/clitests.json +++ b/test/unit/clitests.json @@ -35,6 +35,7 @@ "pdf_find_controller_spec.js", "pdf_find_utils_spec.js", "pdf_history_spec.js", + "pdf_spec.js", "pdf_viewer_spec.js", "primitives_spec.js", "stream_spec.js", diff --git a/test/unit/jasmine-boot.js b/test/unit/jasmine-boot.js index 42a2ba6ca0b56..5166390ab8c9b 100644 --- a/test/unit/jasmine-boot.js +++ b/test/unit/jasmine-boot.js @@ -65,9 +65,9 @@ async function initializePDFJS(callback) { "pdfjs-test/unit/encodings_spec.js", "pdfjs-test/unit/evaluator_spec.js", "pdfjs-test/unit/event_utils_spec.js", - "pdfjs-test/unit/function_spec.js", "pdfjs-test/unit/fetch_stream_spec.js", "pdfjs-test/unit/font_substitutions_spec.js", + "pdfjs-test/unit/function_spec.js", "pdfjs-test/unit/message_handler_spec.js", "pdfjs-test/unit/metadata_spec.js", "pdfjs-test/unit/murmurhash3_spec.js", @@ -77,6 +77,7 @@ async function initializePDFJS(callback) { "pdfjs-test/unit/pdf_find_controller_spec.js", "pdfjs-test/unit/pdf_find_utils_spec.js", "pdfjs-test/unit/pdf_history_spec.js", + "pdfjs-test/unit/pdf_spec.js", "pdfjs-test/unit/pdf_viewer_spec.js", "pdfjs-test/unit/primitives_spec.js", "pdfjs-test/unit/scripting_spec.js", diff --git a/test/unit/pdf_spec.js b/test/unit/pdf_spec.js new file mode 100644 index 0000000000000..cc4e8e0deb8cf --- /dev/null +++ b/test/unit/pdf_spec.js @@ -0,0 +1,125 @@ +/* Copyright 2023 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 { + AbortException, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationMode, + CMapCompressionType, + createValidAbsoluteUrl, + FeatureTest, + ImageKind, + InvalidPDFException, + MissingPDFException, + normalizeUnicode, + OPS, + PasswordResponses, + PermissionFlag, + PromiseCapability, + shadow, + UnexpectedResponseException, + Util, + VerbosityLevel, +} from "../../src/shared/util.js"; +import { + build, + getDocument, + PDFDataRangeTransport, + PDFWorker, + version, +} from "../../src/display/api.js"; +import { + getFilenameFromUrl, + getPdfFilenameFromUrl, + getXfaPageViewport, + isDataScheme, + isPdfFile, + loadScript, + PDFDateString, + PixelsPerInch, + RenderingCancelledException, + setLayerDimensions, +} from "../../src/display/display_utils.js"; +import { + renderTextLayer, + updateTextLayer, +} from "../../src/display/text_layer.js"; +import { AnnotationEditorLayer } from "../../src/display/editor/annotation_editor_layer.js"; +import { AnnotationEditorUIManager } from "../../src/display/editor/tools.js"; +import { AnnotationLayer } from "../../src/display/annotation_layer.js"; +import { GlobalWorkerOptions } from "../../src/display/worker_options.js"; +import { XfaLayer } from "../../src/display/xfa_layer.js"; + +describe("pdfjs_api", function () { + it("checks that the *official* PDF.js API exposes the expected functionality", async function () { + // eslint-disable-next-line no-unsanitized/method + const pdfjsAPI = await import( + typeof PDFJSDev !== "undefined" && PDFJSDev.test("LIB") + ? "../../pdf.js" + : "../../src/pdf.js" + ); + + // The imported Object contains an (automatically) inserted Symbol, + // hence we copy the data to allow using a simple comparison below. + expect({ ...pdfjsAPI }).toEqual({ + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + build, + CMapCompressionType, + createValidAbsoluteUrl, + FeatureTest, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl, + getXfaPageViewport, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + loadScript, + MissingPDFException, + normalizeUnicode, + OPS, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + PromiseCapability, + RenderingCancelledException, + renderTextLayer, + setLayerDimensions, + shadow, + SVGGraphics: + typeof PDFJSDev !== "undefined" && PDFJSDev.test("LIB") + ? require("../../display/svg.js").SVGGraphics + : null, + UnexpectedResponseException, + updateTextLayer, + Util, + VerbosityLevel, + version, + XfaLayer, + }); + }); +});