diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-25 00:28:59 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-25 00:35:35 +0200 |
commit | 5245931dc283af528bb085f652d41856246b01bb (patch) | |
tree | 1f27b10a4d6d90563f9767135b673a80dadafc64 /components/script | |
parent | 49dd04cd8b6beb4cc44991f5bbf945f6c3fa8fd5 (diff) | |
download | servo-5245931dc283af528bb085f652d41856246b01bb.tar.gz servo-5245931dc283af528bb085f652d41856246b01bb.zip |
Implement the error path for source children of media elements
This removes some test timeout.
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 34 | ||||
-rw-r--r-- | components/script/dom/htmlsourceelement.rs | 19 | ||||
-rw-r--r-- | components/script/dom/virtualmethods.rs | 4 |
3 files changed, 52 insertions, 5 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index bcceffc11d4..13986728f32 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -85,7 +85,7 @@ pub struct HTMLMediaElement { /// https://html.spec.whatwg.org/multipage/#dom-media-networkstate #[derive(Clone, Copy, HeapSizeOf, JSTraceable, PartialEq)] #[repr(u8)] -enum NetworkState { +pub enum NetworkState { Empty = HTMLMediaElementConstants::NETWORK_EMPTY as u8, Idle = HTMLMediaElementConstants::NETWORK_IDLE as u8, Loading = HTMLMediaElementConstants::NETWORK_LOADING as u8, @@ -443,12 +443,23 @@ impl HTMLMediaElement { #[allow(dead_code)] Object, Attribute(String), - // FIXME(nox): Support source element child. - #[allow(dead_code)] Children(Root<HTMLSourceElement>), } - let mode = if let Some(attr) = self.upcast::<Element>().get_attribute(&ns!(), &local_name!("src")) { - Mode::Attribute(attr.Value().into()) + fn mode(media: &HTMLMediaElement) -> Option<Mode> { + if let Some(attr) = media.upcast::<Element>().get_attribute(&ns!(), &local_name!("src")) { + return Some(Mode::Attribute(attr.Value().into())); + } + let source_child_element = media.upcast::<Node>() + .children() + .filter_map(Root::downcast::<HTMLSourceElement>) + .next(); + if let Some(element) = source_child_element { + return Some(Mode::Children(element)); + } + None + } + let mode = if let Some(mode) = mode(self) { + mode } else { self.network_state.set(NetworkState::Empty); return; @@ -775,6 +786,19 @@ impl HTMLMediaElement { } } } + + /// Handles insertion of `source` children. + /// + /// https://html.spec.whatwg.org/multipage/#the-source-element:nodes-are-inserted + pub fn handle_source_child_insertion(&self) { + if self.upcast::<Element>().has_attribute(&local_name!("src")) { + return; + } + if self.network_state.get() != NetworkState::Empty { + return; + } + self.media_element_load_algorithm(); + } } impl HTMLMediaElementMethods for HTMLMediaElement { diff --git a/components/script/dom/htmlsourceelement.rs b/components/script/dom/htmlsourceelement.rs index 84adbc16548..865b21d6acb 100644 --- a/components/script/dom/htmlsourceelement.rs +++ b/components/script/dom/htmlsourceelement.rs @@ -3,10 +3,14 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::Bindings::HTMLSourceElementBinding; +use dom::bindings::codegen::Bindings::NodeBinding::NodeBinding::NodeMethods; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; +use dom::htmlmediaelement::HTMLMediaElement; use dom::node::Node; +use dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; @@ -34,3 +38,18 @@ impl HTMLSourceElement { HTMLSourceElementBinding::Wrap) } } + +impl VirtualMethods for HTMLSourceElement { + fn super_type(&self) -> Option<&VirtualMethods> { + Some(self.upcast::<HTMLElement>() as &VirtualMethods) + } + + /// https://html.spec.whatwg.org/multipage/#the-source-element:nodes-are-inserted + fn bind_to_tree(&self, tree_in_doc: bool) { + self.super_type().unwrap().bind_to_tree(tree_in_doc); + let parent = self.upcast::<Node>().GetParentNode().unwrap(); + if let Some(media) = parent.downcast::<HTMLMediaElement>() { + media.handle_source_child_insertion(); + } + } +} diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index 2e4376ab975..b9adcea198e 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -41,6 +41,7 @@ use dom::htmloptionelement::HTMLOptionElement; use dom::htmloutputelement::HTMLOutputElement; use dom::htmlscriptelement::HTMLScriptElement; use dom::htmlselectelement::HTMLSelectElement; +use dom::htmlsourceelement::HTMLSourceElement; use dom::htmlstyleelement::HTMLStyleElement; use dom::htmltablecellelement::HTMLTableCellElement; use dom::htmltableelement::HTMLTableElement; @@ -231,6 +232,9 @@ pub fn vtable_for(node: &Node) -> &VirtualMethods { NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) => { node.downcast::<HTMLSelectElement>().unwrap() as &VirtualMethods } + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSourceElement)) => { + node.downcast::<HTMLSourceElement>().unwrap() as &VirtualMethods + } NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLStyleElement)) => { node.downcast::<HTMLStyleElement>().unwrap() as &VirtualMethods } |