diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 80afcf2a585..594c0ea221e 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -661,65 +661,70 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
}
// https://html.spec.whatwg.org/multipage/#dom-media-play
+ // FIXME(nox): This should return a promise.
fn Play(&self) {
- // TODO step 1
+ // Step 1.
+ // FIXME(nox): Return a rejected promise if not allowed to play.
- // Step 2
+ // Step 2.
if self.error.get().map_or(false, |e| e.Code() == MEDIA_ERR_SRC_NOT_SUPPORTED) {
- // TODO return rejected promise
+ // FIXME(nox): This should return a rejected promise.
return;
}
- // TODO step 3
+ // Step 3.
+ // Create promise and add it to list of pending play promises.
- // Step 4
+ // Step 4.
if self.network_state.get() == NetworkState::Empty {
self.invoke_resource_selection_algorithm();
}
- // TODO step 5 (seek backwards)
-
- // TODO step 6 (media controller)
+ // Step 5.
+ // FIXME(nox): Seek to earliest possible position if playback has ended
+ // and direction of playback is forwards.
let state = self.ready_state.get();
- // Step 7
if self.Paused() {
- // 7.1
+ // Step 6.1.
self.paused.set(false);
- // TODO 7.2 (show poster)
+ // Step 6.2.
+ // FIXME(nox): Set show poster flag to false and run time marches on
+ // steps if show poster flag is true.
+ // Step 6.3.
let window = window_from_node(self);
let task_source = window.dom_manipulation_task_source();
-
- // 7.3
task_source.queue_simple_event(self.upcast(), atom!("play"), &window);
- // 7.4
- if state == ReadyState::HaveNothing ||
- state == ReadyState::HaveMetadata ||
- state == ReadyState::HaveCurrentData {
- task_source.queue_simple_event(
- self.upcast(),
- atom!("waiting"),
- &window,
- );
- } else {
- self.notify_about_playing();
+ // Step 7.4.
+ match state {
+ ReadyState::HaveNothing |
+ ReadyState::HaveMetadata |
+ ReadyState::HaveCurrentData => {
+ task_source.queue_simple_event(
+ self.upcast(),
+ atom!("waiting"),
+ &window,
+ );
+ },
+ ReadyState::HaveFutureData |
+ ReadyState::HaveEnoughData => {
+ self.notify_about_playing();
+ }
}
- }
- // Step 8
- else if state == ReadyState::HaveFutureData || state == ReadyState::HaveEnoughData {
- // TODO resolve pending play promises
+ } else if state == ReadyState::HaveFutureData || state == ReadyState::HaveEnoughData {
+ // Step 7.
+ // FIXME(nox): Queue a task to resolve pending play promises.
}
- // Step 9
+ // Step 8.
self.autoplaying.set(false);
- // TODO step 10 (media controller)
-
- // TODO return promise
+ // Step 9.
+ // FIXME(nox): Return promise created in step 3.
}
// https://html.spec.whatwg.org/multipage/#dom-media-pause
@@ -820,12 +825,12 @@ struct HTMLMediaElementContext {
ignore_response: bool,
}
+// https://html.spec.whatwg.org/multipage/#media-data-processing-steps-list
impl FetchResponseListener for HTMLMediaElementContext {
fn process_request_body(&mut self) {}
fn process_request_eof(&mut self) {}
- // https://html.spec.whatwg.org/multipage/#media-data-processing-steps-list
fn process_response(&mut self, metadata: Result) {
self.metadata = metadata.ok().map(|m| {
match m {
@@ -834,23 +839,24 @@ impl FetchResponseListener for HTMLMediaElementContext {
}
});
+ let status_is_ok = self.metadata.as_ref()
+ .and_then(|m| m.status.as_ref())
+ .map_or(true, |s| s.0 >= 200 && s.0 < 300);
+
// => "If the media data cannot be fetched at all..."
- let is_failure = self.metadata
- .as_ref()
- .and_then(|m| m.status
- .as_ref()
- .map(|&(s, _)| s < 200 || s >= 300))
- .unwrap_or(false);
- if is_failure {
+ if !status_is_ok {
// Ensure that the element doesn't receive any further notifications
- // of the aborted fetch. The dedicated failure steps will be executed
- // when response_complete runs.
+ // of the aborted fetch. The dedicated failure steps will be
+ // executed when response_complete runs.
+ // FIXME(nox): According to the spec, we shouldn't wait to receive
+ // the whole response before running the dedicated failure steps.
self.ignore_response = true;
}
}
fn process_response_chunk(&mut self, mut payload: Vec) {
if self.ignore_response {
+ // An error was received previously, skip processing the payload.
return;
}