diff options
Diffstat (limited to 'components/script/dom/htmlmediaelement.rs')
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 40 |
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 { |