diff options
author | Corey Farwell <coreyf@rwell.org> | 2016-10-16 08:46:23 -0400 |
---|---|---|
committer | Corey Farwell <coreyf@rwell.org> | 2016-10-24 14:14:49 -0400 |
commit | bec5bf49bd921ce2370b105db2a34407507cce08 (patch) | |
tree | e81192c8a2ed2f1be7e8df94cce394f57e5829a0 /components/script/dom/htmlselectelement.rs | |
parent | f90b256472ef7ad9a730bafbe64fc5dba83bdcdf (diff) | |
download | servo-bec5bf49bd921ce2370b105db2a34407507cce08.tar.gz servo-bec5bf49bd921ce2370b105db2a34407507cce08.zip |
Implement `selectedIndex` property on `<select>`.
Diffstat (limited to 'components/script/dom/htmlselectelement.rs')
-rw-r--r-- | components/script/dom/htmlselectelement.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 03d10e117f4..c44dac71000 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -299,6 +299,36 @@ impl HTMLSelectElementMethods for HTMLSelectElement { opt.set_selectedness(false); } } + + // https://html.spec.whatwg.org/multipage/#dom-select-selectedindex + fn SelectedIndex(&self) -> i32 { + self.upcast::<Node>() + .traverse_preorder() + .filter_map(Root::downcast::<HTMLOptionElement>) + .enumerate() + .filter(|&(_, ref opt_elem)| opt_elem.Selected()) + .map(|(i, _)| i as i32) + .next() + .unwrap_or(-1) + } + + // https://html.spec.whatwg.org/multipage/#dom-select-selectedindex + fn SetSelectedIndex(&self, index: i32) { + let mut opt_iter = self.upcast::<Node>() + .traverse_preorder() + .filter_map(Root::downcast::<HTMLOptionElement>); + for opt in opt_iter.by_ref().take(index as usize) { + opt.set_selectedness(false); + } + if let Some(opt) = opt_iter.next() { + opt.set_selectedness(true); + opt.set_dirtiness(true); + // Reset remaining <option> elements + for opt in opt_iter { + opt.set_selectedness(false); + } + } + } } impl VirtualMethods for HTMLSelectElement { |