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::().ancestors()
.filter_map(Root::downcast::)
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::().Remove()
}
+
+ // https://html.spec.whatwg.org/multipage/#dom-select-value
+ fn Value(&self) -> DOMString {
+ self.upcast::()
+ .traverse_preorder()
+ .filter_map(Root::downcast::)
+ .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::()
+ .traverse_preorder()
+ .filter_map(Root::downcast::);
+ // Reset until we find an