From 5f7baf31c2097a02d8ddb370d6131d2703413010 Mon Sep 17 00:00:00 2001 From: Frederik Reiter Date: Tue, 26 Mar 2024 20:05:37 +0100 Subject: [PATCH] dom: Abort media element load on decode errors (#31748) Signed-off-by: Frederik Reiter --- components/script/dom/htmlmediaelement.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 9bedfb6dbc0..478b6db7b3b 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -1549,11 +1549,29 @@ impl HTMLMediaElement { }, PlayerEvent::Error(ref error) => { error!("Player error: {:?}", error); + // https://html.spec.whatwg.org/multipage/#loading-the-media-resource:media-data-13 + // 1. The user agent should cancel the fetching process. + if let Some(ref mut current_fetch_context) = + *self.current_fetch_context.borrow_mut() + { + current_fetch_context.cancel(CancelReason::Error); + } + // 2. Set the error attribute to the result of creating a MediaError with MEDIA_ERR_DECODE. self.error.set(Some(&*MediaError::new( &window_from_node(self), MEDIA_ERR_DECODE, ))); + + // 3. Set the element's networkState attribute to the NETWORK_IDLE value. + self.network_state.set(NetworkState::Idle); + + // 4. Set the element's delaying-the-load-event flag to false. This stops delaying the load event. + self.delay_load_event(false); + + // 5. Fire an event named error at the media element. self.upcast::().fire_event(atom!("error")); + + // TODO: 6. Abort the overall resource selection algorithm. }, PlayerEvent::VideoFrameUpdated => { self.upcast::().dirty(NodeDamage::OtherNodeDamage);