diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index 937d0ea620efc..ebe3e89014506 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -67,6 +67,7 @@ print progress radio range +ratechange readystatechange reftest-wait rejectionhandled diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 7246ea90c5b44..4a32b28e55819 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -164,6 +164,10 @@ pub struct HTMLMediaElement { error: MutNullableDom, /// paused: Cell, + /// + defaultPlaybackRate: Cell, + /// + playbackRate: Cell, /// autoplaying: Cell, /// @@ -235,6 +239,8 @@ impl HTMLMediaElement { fired_loadeddata_event: Cell::new(false), error: Default::default(), paused: Cell::new(true), + defaultPlaybackRate: Cell::new(1.0), + playbackRate: Cell::new(1.0), // FIXME(nox): Why is this initialised to true? autoplaying: Cell::new(true), delaying_the_load_event_flag: Default::default(), @@ -960,7 +966,7 @@ impl HTMLMediaElement { } // Step 7. - // FIXME(nox): Set playbackRate to defaultPlaybackRate. + self.playbackRate.set(self.defaultPlaybackRate.get()); // Step 8. self.error.set(None); @@ -1350,6 +1356,38 @@ impl HTMLMediaElementMethods for HTMLMediaElement { self.paused.get() } + /// https://html.spec.whatwg.org/multipage/#dom-media-defaultplaybackrate + fn DefaultPlaybackRate(&self) -> Finite { + Finite::wrap(self.defaultPlaybackRate.get()) + } + + /// https://html.spec.whatwg.org/multipage/#dom-media-defaultplaybackrate + fn SetDefaultPlaybackRate(&self, value: Finite) { + if *value != self.defaultPlaybackRate.get() { + self.defaultPlaybackRate.set(*value); + + let window = window_from_node(self); + let task_source = window.task_manager().media_element_task_source(); + task_source.queue_simple_event(self.upcast(), atom!("ratechange"), &window); + } + } + + /// https://html.spec.whatwg.org/multipage/#dom-media-playbackrate + fn PlaybackRate(&self) -> Finite { + Finite::wrap(self.playbackRate.get()) + } + + /// https://html.spec.whatwg.org/multipage/#dom-media-playbackrate + fn SetPlaybackRate(&self, value: Finite) { + if *value != self.playbackRate.get() { + self.playbackRate.set(*value); + + let window = window_from_node(self); + let task_source = window.task_manager().media_element_task_source(); + task_source.queue_simple_event(self.upcast(), atom!("ratechange"), &window); + } + } + // https://html.spec.whatwg.org/multipage/#dom-media-duration fn Duration(&self) -> f64 { self.duration.get() diff --git a/components/script/dom/webidls/HTMLMediaElement.webidl b/components/script/dom/webidls/HTMLMediaElement.webidl index d93fe067d0993..ace11aab6fede 100644 --- a/components/script/dom/webidls/HTMLMediaElement.webidl +++ b/components/script/dom/webidls/HTMLMediaElement.webidl @@ -42,8 +42,8 @@ interface HTMLMediaElement : HTMLElement { readonly attribute unrestricted double duration; // Date getStartDate(); readonly attribute boolean paused; - // attribute double defaultPlaybackRate; - // attribute double playbackRate; + attribute double defaultPlaybackRate; + attribute double playbackRate; readonly attribute TimeRanges played; // readonly attribute TimeRanges seekable; // readonly attribute boolean ended; diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html.ini deleted file mode 100644 index 666997e01de78..0000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html.ini +++ /dev/null @@ -1,27 +0,0 @@ -[playbackRate.html] - type: testharness - expected: TIMEOUT - [playbackRate initial value] - expected: FAIL - - [setting playbackRate] - expected: TIMEOUT - - [playbackRate set to small positive value] - expected: TIMEOUT - - [playbackRate set to large positive value] - expected: TIMEOUT - - [playbackRate set to small negative value] - expected: TIMEOUT - - [playbackRate set to large negative value] - expected: TIMEOUT - - [playbackRate set to 0] - expected: TIMEOUT - - [playbackRate set to -1] - expected: TIMEOUT -