diff options
author | Maciej Skrzypkowski <m.skrzypkows@samsung.com> | 2016-09-22 09:16:46 +0200 |
---|---|---|
committer | Maciej Skrzypkowski <m.skrzypkows@samsung.com> | 2016-09-22 09:17:15 +0200 |
commit | 670693ba7ed62081db5dc7accec1020cf5d71a1a (patch) | |
tree | 5a221281427821b26ce06ca5ffbc70f07883480f /components/script/dom/htmlselectelement.rs | |
parent | 614e9ca840baacfa427ec78db99258a83b75e135 (diff) | |
download | servo-670693ba7ed62081db5dc7accec1020cf5d71a1a.tar.gz servo-670693ba7ed62081db5dc7accec1020cf5d71a1a.zip |
Implement indexed access on select elements
refs #11763
Diffstat (limited to 'components/script/dom/htmlselectelement.rs')
-rw-r--r-- | components/script/dom/htmlselectelement.rs | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 222dff3e52c..6cf63c7e630 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -6,6 +6,7 @@ use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods; use dom::bindings::codegen::Bindings::HTMLSelectElementBinding; use dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelectElementMethods; +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; use dom::bindings::inheritance::Castable; @@ -17,7 +18,7 @@ use dom::htmlelement::HTMLElement; use dom::htmlfieldsetelement::HTMLFieldSetElement; use dom::htmlformelement::{FormDatumValue, FormControl, FormDatum, HTMLFormElement}; use dom::htmloptionelement::HTMLOptionElement; -use dom::node::{Node, UnbindContext, window_from_node}; +use dom::node::{document_from_node, Node, UnbindContext, window_from_node}; use dom::nodelist::NodeList; use dom::validation::Validatable; use dom::validitystate::ValidityState; @@ -183,6 +184,50 @@ impl HTMLSelectElementMethods for HTMLSelectElement { fn Labels(&self) -> Root<NodeList> { self.upcast::<HTMLElement>().labels() } + + // https://html.spec.whatwg.org/multipage/#dom-select-length + fn SetLength(&self, value: u32) { + let length = self.Length(); + let node = self.upcast::<Node>(); + if value < length { // truncate the number of option elements + let mut iter = node.rev_children().take((length - value) as usize); + while let Some(child) = iter.next() { + if let Err(e) = node.RemoveChild(&child) { + warn!("Error removing child of HTMLSelectElement: {:?}", e); + } + } + } else if value > length { // add new blank option elements + let document = document_from_node(self); + for _ in 0..(value - length) { + let element = HTMLOptionElement::new(atom!("option"), None, &document.upcast()); + if let Err(e) = node.AppendChild(element.upcast()) { + warn!("error appending child of HTMLSelectElement: {:?}", e); + } + } + } + } + + // https://html.spec.whatwg.org/multipage/#dom-select-length + fn Length(&self) -> u32 { + self.upcast::<Node>() + .traverse_preorder() + .filter_map(Root::downcast::<HTMLOptionElement>) + .count() as u32 + } + + // https://html.spec.whatwg.org/multipage/#dom-select-item + fn Item(&self, index: u32) -> Option<Root<Element>> { + self.upcast::<Node>() + .traverse_preorder() + .filter_map(Root::downcast::<HTMLOptionElement>) + .nth(index as usize) + .map(|item| Root::from_ref(item.upcast())) + } + + // https://html.spec.whatwg.org/multipage/#dom-select-item + fn IndexedGetter(&self, index: u32) -> Option<Root<Element>> { + self.Item(index) + } } impl VirtualMethods for HTMLSelectElement { |