From cd2fc715dc3586b80af1b8efa6664c31cce7e02d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Tyczy=C5=84ski?= Date: Thu, 29 Aug 2024 15:23:20 +0200 Subject: [PATCH] fix(DASH): Use proper namespace when mapping TXml node to Element (#7240) --- lib/util/tXml.js | 36 +++++++++++++++++++++++++++++------- test/util/tXml_unit.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/lib/util/tXml.js b/lib/util/tXml.js index d360e08bd7..c3feb4212c 100644 --- a/lib/util/tXml.js +++ b/lib/util/tXml.js @@ -73,24 +73,37 @@ shaka.util.TXml = class { } /** - * Parse some data + * Get namespace based on schema * @param {string} schema * @return {string} */ static getKnownNameSpace(schema) { - if (shaka.util.TXml.knownNameSpaces_.has(schema)) { - return shaka.util.TXml.knownNameSpaces_.get(schema); + if (shaka.util.TXml.uriToNameSpace_.has(schema)) { + return shaka.util.TXml.uriToNameSpace_.get(schema); } return ''; } /** - * Parse some data + * Get schema based on namespace + * @param {string} NS + * @return {string} + */ + static getKnownSchema(NS) { + if (shaka.util.TXml.nameSpaceToUri_.has(NS)) { + return shaka.util.TXml.nameSpaceToUri_.get(NS); + } + return ''; + } + + /** + * Sets NS <-> schema bidirectional mapping * @param {string} schema * @param {string} NS */ static setKnownNameSpace(schema, NS) { - shaka.util.TXml.knownNameSpaces_.set(schema, NS); + shaka.util.TXml.uriToNameSpace_.set(schema, NS); + shaka.util.TXml.nameSpaceToUri_.set(NS, schema); } /** @@ -875,7 +888,12 @@ shaka.util.TXml = class { */ static txmlNodeToDomElement(node) { const TXml = shaka.util.TXml; - const element = document.createElementNS('', node.tagName); + let namespace = ''; + const parts = node.tagName.split(':'); + if (parts.length > 0) { + namespace = TXml.getKnownSchema(parts[0]); + } + const element = document.createElementNS(namespace, node.tagName); for (const k in node.attributes) { const v = node.attributes[k]; @@ -924,7 +942,11 @@ shaka.util.TXml = class { } }; -shaka.util.TXml.knownNameSpaces_ = new Map([]); +/** @private {!Map} */ +shaka.util.TXml.uriToNameSpace_ = new Map(); + +/** @private {!Map} */ +shaka.util.TXml.nameSpaceToUri_ = new Map(); /** diff --git a/test/util/tXml_unit.js b/test/util/tXml_unit.js index 51da37de24..c40a85d59f 100644 --- a/test/util/tXml_unit.js +++ b/test/util/tXml_unit.js @@ -10,6 +10,10 @@ describe('tXml', () => { const TXml = shaka.util.TXml; + beforeAll(() => { + TXml.setKnownNameSpace('urn:scte:scte35:2014:xml+bin', 'scte35'); + }); + describe('findChild', () => { it('finds a child node', () => { const xmlString = [ @@ -516,6 +520,31 @@ describe('tXml', () => { ]); }); + it('txmlNodeToDomElement', () => { + const node = { + tagName: 'Event', + parent: null, + attributes: { + 'presentationTime': '0', + }, + children: [ + { + tagName: 'scte35:Signal', + parent: null, + attributes: {}, + children: [], + }, + ], + }; + node.children[0].parent = node; + + const element = TXml.txmlNodeToDomElement(node); + expect(element.tagName).toBe('Event'); + expect(element.getAttribute('presentationTime')).toBe('0'); + const signal = element.firstElementChild; + expect(signal.tagName).toBe('scte35:Signal'); + }); + it('cloneNode', () => { expect(TXml.cloneNode(null)).toBe(null); const root = {