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/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
*/
diff --git a/src/main/js/main.js b/src/main/js/main.js
index e7b2ea75..4babab8e 100644
--- a/src/main/js/main.js
+++ b/src/main/js/main.js
@@ -44,10 +44,14 @@ 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()) {
+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));
+});