diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-10-17 02:47:48 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-17 02:47:48 -0500 |
commit | a71b1e65be0ce40ebc78cf9ec248e7ff41d179ce (patch) | |
tree | cb7617241aded029019657c21da05541a3ff88ef | |
parent | d80bf2ada73295bc91a267d0f8f7c4a5ffb1a03f (diff) | |
parent | a3d4d336b753ee66d574286e3595cafdfcfc8eb9 (diff) | |
download | servo-a71b1e65be0ce40ebc78cf9ec248e7ff41d179ce.tar.gz servo-a71b1e65be0ce40ebc78cf9ec248e7ff41d179ce.zip |
Auto merge of #13783 - frewsxcv:select-value, r=nox
Implement `value` property on `<select>`.
<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13783)
<!-- Reviewable:end -->
5 files changed, 36 insertions, 22 deletions
diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index 5cb0ae0fc51..1b27a10b311 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -64,6 +64,10 @@ impl HTMLOptionElement { self.selectedness.set(selected); } + pub fn set_dirtiness(&self, dirtiness: bool) { + self.dirtiness.set(dirtiness); + } + fn pick_if_selected_and_reset(&self) { if let Some(select) = self.upcast::<Node>().ancestors() .filter_map(Root::downcast::<HTMLSelectElement>) 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 { diff --git a/components/script/dom/webidls/HTMLSelectElement.webidl b/components/script/dom/webidls/HTMLSelectElement.webidl index 027eea6362c..a8fd2803c44 100644 --- a/components/script/dom/webidls/HTMLSelectElement.webidl +++ b/components/script/dom/webidls/HTMLSelectElement.webidl @@ -26,7 +26,7 @@ interface HTMLSelectElement : HTMLElement { //readonly attribute HTMLCollection selectedOptions; // attribute long selectedIndex; - // attribute DOMString value; + attribute DOMString value; //readonly attribute boolean willValidate; readonly attribute ValidityState validity; diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index 878dc8d26b0..98ace57ae68 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -3711,9 +3711,6 @@ [HTMLSelectElement interface: attribute selectedIndex] expected: FAIL - [HTMLSelectElement interface: attribute value] - expected: FAIL - [HTMLSelectElement interface: attribute willValidate] expected: FAIL @@ -3744,9 +3741,6 @@ [HTMLSelectElement interface: document.createElement("select") must inherit property "selectedIndex" with the proper type (18)] expected: FAIL - [HTMLSelectElement interface: document.createElement("select") must inherit property "value" with the proper type (19)] - expected: FAIL - [HTMLSelectElement interface: document.createElement("select") must inherit property "willValidate" with the proper type (20)] expected: FAIL diff --git a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini b/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini index 4ea1f777183..76dbb504708 100644 --- a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini +++ b/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini @@ -1,20 +1,5 @@ [htmloptionscollection.html] type: testharness - [Setting length to longer value] - expected: FAIL - - [Insert <p><option>6</option></p> into <select>] - expected: FAIL - - [Insert <select><option>6</option></select> into <select>] - expected: FAIL - - [Insert <optgroup><option>6</option></optgroup> into <select>] - expected: FAIL - - [Insert <optgroup><optgroup><option>6</option></optgroup></optgroup> into <select>] - expected: FAIL - [HTMLOptionsCollection.add method insert HTMLOptionElement Option element] expected: FAIL |