aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlfieldsetelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmlfieldsetelement.rs')
-rw-r--r--components/script/dom/htmlfieldsetelement.rs185
1 files changed, 122 insertions, 63 deletions
diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs
index 9fdc65a513c..cefee026751 100644
--- a/components/script/dom/htmlfieldsetelement.rs
+++ b/components/script/dom/htmlfieldsetelement.rs
@@ -1,59 +1,71 @@
/* 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/. */
-
-use dom::attr::Attr;
-use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding;
-use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding::HTMLFieldSetElementMethods;
-use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
-use dom::bindings::js::{MutNullableJS, Root};
-use dom::bindings::str::DOMString;
-use dom::document::Document;
-use dom::element::{AttributeMutation, Element};
-use dom::htmlcollection::{CollectionFilter, HTMLCollection};
-use dom::htmlelement::HTMLElement;
-use dom::htmlformelement::{FormControl, HTMLFormElement};
-use dom::htmllegendelement::HTMLLegendElement;
-use dom::node::{Node, window_from_node};
-use dom::validitystate::ValidityState;
-use dom::virtualmethods::VirtualMethods;
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use crate::dom::attr::Attr;
+use crate::dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding::HTMLFieldSetElementMethods;
+use crate::dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
+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, HTMLCollection};
+use crate::dom::htmlelement::HTMLElement;
+use crate::dom::htmlformelement::{FormControl, HTMLFormElement};
+use crate::dom::htmllegendelement::HTMLLegendElement;
+use crate::dom::node::{window_from_node, Node, ShadowIncluding};
+use crate::dom::validation::Validatable;
+use crate::dom::validitystate::ValidityState;
+use crate::dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct;
-use html5ever_atoms::LocalName;
+use html5ever::{LocalName, Prefix};
use std::default::Default;
-use style::element_state::*;
+use style::element_state::ElementState;
#[dom_struct]
pub struct HTMLFieldSetElement {
htmlelement: HTMLElement,
- form_owner: MutNullableJS<HTMLFormElement>,
+ form_owner: MutNullableDom<HTMLFormElement>,
+ validity_state: MutNullableDom<ValidityState>,
}
impl HTMLFieldSetElement {
- fn new_inherited(local_name: LocalName,
- prefix: Option<DOMString>,
- document: &Document) -> HTMLFieldSetElement {
+ fn new_inherited(
+ local_name: LocalName,
+ prefix: Option<Prefix>,
+ document: &Document,
+ ) -> HTMLFieldSetElement {
HTMLFieldSetElement {
- htmlelement:
- HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
- local_name, prefix, document),
+ htmlelement: HTMLElement::new_inherited_with_state(
+ ElementState::IN_ENABLED_STATE,
+ local_name,
+ prefix,
+ document,
+ ),
form_owner: Default::default(),
+ validity_state: Default::default(),
}
}
#[allow(unrooted_must_root)]
- pub fn new(local_name: LocalName,
- prefix: Option<DOMString>,
- document: &Document) -> Root<HTMLFieldSetElement> {
- Node::reflect_node(box HTMLFieldSetElement::new_inherited(local_name, prefix, document),
- document,
- HTMLFieldSetElementBinding::Wrap)
+ pub fn new(
+ local_name: LocalName,
+ prefix: Option<Prefix>,
+ document: &Document,
+ ) -> DomRoot<HTMLFieldSetElement> {
+ Node::reflect_node(
+ Box::new(HTMLFieldSetElement::new_inherited(
+ local_name, prefix, document,
+ )),
+ document,
+ )
}
}
impl HTMLFieldSetElementMethods for HTMLFieldSetElement {
// https://html.spec.whatwg.org/multipage/#dom-fieldset-elements
- fn Elements(&self) -> Root<HTMLCollection> {
- #[derive(JSTraceable, HeapSizeOf)]
+ fn Elements(&self) -> DomRoot<HTMLCollection> {
+ #[derive(JSTraceable, MallocSizeOf)]
struct ElementsFilter;
impl CollectionFilter for ElementsFilter {
fn filter<'a>(&self, elem: &'a Element, _root: &'a Node) -> bool {
@@ -61,32 +73,62 @@ impl HTMLFieldSetElementMethods for HTMLFieldSetElement {
.map_or(false, HTMLElement::is_listed_element)
}
}
- let filter = box ElementsFilter;
+ let filter = Box::new(ElementsFilter);
let window = window_from_node(self);
HTMLCollection::create(&window, self.upcast(), filter)
}
- // https://html.spec.whatwg.org/multipage/#dom-cva-validity
- fn Validity(&self) -> Root<ValidityState> {
- let window = window_from_node(self);
- ValidityState::new(&window, self.upcast())
- }
-
// https://html.spec.whatwg.org/multipage/#dom-fieldset-disabled
make_bool_getter!(Disabled, "disabled");
// https://html.spec.whatwg.org/multipage/#dom-fieldset-disabled
make_bool_setter!(SetDisabled, "disabled");
+ // https://html.spec.whatwg.org/multipage/#dom-fe-name
+ make_atomic_setter!(SetName, "name");
+
+ // https://html.spec.whatwg.org/multipage/#dom-fe-name
+ make_getter!(Name, "name");
+
// https://html.spec.whatwg.org/multipage/#dom-fae-form
- fn GetForm(&self) -> Option<Root<HTMLFormElement>> {
+ fn GetForm(&self) -> Option<DomRoot<HTMLFormElement>> {
self.form_owner()
}
+
+ // 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<ValidityState> {
+ 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 HTMLFieldSetElement {
- fn super_type(&self) -> Option<&VirtualMethods> {
- Some(self.upcast::<HTMLElement>() as &VirtualMethods)
+ fn super_type(&self) -> Option<&dyn VirtualMethods> {
+ Some(self.upcast::<HTMLElement>() as &dyn VirtualMethods)
}
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
@@ -117,39 +159,40 @@ impl VirtualMethods for HTMLFieldSetElement {
}
});
let fields = children.flat_map(|child| {
- child.traverse_preorder().filter(|descendant| {
- match descendant.type_id() {
- NodeTypeId::Element(
- ElementTypeId::HTMLElement(
- HTMLElementTypeId::HTMLButtonElement)) |
- NodeTypeId::Element(
- ElementTypeId::HTMLElement(
- HTMLElementTypeId::HTMLInputElement)) |
- NodeTypeId::Element(
- ElementTypeId::HTMLElement(
- HTMLElementTypeId::HTMLSelectElement)) |
- NodeTypeId::Element(
- ElementTypeId::HTMLElement(
- HTMLElementTypeId::HTMLTextAreaElement)) => {
- true
- },
+ child
+ .traverse_preorder(ShadowIncluding::No)
+ .filter(|descendant| match descendant.type_id() {
+ NodeTypeId::Element(ElementTypeId::HTMLElement(
+ HTMLElementTypeId::HTMLButtonElement,
+ )) |
+ NodeTypeId::Element(ElementTypeId::HTMLElement(
+ HTMLElementTypeId::HTMLInputElement,
+ )) |
+ NodeTypeId::Element(ElementTypeId::HTMLElement(
+ HTMLElementTypeId::HTMLSelectElement,
+ )) |
+ NodeTypeId::Element(ElementTypeId::HTMLElement(
+ HTMLElementTypeId::HTMLTextAreaElement,
+ )) => true,
_ => false,
- }
- })
+ })
});
if disabled_state {
for field in fields {
let el = field.downcast::<Element>().unwrap();
el.set_disabled_state(true);
el.set_enabled_state(false);
+ el.update_sequentially_focusable_status();
}
} else {
for field in fields {
let el = field.downcast::<Element>().unwrap();
el.check_disabled_attribute();
el.check_ancestors_disabled_state_for_form_control();
+ el.update_sequentially_focusable_status();
}
}
+ el.update_sequentially_focusable_status();
},
&local_name!("form") => {
self.form_attribute_mutated(mutation);
@@ -160,7 +203,7 @@ impl VirtualMethods for HTMLFieldSetElement {
}
impl FormControl for HTMLFieldSetElement {
- fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
+ fn form_owner(&self) -> Option<DomRoot<HTMLFormElement>> {
self.form_owner.get()
}
@@ -172,3 +215,19 @@ impl FormControl for HTMLFieldSetElement {
self.upcast::<Element>()
}
}
+
+impl Validatable for HTMLFieldSetElement {
+ fn as_element(&self) -> &Element {
+ self.upcast()
+ }
+
+ fn validity_state(&self) -> DomRoot<ValidityState> {
+ self.validity_state
+ .or_init(|| ValidityState::new(&window_from_node(self), self.upcast()))
+ }
+
+ fn is_instance_validatable(&self) -> bool {
+ // fieldset is not a submittable element (https://html.spec.whatwg.org/multipage/#category-submit)
+ false
+ }
+}