use js::context::JSContext;
use script_bindings::dom::UnrootedDom;
use script_bindings::root::DomRoot;
use script_bindings::str::DOMString;
use crate::dom::bindings::codegen::Bindings::TextTrackBinding::{TextTrackMethods, TextTrackMode};
use crate::dom::html::htmlmediaelement::HTMLMediaElement;
use crate::dom::html::htmlvideoelement::HTMLVideoElement;
use crate::dom::texttrack::TextTrack;
use crate::dom::texttrackcue::TextTrackCue;
use crate::script_bindings::inheritance::Castable;
#[derive(PartialEq)]
pub(crate) enum ShouldResetRenderingControls {
Yes,
No,
}
#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)]
pub(crate) enum RulesForUpdatingTheTextTrackRendering {
WebVTT,
}
impl RulesForUpdatingTheTextTrackRendering {
pub(crate) fn run(
&self,
cx: &mut JSContext,
media_element: &HTMLMediaElement,
text_tracks: Vec<DomRoot<TextTrack>>,
_language: Option<DOMString>,
_reset: ShouldResetRenderingControls,
) {
debug_assert!(*self == RulesForUpdatingTheTextTrackRendering::WebVTT);
if !media_element.is::<HTMLVideoElement>() {
return;
};
let tracks: Vec<DomRoot<TextTrack>> = text_tracks
.into_iter()
.filter(|text_track| {
let is_showing = text_track.Mode() == TextTrackMode::Showing;
debug_assert!(
!is_showing ||
text_track
.rules_for_updating_the_text_track_rendering()
.is_some_and(
|rules| rules == RulesForUpdatingTheTextTrackRendering::WebVTT
)
);
is_showing
})
.collect();
let _cues: Vec<DomRoot<TextTrackCue>> = tracks
.iter()
.flat_map(|track| {
track
.cues(cx.no_gc())
.into_iter()
.filter(|cue| cue.is_active())
.collect::<Vec<UnrootedDom<'_, TextTrackCue>>>()
})
.map(|cue| cue.as_rooted())
.collect();
}
}