From ef15dbdb158c13dba196448180ff79fe09a697f5 Mon Sep 17 00:00:00 2001 From: Devin Heitmueller Date: Thu, 29 Oct 2026 08:41:03 -0400 Subject: [PATCH 1/3] Fix previous ISD state nullability --- src/main/js/html.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/js/html.js b/src/main/js/html.js index 752ea2e7..fca0f249 100755 --- a/src/main/js/html.js +++ b/src/main/js/html.js @@ -71,7 +71,7 @@ const browserIsFirefox = /firefox/i.test(navigator.userAgent); * @param {?boolean} displayForcedOnlyMode Value of the IMSC1 displayForcedOnlyMode parameter, * or false if null * @param {?ErrorHandler} errorHandler Error callback - * @param {ISD} previousISDState State saved during processing of the previous ISD, or null if initial call + * @param {?ISD} previousISDState State saved during processing of the previous ISD, or null if initial call * @param {?boolean} enableRollUp Enables roll-up animations (see CEA 708) * @return {ISD} ISD state to be provided when this function is called for the next ISD */ From 474e2c17ea5dd098d4d51c73334d28049948ac21 Mon Sep 17 00:00:00 2001 From: Devin Heitmueller Date: Thu, 29 Oct 2026 08:41:08 -0400 Subject: [PATCH 2/3] Align error handler declarations with runtime behavior --- src/main/js/error.js | 7 ++++--- src/main/js/main.js | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/js/error.js b/src/main/js/error.js index fc6b8e3d..40819080 100644 --- a/src/main/js/error.js +++ b/src/main/js/error.js @@ -54,7 +54,8 @@ export function reportFatal(errorHandler, msg) { * and returns a single
boolean
, which terminates processing if
true
. * * @typedef {Object} ErrorHandler - * @property {(msg: string) => boolean} warn - * @property {(msg: string) => boolean} error - * @property {(msg: string) => boolean} fatal + * @property {((msg: string) => boolean)} [info] + * @property {((msg: string) => boolean)} [warn] + * @property {((msg: string) => boolean)} [error] + * @property {((msg: string) => boolean)} [fatal] */ diff --git a/src/main/js/main.js b/src/main/js/main.js index e7b2ea75..8a756867 100644 --- a/src/main/js/main.js +++ b/src/main/js/main.js @@ -44,8 +44,8 @@ export { createSAXParserFromDOMParser }; * * @param {string} xmlstring XML document * @param {ErrorHandler} errorHandler Error callback - * @param {?MetadataHandler} metadataHandler Callback for elements - * @param {?Parser} parser XML parser + * @param {?MetadataHandler} [metadataHandler] Callback for elements + * @param {?Parser} [parser] XML parser * @returns {?TTElement} Opaque in-memory representation of an IMSC1 document */ export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createSAXParserFromDOMParser()) { From dd488a2cd9663ce98ec14c06eebb6eb6c65b742b Mon Sep 17 00:00:00 2001 From: Devin Heitmueller Date: Thu, 29 Oct 2026 11:53:36 -0400 Subject: [PATCH 3/3] Use default parser for null parser argument --- src/main/js/main.js | 6 ++++- src/test/js/DefaultParserTest.js | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/test/js/DefaultParserTest.js diff --git a/src/main/js/main.js b/src/main/js/main.js index 8a756867..4babab8e 100644 --- a/src/main/js/main.js +++ b/src/main/js/main.js @@ -48,6 +48,10 @@ export { createSAXParserFromDOMParser }; * @param {?Parser} [parser] XML parser * @returns {?TTElement} Opaque in-memory representation of an IMSC1 document */ -export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createSAXParserFromDOMParser()) { +export function fromXML(xmlstring, errorHandler, metadataHandler, parser) { + if (parser === null || parser === undefined) { + parser = createSAXParserFromDOMParser(); + } + return fromParser(xmlstring, errorHandler, metadataHandler, parser); } diff --git a/src/test/js/DefaultParserTest.js b/src/test/js/DefaultParserTest.js new file mode 100644 index 00000000..21584e1b --- /dev/null +++ b/src/test/js/DefaultParserTest.js @@ -0,0 +1,43 @@ +import { equal, throws } from "node:assert"; +import { test } from "node:test"; + +const originalWindow = globalThis.window; +const originalDocument = globalThis.document; + +globalThis.window = { getComputedStyle: () => ({}) }; +globalThis.document = { documentElement: {} }; + +const { fromXML } = await import("../../main/js/main.js"); + +globalThis.window = originalWindow; +globalThis.document = originalDocument; + +const XML = ''; +const TEST_ERROR = new Error("default parser used"); + +function assertUsesDefaultParser(parse) { + const originalDOMParser = globalThis.DOMParser; + let parseCount = 0; + + globalThis.DOMParser = class { + parseFromString() { + parseCount++; + throw TEST_ERROR; + } + }; + + try { + throws(parse, TEST_ERROR); + equal(parseCount, 1); + } finally { + globalThis.DOMParser = originalDOMParser; + } +} + +test("fromXML uses the default parser when parser is omitted", () => { + assertUsesDefaultParser(() => fromXML(XML, {})); +}); + +test("fromXML uses the default parser when parser is null", () => { + assertUsesDefaultParser(() => fromXML(XML, {}, null, null)); +});