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 e4568d98..214d2b8f 100644 --- a/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts +++ b/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts @@ -13,6 +13,8 @@ import IHTMLMediaElement from './IHTMLMediaElement'; export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaElement { #volume = 1; #paused = true; + #duration = NaN; + #currentTime = 0; /** * Returns autoplay. * @@ -158,6 +160,7 @@ export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaE DOMExceptionNameEnum.indexSizeError ); } + // TODO: volumechange event https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/volumechange_event this.#volume = parsedVolume; } @@ -177,7 +180,7 @@ export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaE */ public set crossOrigin(crossOrigin: string | null) { if (crossOrigin === null) { - return + return; } if (['', 'use-credentials', 'anonymous'].includes(crossOrigin)) { @@ -196,6 +199,33 @@ export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaE return this.#paused; } + /** + * Returns duration. + * + * @returns Duration. + */ + public get duration(): number { + return this.#duration; + } + + /** + * Returns currentTime. + * + * @returns CurrentTime. + */ + public get currentTime(): number { + return this.#currentTime; + } + + /** + * Sets currentTime. + * + * @param currentTime CurrentTime. + */ + public set currentTime(currentTime: number) { + this.#currentTime = currentTime; + } + /** * */ @@ -226,6 +256,10 @@ export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaE * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ + /** + * + * @param deep + */ public cloneNode(deep = false): IHTMLMediaElement { return super.cloneNode(deep); } diff --git a/packages/happy-dom/src/nodes/html-media-element/IHTMLMediaElement.ts b/packages/happy-dom/src/nodes/html-media-element/IHTMLMediaElement.ts index ee62b71d..2c92b52a 100644 --- a/packages/happy-dom/src/nodes/html-media-element/IHTMLMediaElement.ts +++ b/packages/happy-dom/src/nodes/html-media-element/IHTMLMediaElement.ts @@ -8,28 +8,26 @@ import IHTMLElement from '../html-element/IHTMLElement'; */ export default interface IHTMLMediaElement extends IHTMLElement { readonly currentSrc: string; + readonly duration: number; autoplay: boolean; controls: boolean; loop: boolean; muted: boolean; - paused: boolean; // TODO readonly? + paused: boolean; volume: number | string; src: string; crossOrigin: string; // Only anonymus and 'use-credentials' is valid + currentTime: number; // AddTextTrack; - // Buffered; // TODO + // Buffered; // TODO tameranges // CaptureStream; // TODO // ControlsList: string; // TODO - // CurrentSrc: string; // TODO - // CurrentTime; // TODO // DefaultMuted: boolean; // TODO // DefaultPlaybackRate; // TODO // DisableRemotePlayback: boolean; // TODO - // Duration: number; // TODO // Ended: boolean; // TODO readonly // Error; // TODO object - // MediaKeys; // TODO // NetworkState; // TODO // Played: // TODO timeranges // PlaybackRate: number; // TODO 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 e73665b9..e59f54db 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 @@ -145,4 +145,20 @@ describe('HTMLMediaElement', () => { expect(element.getAttribute('crossorigin')).toBe('anonymous'); }); }); + + describe('duration', () => { + it('Return 0 by default', () => { + expect(element.duration).toBe(NaN); + }); + }); + + describe('currentTime', () => { + it('Return default value', () => { + expect(element.currentTime).toBe(0); + }); + it('Set value', () => { + element.currentTime = 42; + expect(element.currentTime).toBe(42); + }); + }); });