diff options
author | Corey Farwell <coreyf@rwell.org> | 2016-10-15 22:13:29 -0400 |
---|---|---|
committer | Corey Farwell <coreyf@rwell.org> | 2016-10-16 17:06:58 -0400 |
commit | a3d4d336b753ee66d574286e3595cafdfcfc8eb9 (patch) | |
tree | f4488d7d5d684a34a3cf583e79284535169b2ef1 /components/script/dom/htmlselectelement.rs | |
parent | 6e0d7326ab2901ef493c6de5b41969f8ee602864 (diff) | |
download | servo-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.rs | 31 |
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 { |