aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/htmlmediaelement.rs27
1 files changed, 22 insertions, 5 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 447e3fd40f1..6f6ed722a3e 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -159,6 +159,7 @@ pub struct MediaFrameRenderer {
old_frame: Option<ImageKey>,
very_old_frame: Option<ImageKey>,
current_frame_holder: Option<FrameHolder>,
+ show_poster: bool,
}
impl MediaFrameRenderer {
@@ -170,18 +171,25 @@ impl MediaFrameRenderer {
old_frame: None,
very_old_frame: None,
current_frame_holder: None,
+ show_poster: false,
}
}
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));
+ self.show_poster = true;
}
}
}
impl VideoFrameRenderer for MediaFrameRenderer {
fn render(&mut self, frame: VideoFrame) {
+ // Don't render new frames if the poster should be shown
+ if self.show_poster {
+ return;
+ }
+
let mut updates = vec![];
if let Some(old_image_key) = mem::replace(&mut self.very_old_frame, self.old_frame.take()) {
@@ -666,7 +674,7 @@ impl HTMLMediaElement {
self.paused.set(false);
// Step 2
if self.show_poster.get() {
- self.show_poster.set(false);
+ self.set_show_poster(false);
self.time_marches_on();
}
// Step 3
@@ -689,7 +697,7 @@ impl HTMLMediaElement {
self.network_state.set(NetworkState::NoSource);
// Step 2.
- self.show_poster.set(true);
+ self.set_show_poster(true);
// Step 3.
self.delay_load_event(true);
@@ -1025,7 +1033,7 @@ impl HTMLMediaElement {
this.network_state.set(NetworkState::NoSource);
// Step 4.
- this.show_poster.set(true);
+ this.set_show_poster(true);
// Step 5.
this.upcast::<EventTarget>().fire_event(atom!("error"));
@@ -1240,7 +1248,7 @@ impl HTMLMediaElement {
// https://html.spec.whatwg.org/multipage/#dom-media-seek
fn seek(&self, time: f64, _approximate_for_speed: bool) {
// Step 1.
- self.show_poster.set(false);
+ self.set_show_poster(false);
// Step 2.
if self.ready_state.get() == ReadyState::HaveNothing {
@@ -1976,6 +1984,15 @@ impl HTMLMediaElement {
self.duration.set(duration);
}
+ /// Sets a new value for the show_poster propperty. If the poster is being hidden
+ /// because new frames should render, updates video_renderer to allow it.
+ fn set_show_poster(&self, show_poster: bool) {
+ self.show_poster.set(show_poster);
+ if !show_poster {
+ self.video_renderer.lock().unwrap().show_poster = false;
+ }
+ }
+
pub fn reset(&self) {
if let Some(ref player) = *self.player.borrow() {
if let Err(e) = player.lock().unwrap().stop() {
@@ -2179,7 +2196,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
// Step 6.2.
if self.show_poster.get() {
- self.show_poster.set(false);
+ self.set_show_poster(false);
self.time_marches_on();
}