aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlselectelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmlselectelement.rs')
-rw-r--r--components/script/dom/htmlselectelement.rs30
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 {