From 6e9e1465bf1b2915215c7c1ab806baae5dbc1695 Mon Sep 17 00:00:00 2001 From: Dongie Agnir Date: Fri, 23 Oct 2015 13:12:06 -1000 Subject: [PATCH] Implement pick_option. --- components/script/dom/htmloptionelement.rs | 3 +++ components/script/dom/htmlselectelement.rs | 30 +++++++++++++++------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index c44b84c4c26b..c88919e968b0 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 d50ba64cc43f..d1f3fc98c7dd 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 {