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);
+ });
+ });
});