aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-02-25 05:05:09 -0500
committerGitHub <noreply@github.com>2019-02-25 05:05:09 -0500
commita28e15e4ea34ed068cc4a49a0625c54f370cd9e8 (patch)
treec2e71dbe15842a946cdd1b327205204414fd396a
parent427003210b3e16a82f958e35ff4212f26ffa35ab (diff)
parent02d3328d3c3006e264513ed1869839e350aa3242 (diff)
downloadservo-a28e15e4ea34ed068cc4a49a0625c54f370cd9e8.tar.gz
servo-a28e15e4ea34ed068cc4a49a0625c54f370cd9e8.zip
Auto merge of #22347 - stevesweetney:master, r=ferjm
Implement HTMLMediaElement muted and defaultMuted attributes <!-- Please describe your changes on the following line: --> PR for issue #22291 --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #22291 (github issue number if applicable). - [X] There are tests for these changes OR <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22347) <!-- Reviewable:end -->
-rw-r--r--components/script/dom/htmlmediaelement.rs42
-rw-r--r--components/script/dom/webidls/HTMLMediaElement.webidl4
-rw-r--r--tests/wpt/metadata/html/dom/interfaces.https.html.ini24
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_volumechange.html.ini20
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/user-interface/muted.html.ini63
5 files changed, 44 insertions, 109 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 97170befaf1..c64bd26e57c 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -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;
}
diff --git a/components/script/dom/webidls/HTMLMediaElement.webidl b/components/script/dom/webidls/HTMLMediaElement.webidl
index 0acd2a2c9a6..c932516773c 100644
--- a/components/script/dom/webidls/HTMLMediaElement.webidl
+++ b/components/script/dom/webidls/HTMLMediaElement.webidl
@@ -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;
diff --git a/tests/wpt/metadata/html/dom/interfaces.https.html.ini b/tests/wpt/metadata/html/dom/interfaces.https.html.ini
index a78b7ccde1b..5bd80b0b29e 100644
--- a/tests/wpt/metadata/html/dom/interfaces.https.html.ini
+++ b/tests/wpt/metadata/html/dom/interfaces.https.html.ini
@@ -6783,12 +6783,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
@@ -6813,12 +6807,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
@@ -6843,12 +6831,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
@@ -6873,12 +6855,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
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_volumechange.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_volumechange.html.ini
deleted file mode 100644
index feae1e0c321..00000000000
--- a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_volumechange.html.ini
+++ /dev/null
@@ -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
-
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/user-interface/muted.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/user-interface/muted.html.ini
index 19ed2762b7e..88f69a363a7 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/user-interface/muted.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/user-interface/muted.html.ini
@@ -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
-