aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlmediaelement.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-01-14 17:35:23 -0500
committerGitHub <noreply@github.com>2019-01-14 17:35:23 -0500
commit2cf9a00c9983bf23eff23d56321973d36a14f977 (patch)
tree126bfd4da3d2ec29b5482b075fef69b7e8879f6a /components/script/dom/htmlmediaelement.rs
parentc242abd99931676f246152daadf2b8dd9ddf8177 (diff)
parent7633cab63a0080350b3883a7fed045d3b9d83a15 (diff)
downloadservo-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.rs46
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();
},
_ => (),
};