Implement HTMLMediaElement muted and defaultMuted attributes

This commit is contained in:
Steve Sweetney 2019-02-01 14:24:30 -05:00
parent 4a6b911908
commit 02d3328d3c
5 changed files with 44 additions and 109 deletions

View file

@ -199,6 +199,8 @@ pub struct HTMLMediaElement {
volume: Cell<f64>,
/// https://html.spec.whatwg.org/multipage/#dom-media-seeking
seeking: Cell<bool>,
/// https://html.spec.whatwg.org/multipage/#dom-media-muted
muted: Cell<bool>,
/// URL of the media resource, if any.
resource_url: DomRefCell<Option<ServoUrl>>,
/// https://html.spec.whatwg.org/multipage/#dom-media-played
@ -248,6 +250,7 @@ impl HTMLMediaElement {
paused: Cell::new(true),
defaultPlaybackRate: Cell::new(1.0),
playbackRate: Cell::new(1.0),
muted: Cell::new(false),
// FIXME(nox): Why is this initialised to true?
autoplaying: Cell::new(true),
delaying_the_load_event_flag: Default::default(),
@ -370,6 +373,10 @@ impl HTMLMediaElement {
// playback position.
}
}
// https://html.spec.whatwg.org/multipage/#allowed-to-play
fn is_allowed_to_play(&self) -> bool {
true
}
// https://html.spec.whatwg.org/multipage/#notify-about-playing
fn notify_about_playing(&self) {
@ -1398,12 +1405,39 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
// https://html.spec.whatwg.org/multipage/#dom-media-autoplay
make_bool_setter!(SetAutoplay, "autoplay");
// https://html.spec.whatwg.org/multipage/#dom-media-defaultmuted
make_bool_getter!(DefaultMuted, "muted");
// https://html.spec.whatwg.org/multipage/#dom-media-defaultmuted
make_bool_setter!(SetDefaultMuted, "muted");
// https://html.spec.whatwg.org/multipage/#dom-media-src
make_url_getter!(Src, "src");
// https://html.spec.whatwg.org/multipage/#dom-media-src
make_url_setter!(SetSrc, "src");
// https://html.spec.whatwg.org/multipage/#dom-media-muted
fn Muted(&self) -> bool {
self.muted.get()
}
// https://html.spec.whatwg.org/multipage/#dom-media-muted
fn SetMuted(&self, value: bool) {
if self.muted.get() == value {
return;
}
self.muted.set(value);
let _ = self.player.set_mute(value);
let window = window_from_node(self);
window
.task_manager()
.media_element_task_source()
.queue_simple_event(self.upcast(), atom!("volumechange"), &window);
if !self.is_allowed_to_play() {
self.internal_pause_steps();
}
}
// https://html.spec.whatwg.org/multipage/#dom-media-srcobject
fn GetSrcObject(&self) -> Option<DomRoot<Blob>> {
self.src_object.get()
@ -1720,6 +1754,9 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
.task_manager()
.media_element_task_source()
.queue_simple_event(self.upcast(), atom!("volumechange"), &window);
if !self.is_allowed_to_play() {
self.internal_pause_steps();
}
}
Ok(())
@ -1734,6 +1771,11 @@ impl VirtualMethods for HTMLMediaElement {
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
self.super_type().unwrap().attribute_mutated(attr, mutation);
if &local_name!("muted") == attr.local_name() {
self.SetMuted(mutation.new_value(attr).is_some());
return;
}
if mutation.new_value(attr).is_none() {
return;
}

View file

@ -55,8 +55,8 @@ interface HTMLMediaElement : HTMLElement {
// controls
// [CEReactions] attribute boolean controls;
[Throws] attribute double volume;
// attribute boolean muted;
// [CEReactions] attribute boolean defaultMuted;
attribute boolean muted;
[CEReactions] attribute boolean defaultMuted;
// tracks
// readonly attribute AudioTrackList audioTracks;

View file

@ -6789,12 +6789,6 @@
[HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type]
expected: FAIL
[HTMLMediaElement interface: document.createElement("video") must inherit property "muted" with the proper type]
expected: FAIL
[HTMLMediaElement interface: document.createElement("video") must inherit property "defaultMuted" with the proper type]
expected: FAIL
[HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type]
expected: FAIL
@ -6819,12 +6813,6 @@
[HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type]
expected: FAIL
[HTMLMediaElement interface: document.createElement("audio") must inherit property "muted" with the proper type]
expected: FAIL
[HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultMuted" with the proper type]
expected: FAIL
[HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type]
expected: FAIL
@ -6849,12 +6837,6 @@
[HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type]
expected: FAIL
[HTMLMediaElement interface: new Audio() must inherit property "muted" with the proper type]
expected: FAIL
[HTMLMediaElement interface: new Audio() must inherit property "defaultMuted" with the proper type]
expected: FAIL
[HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type]
expected: FAIL
@ -6879,12 +6861,6 @@
[HTMLMediaElement interface: attribute controls]
expected: FAIL
[HTMLMediaElement interface: attribute muted]
expected: FAIL
[HTMLMediaElement interface: attribute defaultMuted]
expected: FAIL
[HTMLMediaElement interface: attribute audioTracks]
expected: FAIL

View file

@ -1,20 +0,0 @@
[event_volumechange.html]
expected: TIMEOUT
[setting audio.muted fires volumechange]
expected: FAIL
[setting video.volume/muted repeatedly fires volumechange repeatedly]
expected: TIMEOUT
[setting audio.volume/muted to the same value does not fire volumechange]
expected: TIMEOUT
[setting video.muted fires volumechange]
expected: FAIL
[setting audio.volume/muted repeatedly fires volumechange repeatedly]
expected: TIMEOUT
[setting video.volume/muted to the same value does not fire volumechange]
expected: TIMEOUT

View file

@ -1,76 +1,13 @@
[muted.html]
[getting audio.muted (script-created)]
expected: FAIL
[getting audio.muted (parser-created)]
expected: FAIL
[getting audio.muted with muted="" (document.write-created)]
expected: FAIL
[getting video.muted with muted="" after load (parser-created)]
expected: FAIL
[cloning video propagates muted (innerHTML-created)]
expected: FAIL
[getting video.muted with muted="" (innerHTML-created)]
expected: FAIL
[setting audio.muted with muted="" (parser-created)]
expected: FAIL
[setting audio.muted (script-created)]
expected: FAIL
[getting video.muted with muted="" (document.write-created)]
expected: FAIL
[getting audio.muted with muted="" (innerHTML-created)]
expected: FAIL
[setting video.muted with muted="" (parser-created)]
expected: FAIL
[getting video.muted with muted="" (script-created)]
expected: FAIL
[setting video.muted (parser-created)]
expected: FAIL
[getting video.muted (parser-created)]
expected: FAIL
[setting audio.muted (parser-created)]
expected: FAIL
[setting video.muted (script-created)]
expected: FAIL
[setting audio.muted with muted="" (script-created)]
expected: FAIL
[cloning video propagates muted (script-created)]
expected: FAIL
[getting audio.muted with muted="" (parser-created)]
expected: FAIL
[getting video.muted (script-created)]
expected: FAIL
[setting video.muted with muted="" (script-created)]
expected: FAIL
[cloning audio propagates muted (innerHTML-created)]
expected: FAIL
[cloning audio propagates muted (script-created)]
expected: FAIL
[getting audio.muted with muted="" (script-created)]
expected: FAIL
[getting video.muted with muted="" (parser-created)]
expected: FAIL