aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlmediaelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmlmediaelement.rs')
-rw-r--r--components/script/dom/htmlmediaelement.rs40
1 files changed, 37 insertions, 3 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index d84e5be13cf..2f3dbe03ea5 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -6,17 +6,20 @@ use document_loader::LoadType;
use dom::attr::Attr;
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods;
+use dom::bindings::codegen::Bindings::HTMLMediaElementBinding::CanPlayTypeResult;
use dom::bindings::codegen::Bindings::HTMLMediaElementBinding::HTMLMediaElementMethods;
use dom::bindings::codegen::Bindings::HTMLMediaElementBinding::HTMLMediaElementConstants::*;
+use dom::bindings::codegen::Bindings::MediaErrorBinding::MediaErrorConstants::*;
use dom::bindings::global::GlobalRef;
use dom::bindings::inheritance::Castable;
-use dom::bindings::js::Root;
+use dom::bindings::js::{Root, MutNullableHeap, JS};
use dom::bindings::refcounted::Trusted;
use dom::document::Document;
use dom::element::{Element, AttributeMutation};
use dom::event::{Event, EventBubbles, EventCancelable};
use dom::htmlelement::HTMLElement;
use dom::htmlsourceelement::HTMLSourceElement;
+use dom::mediaerror::MediaError;
use dom::node::{window_from_node, document_from_node};
use dom::virtualmethods::VirtualMethods;
use ipc_channel::ipc;
@@ -110,6 +113,15 @@ impl AsyncResponseListener for HTMLMediaElementContext {
elem.network_state.set(NETWORK_IDLE);
elem.fire_simple_event("suspend");
+ } else if elem.ready_state.get() != HAVE_NOTHING {
+ elem.error.set(Some(&*MediaError::new(&*window_from_node(&*elem),
+ MEDIA_ERR_NETWORK)));
+
+ elem.network_state.set(NETWORK_IDLE);
+
+ // TODO: update delay load flag
+
+ elem.fire_simple_event("error");
} else {
elem.queue_dedicated_media_source_failure_steps();
}
@@ -149,6 +161,7 @@ pub struct HTMLMediaElement {
current_src: DOMRefCell<String>,
generation_id: Cell<u32>,
first_data_load: Cell<bool>,
+ error: MutNullableHeap<JS<MediaError>>,
}
impl HTMLMediaElement {
@@ -163,6 +176,7 @@ impl HTMLMediaElement {
current_src: DOMRefCell::new("".to_owned()),
generation_id: Cell::new(0),
first_data_load: Cell::new(true),
+ error: Default::default(),
}
}
@@ -372,7 +386,9 @@ impl HTMLMediaElement {
// https://html.spec.whatwg.org/multipage/#dedicated-media-source-failure-steps
fn dedicated_media_source_failure(&self) {
- // TODO step 1 (error attribute)
+ // Step 1
+ self.error.set(Some(&*MediaError::new(&*window_from_node(self),
+ MEDIA_ERR_SRC_NOT_SUPPORTED)));
// TODO step 2 (forget resource tracks)
@@ -426,7 +442,9 @@ impl HTMLMediaElement {
}
// TODO step 5 (playback rate)
- // TODO step 6 (error/autoplaying)
+ // Step 6
+ self.error.set(None);
+ // TODO autoplay flag
// Step 7
let doc = document_from_node(self);
@@ -454,6 +472,22 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
fn CurrentSrc(&self) -> DOMString {
DOMString::from(self.current_src.borrow().clone())
}
+
+ // https://html.spec.whatwg.org/multipage/#dom-media-load
+ fn Load(&self) {
+ self.media_element_load_algorithm();
+ }
+
+ // https://html.spec.whatwg.org/multipage/#dom-navigator-canplaytype
+ fn CanPlayType(&self, _type_: DOMString) -> CanPlayTypeResult {
+ // TODO: application/octet-stream
+ CanPlayTypeResult::Maybe
+ }
+
+ // https://html.spec.whatwg.org/multipage/#dom-media-error
+ fn GetError(&self) -> Option<Root<MediaError>> {
+ self.error.get()
+ }
}
impl VirtualMethods for HTMLMediaElement {