aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlselectelement.rs
diff options
context:
space:
mode:
authorCorey Farwell <coreyf@rwell.org>2016-10-15 22:13:29 -0400
committerCorey Farwell <coreyf@rwell.org>2016-10-16 17:06:58 -0400
commita3d4d336b753ee66d574286e3595cafdfcfc8eb9 (patch)
treef4488d7d5d684a34a3cf583e79284535169b2ef1 /components/script/dom/htmlselectelement.rs
parent6e0d7326ab2901ef493c6de5b41969f8ee602864 (diff)
downloadservo-a3d4d336b753ee66d574286e3595cafdfcfc8eb9.tar.gz
servo-a3d4d336b753ee66d574286e3595cafdfcfc8eb9.zip
Implement `value` property on `<select>`.
Diffstat (limited to 'components/script/dom/htmlselectelement.rs')
-rw-r--r--components/script/dom/htmlselectelement.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs
index 4825ce6a2a8..34c9187b644 100644
--- a/components/script/dom/htmlselectelement.rs
+++ b/components/script/dom/htmlselectelement.rs
@@ -258,6 +258,37 @@ impl HTMLSelectElementMethods for HTMLSelectElement {
fn Remove(&self) {
self.upcast::<Element>().Remove()
}
+
+ // https://html.spec.whatwg.org/multipage/#dom-select-value
+ fn Value(&self) -> DOMString {
+ self.upcast::<Node>()
+ .traverse_preorder()
+ .filter_map(Root::downcast::<HTMLOptionElement>)
+ .filter(|opt_elem| opt_elem.Selected())
+ .map(|opt_elem| opt_elem.Value())
+ .next()
+ .unwrap_or_default()
+ }
+
+ // https://html.spec.whatwg.org/multipage/#dom-select-value
+ fn SetValue(&self, value: DOMString) {
+ let mut opt_iter = self.upcast::<Node>()
+ .traverse_preorder()
+ .filter_map(Root::downcast::<HTMLOptionElement>);
+ // Reset until we find an <option> with a matching value
+ for opt in opt_iter.by_ref() {
+ if opt.Value() == value {
+ opt.set_selectedness(true);
+ opt.set_dirtiness(true);
+ break;
+ }
+ opt.set_selectedness(false);
+ }
+ // Reset remaining <option> elements
+ for opt in opt_iter {
+ opt.set_selectedness(false);
+ }
+ }
}
impl VirtualMethods for HTMLSelectElement {