From 6c518c89b969d1e9a96c3c5b9fe0da6cfc3637d1 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 2 May 2017 11:10:49 +0200 Subject: Upgrade to html5ever 0.16 --- components/script/dom/htmlselectelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 2d4dc4758b6..f59753e60c5 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -31,7 +31,7 @@ use dom::validation::Validatable; use dom::validitystate::{ValidityState, ValidationFlags}; use dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; -use html5ever_atoms::LocalName; +use html5ever::LocalName; use std::default::Default; use std::iter; use style::attr::AttrValue; -- cgit v1.2.3 From 875e422fe67f68bdf57bd3635279e224b0c90996 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Wed, 3 May 2017 10:17:42 -0500 Subject: Changed all prefixes from DOMString to the atomic Prefix from html5ever --- components/script/dom/htmlselectelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 2d4dc4758b6..a9adefc92fb 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -31,7 +31,7 @@ use dom::validation::Validatable; use dom::validitystate::{ValidityState, ValidationFlags}; use dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; -use html5ever_atoms::LocalName; +use html5ever_atoms::{LocalName, Prefix}; use std::default::Default; use std::iter; use style::attr::AttrValue; @@ -69,7 +69,7 @@ static DEFAULT_SELECT_SIZE: u32 = 0; impl HTMLSelectElement { fn new_inherited(local_name: LocalName, - prefix: Option, + prefix: Option, document: &Document) -> HTMLSelectElement { HTMLSelectElement { htmlelement: @@ -82,7 +82,7 @@ impl HTMLSelectElement { #[allow(unrooted_must_root)] pub fn new(local_name: LocalName, - prefix: Option, + prefix: Option, document: &Document) -> Root { Node::reflect_node(box HTMLSelectElement::new_inherited(local_name, prefix, document), document, -- cgit v1.2.3 From c5fe2351124c673d1dc4d59355a03654b4fcc541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20DAVID?= Date: Wed, 23 Aug 2017 14:10:08 +0200 Subject: order derivable traits lists Ignoring : - **generated**.rs - python/tidy/servo_tidy_tests/rust_tidy.rs --- components/script/dom/htmlselectelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 1f4f3c426bf..fd5a864862a 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -37,7 +37,7 @@ use std::iter; use style::attr::AttrValue; use style::element_state::*; -#[derive(JSTraceable, HeapSizeOf)] +#[derive(HeapSizeOf, JSTraceable)] struct OptionsFilter; impl CollectionFilter for OptionsFilter { fn filter<'a>(&self, elem: &'a Element, root: &'a Node) -> bool { -- cgit v1.2.3 From 9cd45353648bb18a432d5d682c835cfe1af7a1ea Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Wed, 13 Sep 2017 20:23:58 -0400 Subject: Implement `size_hint` for more iterators. ``` implement size hint for more iterators because why not we like fast things ``` --- components/script/dom/htmlselectelement.rs | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index fd5a864862a..9db95316297 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -440,4 +440,12 @@ impl Iterator for Choice3 Choice3::Third(ref mut k) => k.next(), } } + + fn size_hint(&self) -> (usize, Option) { + match *self { + Choice3::First(ref i) => i.size_hint(), + Choice3::Second(ref j) => j.size_hint(), + Choice3::Third(ref k) => k.size_hint(), + } + } } -- cgit v1.2.3 From 0e3c54c1911ba2c3bf305ee04f04fcd9bf2fc2fe Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 25 Sep 2017 23:30:24 +0200 Subject: Rename dom::bindings::js to dom::bindings::root --- components/script/dom/htmlselectelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 9db95316297..641a8817814 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -14,7 +14,7 @@ use dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; //use dom::bindings::error::ErrorResult; use dom::bindings::inheritance::Castable; -use dom::bindings::js::{MutNullableJS, Root}; +use dom::bindings::root::{MutNullableJS, Root}; use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{AttributeMutation, Element}; -- cgit v1.2.3 From c52fd0a78041ec22db1c4b391556368cd8b87b02 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 26 Sep 2017 01:21:01 +0200 Subject: Rename MutNullableJS to MutNullableDom --- components/script/dom/htmlselectelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 641a8817814..73238870e48 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -14,7 +14,7 @@ use dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; //use dom::bindings::error::ErrorResult; use dom::bindings::inheritance::Castable; -use dom::bindings::root::{MutNullableJS, Root}; +use dom::bindings::root::{MutNullableDom, Root}; use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{AttributeMutation, Element}; @@ -61,8 +61,8 @@ impl CollectionFilter for OptionsFilter { #[dom_struct] pub struct HTMLSelectElement { htmlelement: HTMLElement, - options: MutNullableJS, - form_owner: MutNullableJS, + options: MutNullableDom, + form_owner: MutNullableDom, } static DEFAULT_SELECT_SIZE: u32 = 0; -- cgit v1.2.3 From f87c2a8d7616112ca924e30292db2d244cf87eec Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 26 Sep 2017 01:53:40 +0200 Subject: Rename Root to DomRoot In a later PR, DomRoot will become a type alias of Root>, where Root will be able to handle all the things that need to be rooted that have a stable traceable address that doesn't move for the whole lifetime of the root. Stay tuned. --- components/script/dom/htmlselectelement.rs | 36 +++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 73238870e48..d9eba4dea72 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -14,7 +14,7 @@ use dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; //use dom::bindings::error::ErrorResult; use dom::bindings::inheritance::Castable; -use dom::bindings::root::{MutNullableDom, Root}; +use dom::bindings::root::{DomRoot, MutNullableDom}; use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{AttributeMutation, Element}; @@ -83,22 +83,22 @@ impl HTMLSelectElement { #[allow(unrooted_must_root)] pub fn new(local_name: LocalName, prefix: Option, - document: &Document) -> Root { + document: &Document) -> DomRoot { Node::reflect_node(box HTMLSelectElement::new_inherited(local_name, prefix, document), document, HTMLSelectElementBinding::Wrap) } // https://html.spec.whatwg.org/multipage/#concept-select-option-list - fn list_of_options(&self) -> impl Iterator> { + fn list_of_options(&self) -> impl Iterator> { self.upcast::() .children() .flat_map(|node| { if node.is::() { - let node = Root::downcast::(node).unwrap(); + let node = DomRoot::downcast::(node).unwrap(); Choice3::First(iter::once(node)) } else if node.is::() { - Choice3::Second(node.children().filter_map(Root::downcast)) + Choice3::Second(node.children().filter_map(DomRoot::downcast)) } else { Choice3::Third(iter::empty()) } @@ -120,17 +120,17 @@ impl HTMLSelectElement { return; } - let mut first_enabled: Option> = None; - let mut last_selected: Option> = None; + let mut first_enabled: Option> = None; + let mut last_selected: Option> = None; for opt in self.list_of_options() { if opt.Selected() { opt.set_selectedness(false); - last_selected = Some(Root::from_ref(&opt)); + last_selected = Some(DomRoot::from_ref(&opt)); } let element = opt.upcast::(); if first_enabled.is_none() && !element.disabled_state() { - first_enabled = Some(Root::from_ref(&opt)); + first_enabled = Some(DomRoot::from_ref(&opt)); } } @@ -189,7 +189,7 @@ impl HTMLSelectElement { impl HTMLSelectElementMethods for HTMLSelectElement { // https://html.spec.whatwg.org/multipage/#dom-cva-validity - fn Validity(&self) -> Root { + fn Validity(&self) -> DomRoot { let window = window_from_node(self); ValidityState::new(&window, self.upcast()) } @@ -206,7 +206,7 @@ impl HTMLSelectElementMethods for HTMLSelectElement { make_bool_setter!(SetDisabled, "disabled"); // https://html.spec.whatwg.org/multipage/#dom-fae-form - fn GetForm(&self) -> Option> { + fn GetForm(&self) -> Option> { self.form_owner() } @@ -238,12 +238,12 @@ impl HTMLSelectElementMethods for HTMLSelectElement { } // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> Root { + fn Labels(&self) -> DomRoot { self.upcast::().labels() } // https://html.spec.whatwg.org/multipage/#dom-select-options - fn Options(&self) -> Root { + fn Options(&self) -> DomRoot { self.options.or_init(|| { let window = window_from_node(self); HTMLOptionsCollection::new( @@ -262,18 +262,18 @@ impl HTMLSelectElementMethods for HTMLSelectElement { } // https://html.spec.whatwg.org/multipage/#dom-select-item - fn Item(&self, index: u32) -> Option> { + fn Item(&self, index: u32) -> Option> { self.Options().upcast().Item(index) } // https://html.spec.whatwg.org/multipage/#dom-select-item - fn IndexedGetter(&self, index: u32) -> Option> { + fn IndexedGetter(&self, index: u32) -> Option> { self.Options().IndexedGetter(index) } // https://html.spec.whatwg.org/multipage/#dom-select-nameditem - fn NamedItem(&self, name: DOMString) -> Option> { - self.Options().NamedGetter(name).map_or(None, |e| Root::downcast::(e)) + fn NamedItem(&self, name: DOMString) -> Option> { + self.Options().NamedGetter(name).map_or(None, |e| DomRoot::downcast::(e)) } // https://html.spec.whatwg.org/multipage/#dom-select-remove @@ -398,7 +398,7 @@ impl VirtualMethods for HTMLSelectElement { } impl FormControl for HTMLSelectElement { - fn form_owner(&self) -> Option> { + fn form_owner(&self) -> Option> { self.form_owner.get() } -- cgit v1.2.3 From aa15dc269f41503d81ad44cd7e85d69e6f4aeac7 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 16 Oct 2017 14:35:30 +0200 Subject: Remove use of unstable box syntax. http://www.robohornet.org gives a score of 101.36 on master, and 102.68 with this PR. The latter is slightly better, but probably within noise level. So it looks like this PR does not affect DOM performance. This is expected since `Box::new` is defined as: ```rust impl Box { #[inline(always)] pub fn new(x: T) -> Box { box x } } ``` With inlining, it should compile to the same as box syntax. --- components/script/dom/htmlselectelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index d9eba4dea72..75dea8d461e 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -84,7 +84,7 @@ impl HTMLSelectElement { pub fn new(local_name: LocalName, prefix: Option, document: &Document) -> DomRoot { - Node::reflect_node(box HTMLSelectElement::new_inherited(local_name, prefix, document), + Node::reflect_node(Box::new(HTMLSelectElement::new_inherited(local_name, prefix, document)), document, HTMLSelectElementBinding::Wrap) } @@ -247,7 +247,7 @@ impl HTMLSelectElementMethods for HTMLSelectElement { self.options.or_init(|| { let window = window_from_node(self); HTMLOptionsCollection::new( - &window, self, box OptionsFilter) + &window, self, Box::new(OptionsFilter)) }) } -- cgit v1.2.3 From 4506f0d30cbbb02df32e9c16135ef288ad6b7e2e Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Wed, 18 Oct 2017 10:42:01 +1100 Subject: Replace all uses of the `heapsize` crate with `malloc_size_of`. Servo currently uses `heapsize`, but Stylo/Gecko use `malloc_size_of`. `malloc_size_of` is better -- it handles various cases that `heapsize` does not -- so this patch changes Servo to use `malloc_size_of`. This patch makes the following changes to the `malloc_size_of` crate. - Adds `MallocSizeOf` trait implementations for numerous types, some built-in (e.g. `VecDeque`), some external and Servo-only (e.g. `string_cache`). - Makes `enclosing_size_of_op` optional, because vanilla jemalloc doesn't support that operation. - For `HashSet`/`HashMap`, falls back to a computed estimate when `enclosing_size_of_op` isn't available. - Adds an extern "C" `malloc_size_of` function that does the actual heap measurement; this is based on the same functions from the `heapsize` crate. This patch makes the following changes elsewhere. - Converts all the uses of `heapsize` to instead use `malloc_size_of`. - Disables the "heapsize"/"heap_size" feature for the external crates that provide it. - Removes the `HeapSizeOf` implementation from `hashglobe`. - Adds `ignore` annotations to a few `Rc`/`Arc`, because `malloc_size_of` doesn't derive those types, unlike `heapsize`. --- components/script/dom/htmlselectelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 75dea8d461e..3423db303e4 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -37,7 +37,7 @@ use std::iter; use style::attr::AttrValue; use style::element_state::*; -#[derive(HeapSizeOf, JSTraceable)] +#[derive(JSTraceable, MallocSizeOf)] struct OptionsFilter; impl CollectionFilter for OptionsFilter { fn filter<'a>(&self, elem: &'a Element, root: &'a Node) -> bool { -- cgit v1.2.3 From e8e2d0a4b24475b018dbc7e59ea46fdceaf20815 Mon Sep 17 00:00:00 2001 From: Bastien Orivel Date: Mon, 9 Oct 2017 17:03:40 +0200 Subject: Update bitflags to 1.0 in every servo crate It still needs dependencies update to remove all the other bitflags versions. --- components/script/dom/htmlselectelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 3423db303e4..401d29c6cb8 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -35,7 +35,7 @@ use html5ever::{LocalName, Prefix}; use std::default::Default; use std::iter; use style::attr::AttrValue; -use style::element_state::*; +use style::element_state::ElementState; #[derive(JSTraceable, MallocSizeOf)] struct OptionsFilter; @@ -73,7 +73,7 @@ impl HTMLSelectElement { document: &Document) -> HTMLSelectElement { HTMLSelectElement { htmlelement: - HTMLElement::new_inherited_with_state(IN_ENABLED_STATE, + HTMLElement::new_inherited_with_state(ElementState::IN_ENABLED_STATE, local_name, prefix, document), options: Default::default(), form_owner: Default::default(), -- cgit v1.2.3 From 11c64178d86979e8d50f11cff66c2b0e8fe666c1 Mon Sep 17 00:00:00 2001 From: Gecko Backout Date: Thu, 19 Oct 2017 21:26:51 +0000 Subject: Backed out changeset e64e659c077d: servo PR #18809 and revendor for reftest failures, e.g. in layout/reftests/bugs/392435-1.html. r=backout on a CLOSED TREE Backs out https://github.com/servo/servo/pull/18809 --- components/script/dom/htmlselectelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 401d29c6cb8..3423db303e4 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -35,7 +35,7 @@ use html5ever::{LocalName, Prefix}; use std::default::Default; use std::iter; use style::attr::AttrValue; -use style::element_state::ElementState; +use style::element_state::*; #[derive(JSTraceable, MallocSizeOf)] struct OptionsFilter; @@ -73,7 +73,7 @@ impl HTMLSelectElement { document: &Document) -> HTMLSelectElement { HTMLSelectElement { htmlelement: - HTMLElement::new_inherited_with_state(ElementState::IN_ENABLED_STATE, + HTMLElement::new_inherited_with_state(IN_ENABLED_STATE, local_name, prefix, document), options: Default::default(), form_owner: Default::default(), -- cgit v1.2.3 From 29b4eec14187c96a1518af6a954bd00194375382 Mon Sep 17 00:00:00 2001 From: Bastien Orivel Date: Mon, 30 Oct 2017 12:15:30 +0100 Subject: Bump bitflags to 1.0 in every servo crate --- components/script/dom/htmlselectelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 3423db303e4..401d29c6cb8 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -35,7 +35,7 @@ use html5ever::{LocalName, Prefix}; use std::default::Default; use std::iter; use style::attr::AttrValue; -use style::element_state::*; +use style::element_state::ElementState; #[derive(JSTraceable, MallocSizeOf)] struct OptionsFilter; @@ -73,7 +73,7 @@ impl HTMLSelectElement { document: &Document) -> HTMLSelectElement { HTMLSelectElement { htmlelement: - HTMLElement::new_inherited_with_state(IN_ENABLED_STATE, + HTMLElement::new_inherited_with_state(ElementState::IN_ENABLED_STATE, local_name, prefix, document), options: Default::default(), form_owner: Default::default(), -- cgit v1.2.3 From c37a345dc9f4dda6ea29c42f96f6c7201c42cbac Mon Sep 17 00:00:00 2001 From: chansuke Date: Tue, 18 Sep 2018 23:24:15 +0900 Subject: Format script component --- components/script/dom/htmlselectelement.rs | 121 +++++++++++++++++------------ 1 file changed, 72 insertions(+), 49 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 401d29c6cb8..4fec663a356 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -51,8 +51,7 @@ impl CollectionFilter for OptionsFilter { } match node.GetParentNode() { - Some(optgroup) => - optgroup.is::() && root.is_parent_of(&optgroup), + Some(optgroup) => optgroup.is::() && root.is_parent_of(&optgroup), None => false, } } @@ -68,41 +67,50 @@ pub struct HTMLSelectElement { static DEFAULT_SELECT_SIZE: u32 = 0; impl HTMLSelectElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLSelectElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLSelectElement { HTMLSelectElement { - htmlelement: - HTMLElement::new_inherited_with_state(ElementState::IN_ENABLED_STATE, - local_name, prefix, document), - options: Default::default(), - form_owner: Default::default(), + htmlelement: HTMLElement::new_inherited_with_state( + ElementState::IN_ENABLED_STATE, + local_name, + prefix, + document, + ), + options: Default::default(), + form_owner: Default::default(), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLSelectElement::new_inherited(local_name, prefix, document)), - document, - HTMLSelectElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLSelectElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLSelectElementBinding::Wrap, + ) } // https://html.spec.whatwg.org/multipage/#concept-select-option-list - fn list_of_options(&self) -> impl Iterator> { - self.upcast::() - .children() - .flat_map(|node| { - if node.is::() { - let node = DomRoot::downcast::(node).unwrap(); - Choice3::First(iter::once(node)) - } else if node.is::() { - Choice3::Second(node.children().filter_map(DomRoot::downcast)) - } else { - Choice3::Third(iter::empty()) - } - }) + fn list_of_options(&self) -> impl Iterator> { + self.upcast::().children().flat_map(|node| { + if node.is::() { + let node = DomRoot::downcast::(node).unwrap(); + Choice3::First(iter::once(node)) + } else if node.is::() { + Choice3::Second(node.children().filter_map(DomRoot::downcast)) + } else { + Choice3::Third(iter::empty()) + } + }) } // https://html.spec.whatwg.org/multipage/#the-select-element:concept-form-reset-control @@ -155,7 +163,7 @@ impl HTMLSelectElement { data_set.push(FormDatum { ty: self.Type(), name: self.Name(), - value: FormDatumValue::String(opt.Value()) + value: FormDatumValue::String(opt.Value()), }); } } @@ -175,16 +183,16 @@ 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 - } - } else { - self.Size() - } - } + if self.Size() == 0 { + if self.Multiple() { + 4 + } else { + 1 + } + } else { + self.Size() + } + } } impl HTMLSelectElementMethods for HTMLSelectElement { @@ -196,7 +204,11 @@ impl HTMLSelectElementMethods for HTMLSelectElement { // Note: this function currently only exists for union.html. // https://html.spec.whatwg.org/multipage/#dom-select-add - fn Add(&self, _element: HTMLOptionElementOrHTMLOptGroupElement, _before: Option) { + fn Add( + &self, + _element: HTMLOptionElementOrHTMLOptGroupElement, + _before: Option, + ) { } // https://html.spec.whatwg.org/multipage/#dom-fe-disabled @@ -246,8 +258,7 @@ impl HTMLSelectElementMethods for HTMLSelectElement { fn Options(&self) -> DomRoot { self.options.or_init(|| { let window = window_from_node(self); - HTMLOptionsCollection::new( - &window, self, Box::new(OptionsFilter)) + HTMLOptionsCollection::new(&window, self, Box::new(OptionsFilter)) }) } @@ -273,7 +284,9 @@ impl HTMLSelectElementMethods for HTMLSelectElement { // https://html.spec.whatwg.org/multipage/#dom-select-nameditem fn NamedItem(&self, name: DOMString) -> Option> { - self.Options().NamedGetter(name).map_or(None, |e| DomRoot::downcast::(e)) + self.Options() + .NamedGetter(name) + .map_or(None, |e| DomRoot::downcast::(e)) } // https://html.spec.whatwg.org/multipage/#dom-select-remove @@ -359,7 +372,7 @@ impl VirtualMethods for HTMLSelectElement { el.set_disabled_state(false); el.set_enabled_state(true); el.check_ancestors_disabled_state_for_form_control(); - } + }, } }, &local_name!("form") => { @@ -374,7 +387,8 @@ impl VirtualMethods for HTMLSelectElement { s.bind_to_tree(tree_in_doc); } - self.upcast::().check_ancestors_disabled_state_for_form_control(); + self.upcast::() + .check_ancestors_disabled_state_for_form_control(); } fn unbind_from_tree(&self, context: &UnbindContext) { @@ -382,7 +396,10 @@ impl VirtualMethods for HTMLSelectElement { let node = self.upcast::(); let el = self.upcast::(); - if node.ancestors().any(|ancestor| ancestor.is::()) { + if node + .ancestors() + .any(|ancestor| ancestor.is::()) + { el.check_ancestors_disabled_state_for_form_control(); } else { el.check_disabled_attribute(); @@ -392,7 +409,10 @@ impl VirtualMethods for HTMLSelectElement { fn parse_plain_attribute(&self, local_name: &LocalName, value: DOMString) -> AttrValue { match *local_name { local_name!("size") => AttrValue::from_u32(value.into(), DEFAULT_SELECT_SIZE), - _ => self.super_type().unwrap().parse_plain_attribute(local_name, value), + _ => self + .super_type() + .unwrap() + .parse_plain_attribute(local_name, value), } } } @@ -429,7 +449,10 @@ enum Choice3 { } impl Iterator for Choice3 - where I: Iterator, J: Iterator, K: Iterator +where + I: Iterator, + J: Iterator, + K: Iterator, { type Item = T; -- cgit v1.2.3 From 45f7199eee82c66637ec68287eafa40a651001c4 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 1 Nov 2018 23:45:06 +0100 Subject: `cargo fix --edition` --- components/script/dom/htmlselectelement.rs | 54 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 4fec663a356..31a1a150d81 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -2,34 +2,34 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::attr::Attr; -use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; -use dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods; -use dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods; -use dom::bindings::codegen::Bindings::HTMLOptionsCollectionBinding::HTMLOptionsCollectionMethods; -use dom::bindings::codegen::Bindings::HTMLSelectElementBinding; -use dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelectElementMethods; -use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::codegen::UnionTypes::HTMLElementOrLong; -use dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; +use crate::dom::attr::Attr; +use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; +use crate::dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods; +use crate::dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods; +use crate::dom::bindings::codegen::Bindings::HTMLOptionsCollectionBinding::HTMLOptionsCollectionMethods; +use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding; +use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelectElementMethods; +use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use crate::dom::bindings::codegen::UnionTypes::HTMLElementOrLong; +use crate::dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; //use dom::bindings::error::ErrorResult; -use dom::bindings::inheritance::Castable; -use dom::bindings::root::{DomRoot, MutNullableDom}; -use dom::bindings::str::DOMString; -use dom::document::Document; -use dom::element::{AttributeMutation, Element}; -use dom::htmlcollection::CollectionFilter; -use dom::htmlelement::HTMLElement; -use dom::htmlfieldsetelement::HTMLFieldSetElement; -use dom::htmlformelement::{FormDatumValue, FormControl, FormDatum, HTMLFormElement}; -use dom::htmloptgroupelement::HTMLOptGroupElement; -use dom::htmloptionelement::HTMLOptionElement; -use dom::htmloptionscollection::HTMLOptionsCollection; -use dom::node::{Node, UnbindContext, window_from_node}; -use dom::nodelist::NodeList; -use dom::validation::Validatable; -use dom::validitystate::{ValidityState, ValidationFlags}; -use dom::virtualmethods::VirtualMethods; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::root::{DomRoot, MutNullableDom}; +use crate::dom::bindings::str::DOMString; +use crate::dom::document::Document; +use crate::dom::element::{AttributeMutation, Element}; +use crate::dom::htmlcollection::CollectionFilter; +use crate::dom::htmlelement::HTMLElement; +use crate::dom::htmlfieldsetelement::HTMLFieldSetElement; +use crate::dom::htmlformelement::{FormDatumValue, FormControl, FormDatum, HTMLFormElement}; +use crate::dom::htmloptgroupelement::HTMLOptGroupElement; +use crate::dom::htmloptionelement::HTMLOptionElement; +use crate::dom::htmloptionscollection::HTMLOptionsCollection; +use crate::dom::node::{Node, UnbindContext, window_from_node}; +use crate::dom::nodelist::NodeList; +use crate::dom::validation::Validatable; +use crate::dom::validitystate::{ValidityState, ValidationFlags}; +use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; use std::default::Default; -- cgit v1.2.3 From 9e92eb205a2a12fe0be883e42cb7f82deebc9031 Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Tue, 6 Nov 2018 20:38:02 +0100 Subject: Reorder imports --- components/script/dom/htmlselectelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 31a1a150d81..aa8abc4feb2 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -21,14 +21,14 @@ use crate::dom::element::{AttributeMutation, Element}; use crate::dom::htmlcollection::CollectionFilter; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlfieldsetelement::HTMLFieldSetElement; -use crate::dom::htmlformelement::{FormDatumValue, FormControl, FormDatum, HTMLFormElement}; +use crate::dom::htmlformelement::{FormControl, FormDatum, FormDatumValue, HTMLFormElement}; use crate::dom::htmloptgroupelement::HTMLOptGroupElement; use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::htmloptionscollection::HTMLOptionsCollection; -use crate::dom::node::{Node, UnbindContext, window_from_node}; +use crate::dom::node::{window_from_node, Node, UnbindContext}; use crate::dom::nodelist::NodeList; use crate::dom::validation::Validatable; -use crate::dom::validitystate::{ValidityState, ValidationFlags}; +use crate::dom::validitystate::{ValidationFlags, ValidityState}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; -- cgit v1.2.3 From 2012be4a8bd97f2fd69f986c8fffb1af1eec21dc Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 1 Nov 2018 21:43:04 +0100 Subject: `cargo fix --edition-idioms` --- components/script/dom/htmlselectelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index aa8abc4feb2..c91b483e2d8 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -354,8 +354,8 @@ impl HTMLSelectElementMethods for HTMLSelectElement { } impl VirtualMethods for HTMLSelectElement { - fn super_type(&self) -> Option<&VirtualMethods> { - Some(self.upcast::() as &VirtualMethods) + fn super_type(&self) -> Option<&dyn VirtualMethods> { + Some(self.upcast::() as &dyn VirtualMethods) } fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { -- cgit v1.2.3 From a1a14459c141afc6ac6771b8a6c9ca374537edf2 Mon Sep 17 00:00:00 2001 From: Jan Andre Ikenmeyer Date: Mon, 19 Nov 2018 14:47:12 +0100 Subject: Update MPL license to https (part 3) --- components/script/dom/htmlselectelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index c91b483e2d8..50d88710161 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -1,6 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::attr::Attr; use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; -- cgit v1.2.3 From 441357b74e38b604a60206ff38e5cf3719a15e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Sun, 27 Jan 2019 17:11:11 +0100 Subject: Add is_connected flag to node and use it to replace most uses of is_in_doc --- components/script/dom/htmlselectelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 50d88710161..4bcdcc85160 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -382,9 +382,9 @@ impl VirtualMethods for HTMLSelectElement { } } - fn bind_to_tree(&self, tree_in_doc: bool) { + fn bind_to_tree(&self, tree_connected: bool) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_in_doc); + s.bind_to_tree(tree_connected); } self.upcast::() -- cgit v1.2.3 From 813b242419d41505641b433c3b38b0d0542c559d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Tue, 5 Mar 2019 18:01:59 +0100 Subject: Introduce BindContext with in_doc and connected flags Fix some is_in_doc -> is_connected mistakes --- components/script/dom/htmlselectelement.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 4bcdcc85160..c71a5442e73 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -12,7 +12,6 @@ use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelec use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use crate::dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; -//use dom::bindings::error::ErrorResult; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; @@ -25,7 +24,7 @@ use crate::dom::htmlformelement::{FormControl, FormDatum, FormDatumValue, HTMLFo use crate::dom::htmloptgroupelement::HTMLOptGroupElement; use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::htmloptionscollection::HTMLOptionsCollection; -use crate::dom::node::{window_from_node, Node, UnbindContext}; +use crate::dom::node::{window_from_node, BindContext, Node, UnbindContext}; use crate::dom::nodelist::NodeList; use crate::dom::validation::Validatable; use crate::dom::validitystate::{ValidationFlags, ValidityState}; @@ -382,9 +381,9 @@ impl VirtualMethods for HTMLSelectElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } self.upcast::() -- cgit v1.2.3 From 036e8dabe2d38e21348766d1a5cda99381b015f8 Mon Sep 17 00:00:00 2001 From: Patrick Shaughnessy Date: Thu, 2 Jan 2020 15:44:29 -0500 Subject: Labels are a live list in tree order --- components/script/dom/htmlselectelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index c71a5442e73..0ef500ccb1a 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -61,6 +61,7 @@ pub struct HTMLSelectElement { htmlelement: HTMLElement, options: MutNullableDom, form_owner: MutNullableDom, + labels_node_list: MutNullableDom, } static DEFAULT_SELECT_SIZE: u32 = 0; @@ -80,6 +81,7 @@ impl HTMLSelectElement { ), options: Default::default(), form_owner: Default::default(), + labels_node_list: Default::default(), } } @@ -249,9 +251,7 @@ impl HTMLSelectElementMethods for HTMLSelectElement { } // https://html.spec.whatwg.org/multipage/#dom-lfe-labels - fn Labels(&self) -> DomRoot { - self.upcast::().labels() - } + make_labels_getter!(Labels, labels_node_list); // https://html.spec.whatwg.org/multipage/#dom-select-options fn Options(&self) -> DomRoot { -- cgit v1.2.3 From c1b71fcc4d842aa1df38d6ed36b73dc331508703 Mon Sep 17 00:00:00 2001 From: Patrick Shaughnessy Date: Mon, 6 Jan 2020 20:14:36 -0500 Subject: Implement HTMLSelectElement.add() and indexed setter, fix test that was relying on add to be a stub --- components/script/dom/htmlselectelement.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 0ef500ccb1a..f6330b9b65a 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -12,6 +12,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelec use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use crate::dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; +use crate::dom::bindings::error::ErrorResult; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; @@ -203,13 +204,13 @@ impl HTMLSelectElementMethods for HTMLSelectElement { ValidityState::new(&window, self.upcast()) } - // Note: this function currently only exists for union.html. // https://html.spec.whatwg.org/multipage/#dom-select-add fn Add( &self, - _element: HTMLOptionElementOrHTMLOptGroupElement, - _before: Option, - ) { + element: HTMLOptionElementOrHTMLOptGroupElement, + before: Option, + ) -> ErrorResult { + self.Options().Add(element, before) } // https://html.spec.whatwg.org/multipage/#dom-fe-disabled @@ -281,6 +282,11 @@ impl HTMLSelectElementMethods for HTMLSelectElement { self.Options().IndexedGetter(index) } + // https://html.spec.whatwg.org/multipage/#dom-select-setter + fn IndexedSetter(&self, index: u32, value: Option<&HTMLOptionElement>) -> ErrorResult { + self.Options().IndexedSetter(index, value) + } + // https://html.spec.whatwg.org/multipage/#dom-select-nameditem fn NamedItem(&self, name: DOMString) -> Option> { self.Options() -- cgit v1.2.3 From 767ccbe5689ceec231dc51a657a9d5a2e1c418d3 Mon Sep 17 00:00:00 2001 From: Patrick Shaughnessy Date: Wed, 1 Jan 2020 17:00:39 -0500 Subject: HTMLOptionElement.index --- components/script/dom/htmlselectelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index f6330b9b65a..bef4bfff8b4 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -102,7 +102,7 @@ impl HTMLSelectElement { } // https://html.spec.whatwg.org/multipage/#concept-select-option-list - fn list_of_options(&self) -> impl Iterator> { + pub fn list_of_options(&self) -> impl Iterator> { self.upcast::().children().flat_map(|node| { if node.is::() { let node = DomRoot::downcast::(node).unwrap(); -- cgit v1.2.3 From f29e22f131291ed1bcd581cb9be6807c66c1534e Mon Sep 17 00:00:00 2001 From: Patrick Shaughnessy Date: Tue, 21 Jan 2020 11:06:31 -0500 Subject: Names should now be consistently atoms --- components/script/dom/htmlselectelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index bef4bfff8b4..78a26ca4311 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -234,7 +234,7 @@ impl HTMLSelectElementMethods for HTMLSelectElement { make_getter!(Name, "name"); // https://html.spec.whatwg.org/multipage/#dom-fe-name - make_setter!(SetName, "name"); + make_atomic_setter!(SetName, "name"); // https://html.spec.whatwg.org/multipage/#dom-select-size make_uint_getter!(Size, "size", DEFAULT_SELECT_SIZE); -- cgit v1.2.3 From 3ea6d87bcc37167464e856949a4b9b77d0e9318a Mon Sep 17 00:00:00 2001 From: YUAN LYU Date: Fri, 20 Mar 2020 22:14:18 -0400 Subject: Add trait DomObjectWrap to provide WRAP function --- components/script/dom/htmlselectelement.rs | 2 -- 1 file changed, 2 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 78a26ca4311..97474969ab2 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -7,7 +7,6 @@ use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use crate::dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods; use crate::dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods; use crate::dom::bindings::codegen::Bindings::HTMLOptionsCollectionBinding::HTMLOptionsCollectionMethods; -use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding; use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelectElementMethods; use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::UnionTypes::HTMLElementOrLong; @@ -97,7 +96,6 @@ impl HTMLSelectElement { local_name, prefix, document, )), document, - HTMLSelectElementBinding::Wrap, ) } -- cgit v1.2.3 From 779552ee7ddbbde1055c7202e16b9a13c3961988 Mon Sep 17 00:00:00 2001 From: teapotd Date: Wed, 1 Apr 2020 11:08:02 +0200 Subject: Form constraints validation --- components/script/dom/htmlselectelement.rs | 93 +++++++++++++++++++++++++----- 1 file changed, 80 insertions(+), 13 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 97474969ab2..caca2fddfc2 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -26,7 +26,7 @@ use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::htmloptionscollection::HTMLOptionsCollection; use crate::dom::node::{window_from_node, BindContext, Node, UnbindContext}; use crate::dom::nodelist::NodeList; -use crate::dom::validation::Validatable; +use crate::dom::validation::{is_barred_by_datalist_ancestor, Validatable}; use crate::dom::validitystate::{ValidationFlags, ValidityState}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; @@ -62,6 +62,7 @@ pub struct HTMLSelectElement { options: MutNullableDom, form_owner: MutNullableDom, labels_node_list: MutNullableDom, + validity_state: MutNullableDom, } static DEFAULT_SELECT_SIZE: u32 = 0; @@ -82,6 +83,7 @@ impl HTMLSelectElement { options: Default::default(), form_owner: Default::default(), labels_node_list: Default::default(), + validity_state: Default::default(), } } @@ -113,6 +115,18 @@ impl HTMLSelectElement { }) } + // https://html.spec.whatwg.org/multipage/#placeholder-label-option + fn get_placeholder_label_option(&self) -> Option> { + if self.Required() && !self.Multiple() && self.display_size() == 1 { + self.list_of_options().next().filter(|node| { + let parent = node.upcast::().GetParentNode(); + node.Value().is_empty() && parent.as_deref() == Some(self.upcast()) + }) + } else { + None + } + } + // https://html.spec.whatwg.org/multipage/#the-select-element:concept-form-reset-control pub fn reset(&self) { for opt in self.list_of_options() { @@ -196,12 +210,6 @@ impl HTMLSelectElement { } impl HTMLSelectElementMethods for HTMLSelectElement { - // https://html.spec.whatwg.org/multipage/#dom-cva-validity - fn Validity(&self) -> DomRoot { - let window = window_from_node(self); - ValidityState::new(&window, self.upcast()) - } - // https://html.spec.whatwg.org/multipage/#dom-select-add fn Add( &self, @@ -234,6 +242,12 @@ impl HTMLSelectElementMethods for HTMLSelectElement { // https://html.spec.whatwg.org/multipage/#dom-fe-name make_atomic_setter!(SetName, "name"); + // https://html.spec.whatwg.org/multipage/#dom-select-required + make_bool_getter!(Required, "required"); + + // https://html.spec.whatwg.org/multipage/#dom-select-required + make_bool_setter!(SetRequired, "required"); + // https://html.spec.whatwg.org/multipage/#dom-select-size make_uint_getter!(Size, "size", DEFAULT_SELECT_SIZE); @@ -354,6 +368,36 @@ impl HTMLSelectElementMethods for HTMLSelectElement { } } } + + // https://html.spec.whatwg.org/multipage/#dom-cva-willvalidate + fn WillValidate(&self) -> bool { + self.is_instance_validatable() + } + + // https://html.spec.whatwg.org/multipage/#dom-cva-validity + fn Validity(&self) -> DomRoot { + self.validity_state() + } + + // https://html.spec.whatwg.org/multipage/#dom-cva-checkvalidity + fn CheckValidity(&self) -> bool { + self.check_validity() + } + + // https://html.spec.whatwg.org/multipage/#dom-cva-reportvalidity + fn ReportValidity(&self) -> bool { + self.report_validity() + } + + // https://html.spec.whatwg.org/multipage/#dom-cva-validationmessage + fn ValidationMessage(&self) -> DOMString { + self.validation_message() + } + + // https://html.spec.whatwg.org/multipage/#dom-cva-setcustomvalidity + fn SetCustomValidity(&self, error: DOMString) { + self.validity_state().set_custom_error_message(error); + } } impl VirtualMethods for HTMLSelectElement { @@ -435,13 +479,36 @@ impl FormControl for HTMLSelectElement { } impl Validatable for HTMLSelectElement { - fn is_instance_validatable(&self) -> bool { - true + fn as_element(&self) -> &Element { + self.upcast() + } + + fn validity_state(&self) -> DomRoot { + self.validity_state + .or_init(|| ValidityState::new(&window_from_node(self), self.upcast())) } - fn validate(&self, validate_flags: ValidationFlags) -> bool { - if validate_flags.is_empty() {} - // Need more flag check for different validation types later - true + + fn is_instance_validatable(&self) -> bool { + // https://html.spec.whatwg.org/multipage/#enabling-and-disabling-form-controls%3A-the-disabled-attribute%3Abarred-from-constraint-validation + // https://html.spec.whatwg.org/multipage/#the-datalist-element%3Abarred-from-constraint-validation + !self.upcast::().disabled_state() && !is_barred_by_datalist_ancestor(self.upcast()) + } + + fn perform_validation(&self, validate_flags: ValidationFlags) -> ValidationFlags { + let mut failed_flags = ValidationFlags::empty(); + + // https://html.spec.whatwg.org/multipage/#suffering-from-being-missing + // https://html.spec.whatwg.org/multipage/#the-select-element%3Asuffering-from-being-missing + if validate_flags.contains(ValidationFlags::VALUE_MISSING) && self.Required() { + let placeholder = self.get_placeholder_label_option(); + let selected_option = self + .list_of_options() + .filter(|e| e.Selected() && placeholder.as_ref() != Some(e)) + .next(); + failed_flags.set(ValidationFlags::VALUE_MISSING, selected_option.is_none()); + } + + failed_flags } } -- cgit v1.2.3 From 1b2464b4b686019211248ea7f4b51aa360b808b2 Mon Sep 17 00:00:00 2001 From: Bastien Orivel Date: Sun, 3 May 2020 15:12:58 +0200 Subject: Add a fast path in Element::SetInnerHTML when the value is small and trivial text Inspired from gecko which has a similar fast path. This makes innerHTML more than 10 times faster for this case. Fixes #25892 --- components/script/dom/htmlselectelement.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlselectelement.rs') diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index caca2fddfc2..9d36413e4b5 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -93,12 +93,15 @@ impl HTMLSelectElement { prefix: Option, document: &Document, ) -> DomRoot { - Node::reflect_node( + let n = Node::reflect_node( Box::new(HTMLSelectElement::new_inherited( local_name, prefix, document, )), document, - ) + ); + + n.upcast::().set_weird_parser_insertion_mode(); + n } // https://html.spec.whatwg.org/multipage/#concept-select-option-list -- cgit v1.2.3