Clean up HTMLMediaElement::change_ready_state

This commit is contained in:
Anthony Ramine 2017-09-15 02:59:09 +02:00
parent 23701f8659
commit e4cd6be831

View file

@ -199,23 +199,19 @@ impl HTMLMediaElement {
let window = window_from_node(self); let window = window_from_node(self);
let task_source = window.dom_manipulation_task_source(); let task_source = window.dom_manipulation_task_source();
// Step 1 // Step 1.
match (old_ready_state, ready_state) { match (old_ready_state, ready_state) {
// Previous ready state was ReadyState::HaveNothing,
// and the new ready state is ReadyState::HaveMetadata.
(ReadyState::HaveNothing, ReadyState::HaveMetadata) => { (ReadyState::HaveNothing, ReadyState::HaveMetadata) => {
task_source.queue_simple_event( task_source.queue_simple_event(
self.upcast(), self.upcast(),
atom!("loadedmetadata"), atom!("loadedmetadata"),
&window, &window,
); );
}
// Previous ready state was ReadyState::HaveMetadata, and the new // No other steps are applicable in this case.
// ready state is ReadyState::HaveCurrentData or greater. return;
(ReadyState::HaveMetadata, ReadyState::HaveCurrentData) | },
(ReadyState::HaveMetadata, ReadyState::HaveFutureData) | (ReadyState::HaveMetadata, new) if new >= ReadyState::HaveCurrentData => {
(ReadyState::HaveMetadata, ReadyState::HaveEnoughData) => {
if !self.fired_loadeddata_event.get() { if !self.fired_loadeddata_event.get() {
self.fired_loadeddata_event.set(true); self.fired_loadeddata_event.set(true);
task_source.queue_simple_event( task_source.queue_simple_event(
@ -224,31 +220,23 @@ impl HTMLMediaElement {
&window, &window,
); );
} }
}
// previous ready state was ReadyState::HaveFutureData or more, // Steps for the transition from HaveMetadata to HaveCurrentData
// and the new ready state is ReadyState::HaveCurrentData or less. // or HaveFutureData also apply here, as per the next match
(ReadyState::HaveFutureData, ReadyState::HaveCurrentData) | // expression.
(ReadyState::HaveEnoughData, ReadyState::HaveCurrentData) | },
(ReadyState::HaveFutureData, ReadyState::HaveMetadata) | (ReadyState::HaveFutureData, new) if new <= ReadyState::HaveCurrentData => {
(ReadyState::HaveEnoughData, ReadyState::HaveMetadata) | // FIXME(nox): Queue a task to fire timeupdate and waiting
(ReadyState::HaveFutureData, ReadyState::HaveNothing) | // events if the conditions call from the spec are met.
(ReadyState::HaveEnoughData, ReadyState::HaveNothing) => {
// TODO: timeupdate event logic + waiting // No other steps are applicable in this case.
} return;
},
_ => (), _ => (),
} }
// Step 1. if old_ready_state <= ReadyState::HaveCurrentData && ready_state >= ReadyState::HaveFutureData {
// If the new ready state is ReadyState::HaveFutureData or ReadyState::HaveEnoughData,
// then the relevant steps below must then be run also.
match (old_ready_state, ready_state) {
// Previous ready state was ReadyState::HaveCurrentData or less,
// and the new ready state is ReadyState::HaveFutureData.
(ReadyState::HaveCurrentData, ReadyState::HaveFutureData) |
(ReadyState::HaveMetadata, ReadyState::HaveFutureData) |
(ReadyState::HaveNothing, ReadyState::HaveFutureData) => {
task_source.queue_simple_event( task_source.queue_simple_event(
self.upcast(), self.upcast(),
atom!("canplay"), atom!("canplay"),
@ -260,21 +248,11 @@ impl HTMLMediaElement {
} }
} }
// New ready state is ReadyState::HaveEnoughData. if ready_state == ReadyState::HaveEnoughData {
(_, ReadyState::HaveEnoughData) => { // TODO: Check sandboxed automatic features browsing context flag.
if old_ready_state <= ReadyState::HaveCurrentData { // FIXME(nox): I have no idea what this TODO is about.
task_source.queue_simple_event(
self.upcast(),
atom!("canplay"),
&window,
);
if !self.Paused() { // FIXME(nox): Review this block.
self.notify_about_playing();
}
}
//TODO: check sandboxed automatic features browsing context flag
if self.autoplaying.get() && if self.autoplaying.get() &&
self.Paused() && self.Paused() &&
self.Autoplay() { self.Autoplay() {
@ -293,6 +271,8 @@ impl HTMLMediaElement {
self.autoplaying.set(false); self.autoplaying.set(false);
} }
// FIXME(nox): According to the spec, this should come *before* the
// "play" event.
task_source.queue_simple_event( task_source.queue_simple_event(
self.upcast(), self.upcast(),
atom!("canplaythrough"), atom!("canplaythrough"),
@ -300,10 +280,8 @@ impl HTMLMediaElement {
); );
} }
_ => (), // TODO Step 2: Media controller.
} // FIXME(nox): There is no step 2 in the spec.
// TODO Step 2: media controller
} }
// https://html.spec.whatwg.org/multipage/#concept-media-load-algorithm // https://html.spec.whatwg.org/multipage/#concept-media-load-algorithm