aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-10-17 02:47:48 -0500
committerGitHub <noreply@github.com>2016-10-17 02:47:48 -0500
commita71b1e65be0ce40ebc78cf9ec248e7ff41d179ce (patch)
treecb7617241aded029019657c21da05541a3ff88ef
parentd80bf2ada73295bc91a267d0f8f7c4a5ffb1a03f (diff)
parenta3d4d336b753ee66d574286e3595cafdfcfc8eb9 (diff)
downloadservo-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 -->
-rw-r--r--components/script/dom/htmloptionelement.rs4
-rw-r--r--components/script/dom/htmlselectelement.rs31
-rw-r--r--components/script/dom/webidls/HTMLSelectElement.webidl2
-rw-r--r--tests/wpt/metadata/html/dom/interfaces.html.ini6
-rw-r--r--tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini15
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