From 58d6e2d335ecda180dcb6fca92ccf509fc8b707d Mon Sep 17 00:00:00 2001 From: Erik Wesemann Date: Sun, 6 Oct 2024 16:02:23 -0500 Subject: [PATCH 1/2] fix: [#1557] TypeError: Cannot set property srcObject had only a getter --- .../src/nodes/html-media-element/HTMLMediaElement.ts | 9 +++++++++ .../nodes/html-media-element/HTMLMediaElement.test.ts | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts b/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts index 5d579d350..8a30e2dca 100644 --- a/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts +++ b/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts @@ -399,6 +399,15 @@ export default class HTMLMediaElement extends HTMLElement { return this[PropertySymbol.srcObject]; } + /** + * Sets src object. + * + * @param srcObject SrcObject. + */ + public set srcObject(srcObject: MediaStream | null) { + this[PropertySymbol.srcObject] = srcObject; + } + /** * Returns text track list. * diff --git a/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts b/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts index 70d97bd75..8f8d11aa5 100644 --- a/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts +++ b/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts @@ -293,6 +293,14 @@ describe('HTMLMediaElement', () => { }); }); + describe('set srcObject()', () => { + it('Sets the srcObject property', async () => { + const srcObject = {}; + element.srcObject = srcObject; + expect(element.srcObject).toBe(srcObject); + }); + }); + describe('get textTracks()', () => { it('Returns an empty TextTrackList object by default.', () => { expect(element.textTracks.length).toBe(0); From d5db47ba46b29a7d14d95929ba9e0c67d47820e8 Mon Sep 17 00:00:00 2001 From: David Ortner Date: Wed, 6 Nov 2024 22:09:21 +0100 Subject: [PATCH 2/2] chore: [#1557] Adds validation for if object is of type MediaStream --- .../html-media-element/HTMLMediaElement.ts | 5 +++++ .../HTMLMediaElement.test.ts | 20 +++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts b/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts index 8a30e2dca..5fb4c7e33 100644 --- a/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts +++ b/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts @@ -405,6 +405,11 @@ export default class HTMLMediaElement extends HTMLElement { * @param srcObject SrcObject. */ public set srcObject(srcObject: MediaStream | null) { + if (srcObject !== null && !(srcObject instanceof MediaStream)) { + throw new this[PropertySymbol.window].TypeError( + `Failed to set the 'srcObject' property on 'HTMLMediaElement': The provided value is not of type 'MediaStream'.` + ); + } this[PropertySymbol.srcObject] = srcObject; } diff --git a/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts b/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts index 8f8d11aa5..bb556db54 100644 --- a/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts +++ b/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts @@ -294,11 +294,27 @@ describe('HTMLMediaElement', () => { }); describe('set srcObject()', () => { - it('Sets the srcObject property', async () => { - const srcObject = {}; + it('Sets a MediaStream object', () => { + const srcObject = new window.MediaStream(); element.srcObject = srcObject; expect(element.srcObject).toBe(srcObject); }); + + it('Allows to be set to null', () => { + element.srcObject = new window.MediaStream(); + element.srcObject = null; + expect(element.srcObject).toBeNull(); + }); + + it('Throws an error if the value is not a MediaStream object', () => { + expect(() => { + element.srcObject = {}; + }).toThrowError( + new TypeError( + `Failed to set the 'srcObject' property on 'HTMLMediaElement': The provided value is not of type 'MediaStream'.` + ) + ); + }); }); describe('get textTracks()', () => {