diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs
index c44b84c4c26..c88919e968b 100644
--- a/components/script/dom/htmloptionelement.rs
+++ b/components/script/dom/htmloptionelement.rs
@@ -141,6 +141,9 @@ impl HTMLOptionElementMethods for HTMLOptionElement {
self.selectedness.set(selected);
if let Some(select) = self.upcast::().ancestors()
.filter_map(Root::downcast::).next() {
+ if selected {
+ select.pick_option(self);
+ }
select.ask_for_reset();
}
}
diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs
index d50ba64cc43..d1f3fc98c7d 100644
--- a/components/script/dom/htmlselectelement.rs
+++ b/components/script/dom/htmlselectelement.rs
@@ -83,18 +83,30 @@ impl HTMLSelectElement {
}
}
- // https://html.spec.whatwg.org/multipage/#concept-select-size
- fn display_size(&self) -> u32 {
- if self.Size() == 0 {
- if self.Multiple() {
- 4
- } else {
- 1
+ pub fn pick_option(&self, picked: &HTMLOptionElement) {
+ if !self.Multiple() {
+ let node = self.upcast::();
+ let picked = picked.upcast();
+ for opt in node.traverse_preorder().filter_map(Root::downcast::) {
+ if opt.upcast::() != picked {
+ opt.set_selectedness(false);
+ }
}
- } else {
- self.Size()
}
}
+
+ // https://html.spec.whatwg.org/multipage/#concept-select-size
+ fn display_size(&self) -> u32 {
+ if self.Size() == 0 {
+ if self.Multiple() {
+ 4
+ } else {
+ 1
+ }
+ } else {
+ self.Size()
+ }
+ }
}
impl HTMLSelectElementMethods for HTMLSelectElement {