diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-01-14 17:35:23 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-14 17:35:23 -0500 |
commit | 2cf9a00c9983bf23eff23d56321973d36a14f977 (patch) | |
tree | 126bfd4da3d2ec29b5482b075fef69b7e8879f6a /components/script/dom/htmlmediaelement.rs | |
parent | c242abd99931676f246152daadf2b8dd9ddf8177 (diff) | |
parent | 7633cab63a0080350b3883a7fed045d3b9d83a15 (diff) | |
download | servo-2cf9a00c9983bf23eff23d56321973d36a14f977.tar.gz servo-2cf9a00c9983bf23eff23d56321973d36a14f977.zip |
Auto merge of #22399 - ferjm:poster.frame, r=jdm
Implement HTMLMediaElement poster attribute
- [X] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #22288
- [x] There are tests for these changes
<!-- 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/22399)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/htmlmediaelement.rs')
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index dd83c2061de..b38c0e9255f 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -51,10 +51,13 @@ use http::header::{self, HeaderMap, HeaderValue}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use mime::{self, Mime}; +use net_traits::image::base::Image; +use net_traits::image_cache::ImageResponse; 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; @@ -85,6 +88,12 @@ impl MediaFrameRenderer { very_old_frame: None, } } + + fn render_poster_frame(&mut self, image: Arc<Image>) { + if let Some(image_id) = image.id { + self.current_frame = Some((image_id, image.width as i32, image.height as i32)); + } + } } impl FrameRenderer for MediaFrameRenderer { @@ -135,14 +144,11 @@ impl FrameRenderer for MediaFrameRenderer { self.current_frame = Some((image_key, frame.get_width(), frame.get_height())); }, } - self.api.update_resources(txn.resource_updates); } } #[dom_struct] -// FIXME(nox): A lot of tasks queued for this element should probably be in the -// media element event task source. pub struct HTMLMediaElement { htmlelement: HTMLElement, /// <https://html.spec.whatwg.org/multipage/#dom-media-networkstate> @@ -293,7 +299,7 @@ impl HTMLMediaElement { /// we pass true to that method again. /// /// <https://html.spec.whatwg.org/multipage/#delaying-the-load-event-flag> - fn delay_load_event(&self, delay: bool) { + pub fn delay_load_event(&self, delay: bool) { let mut blocker = self.delaying_the_load_event_flag.borrow_mut(); if delay && blocker.is_none() { *blocker = Some(LoadBlocker::new(&document_from_node(self), LoadType::Media)); @@ -1080,6 +1086,30 @@ impl HTMLMediaElement { task_source.queue_simple_event(self.upcast(), atom!("seeked"), &window); } + /// https://html.spec.whatwg.org/multipage/#poster-frame + pub fn process_poster_response(&self, image: ImageResponse) { + if !self.show_poster.get() { + return; + } + + // Step 6. + if let ImageResponse::Loaded(image, _) = image { + self.frame_renderer + .lock() + .unwrap() + .render_poster_frame(image); + self.upcast::<Node>().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); + } + } + } + fn setup_media_player(&self) -> Result<(), PlayerError> { let (action_sender, action_receiver) = ipc::channel().unwrap(); @@ -1693,11 +1723,13 @@ impl VirtualMethods for HTMLMediaElement { fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { self.super_type().unwrap().attribute_mutated(attr, mutation); + if mutation.new_value(attr).is_none() { + return; + } + match attr.local_name() { &local_name!("src") => { - if mutation.new_value(attr).is_some() { - self.media_element_load_algorithm(); - } + self.media_element_load_algorithm(); }, _ => (), }; |