diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index dad77b29095..e14826f8430 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -64,6 +64,7 @@ pause play playing popstate +postershown print progress radio diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 38c00067ddc..f948db2e7b2 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -57,6 +57,7 @@ use net_traits::request::{CredentialsMode, Destination, RequestInit}; use net_traits::{CoreResourceMsg, FetchChannels, FetchMetadata, FetchResponseListener, Metadata}; use net_traits::{NetworkError, ResourceFetchTiming, ResourceTimingType}; use script_layout_interface::HTMLMediaData; +use servo_config::prefs::PREFS; use servo_media::player::frame::{Frame, FrameRenderer}; use servo_media::player::{PlaybackState, Player, PlayerError, PlayerEvent, StreamType}; use servo_media::ServoMedia; @@ -1098,6 +1099,14 @@ impl HTMLMediaElement { .unwrap() .render_poster_frame(image); self.upcast::().dirty(NodeDamage::OtherNodeDamage); + if let Some(testing_on) = PREFS.get("media.testing.enabled").as_boolean() { + if !testing_on { + return; + } + let window = window_from_node(self); + let task_source = window.task_manager().media_element_task_source(); + task_source.queue_simple_event(self.upcast(), atom!("postershown"), &window); + } } } diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs index 57e2f61a7eb..69a58d7a081 100644 --- a/components/script/dom/htmlvideoelement.rs +++ b/components/script/dom/htmlvideoelement.rs @@ -6,6 +6,7 @@ use crate::dom::attr::Attr; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::HTMLVideoElementBinding; use crate::dom::bindings::codegen::Bindings::HTMLVideoElementBinding::HTMLVideoElementMethods; +use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; @@ -113,6 +114,11 @@ impl HTMLVideoElement { // Step 3. let poster_url = match ServoUrl::parse(poster_url) { Ok(url) => url, + Err(url::ParseError::RelativeUrlWithoutBase) => { + let window = window_from_node(self); + let url = window.Location().get_url(); + url.join(&poster_url).unwrap() + }, Err(_) => return, }; @@ -219,6 +225,10 @@ impl HTMLVideoElementMethods for HTMLVideoElement { // https://html.spec.whatwg.org/multipage/#dom-video-poster make_setter!(SetPoster, "poster"); + + // For testing purposes only. This is not an event from + // https://html.spec.whatwg.org/multipage/#dom-video-poster + event_handler!(postershown, GetOnpostershown, SetOnpostershown); } impl VirtualMethods for HTMLVideoElement { diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs index aab7213a8f1..0a142205f02 100644 --- a/components/script/dom/location.rs +++ b/components/script/dom/location.rs @@ -37,7 +37,7 @@ impl Location { ) } - fn get_url(&self) -> ServoUrl { + pub fn get_url(&self) -> ServoUrl { self.window.get_url() } diff --git a/components/script/dom/webidls/HTMLVideoElement.webidl b/components/script/dom/webidls/HTMLVideoElement.webidl index b3fa18e25e1..c79aefafc99 100644 --- a/components/script/dom/webidls/HTMLVideoElement.webidl +++ b/components/script/dom/webidls/HTMLVideoElement.webidl @@ -13,3 +13,8 @@ interface HTMLVideoElement : HTMLMediaElement { readonly attribute unsigned long videoHeight; [CEReactions] attribute DOMString poster; }; + +partial interface HTMLVideoElement { + [Pref="media.testing.enabled"] + attribute EventHandler onpostershown; +}; diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 5283e0ae9cb..89f4eb55931 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -7157,6 +7157,18 @@ {} ] ], + "mozilla/video_poster_frame.html": [ + [ + "/_mozilla/mozilla/video_poster_frame.html", + [ + [ + "/_mozilla/mozilla/video_poster_frame_ref.html", + "==" + ] + ], + {} + ] + ], "mozilla/webgl/clearcolor.html": [ [ "/_mozilla/mozilla/webgl/clearcolor.html", @@ -10368,6 +10380,11 @@ {} ] ], + "mozilla/poster.png": [ + [ + {} + ] + ], "mozilla/referrer-policy/OWNERS": [ [ {} @@ -11813,6 +11830,11 @@ {} ] ], + "mozilla/video_poster_frame_ref.html": [ + [ + {} + ] + ], "mozilla/webgl/clearcolor_ref.html": [ [ {} @@ -27227,6 +27249,10 @@ "5aff666995fe6cd1d4e84e63a9f6019d04387f8e", "testharness" ], + "mozilla/poster.png": [ + "33834c3ef095fa9c0080017e1b65b2eb8413eac4", + "support" + ], "mozilla/postmessage_closed.html": [ "c54e371b270cd2e34558dfb7994785d697330534", "testharness" @@ -32811,6 +32837,14 @@ "5ab0557c5e02828c38f5c58edde5425e40dcb4b1", "testharness" ], + "mozilla/video_poster_frame.html": [ + "2f4af97720c40fbbde8d1cad660b1018d88367e5", + "reftest" + ], + "mozilla/video_poster_frame_ref.html": [ + "b45a87aa614eef6cbe21a77a7b75e81e9a9f8c95", + "support" + ], "mozilla/weakref.html": [ "4deccbe1e26a3f921eea85a4395394a55cc88be4", "testharness" diff --git a/tests/wpt/mozilla/meta/mozilla/video_poster_frame.html.ini b/tests/wpt/mozilla/meta/mozilla/video_poster_frame.html.ini new file mode 100644 index 00000000000..300efbf7350 --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/video_poster_frame.html.ini @@ -0,0 +1,2 @@ +[video_poster_frame.html] + prefs: [media.testing.enabled:true] diff --git a/tests/wpt/mozilla/tests/mozilla/poster.png b/tests/wpt/mozilla/tests/mozilla/poster.png new file mode 100644 index 00000000000..33834c3ef09 Binary files /dev/null and b/tests/wpt/mozilla/tests/mozilla/poster.png differ diff --git a/tests/wpt/mozilla/tests/mozilla/video_poster_frame.html b/tests/wpt/mozilla/tests/mozilla/video_poster_frame.html new file mode 100644 index 00000000000..2f4af97720c --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/video_poster_frame.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/tests/wpt/mozilla/tests/mozilla/video_poster_frame_ref.html b/tests/wpt/mozilla/tests/mozilla/video_poster_frame_ref.html new file mode 100644 index 00000000000..b45a87aa614 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/video_poster_frame_ref.html @@ -0,0 +1,4 @@ + + + +