aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/script/dom/htmlselectelement.rs30
-rw-r--r--components/script/dom/webidls/HTMLSelectElement.webidl2
2 files changed, 31 insertions, 1 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 {
diff --git a/components/script/dom/webidls/HTMLSelectElement.webidl b/components/script/dom/webidls/HTMLSelectElement.webidl
index a8fd2803c44..543c3267c64 100644
--- a/components/script/dom/webidls/HTMLSelectElement.webidl
+++ b/components/script/dom/webidls/HTMLSelectElement.webidl
@@ -25,7 +25,7 @@ interface HTMLSelectElement : HTMLElement {
//setter void (unsigned long index, HTMLOptionElement? option);
//readonly attribute HTMLCollection selectedOptions;
- // attribute long selectedIndex;
+ attribute long selectedIndex;
attribute DOMString value;
//readonly attribute boolean willValidate;