script/dom/html/
htmllegendelement.rs1use dom_struct::dom_struct;
6use html5ever::{LocalName, Prefix};
7use js::context::JSContext;
8use js::rust::HandleObject;
9
10use crate::dom::bindings::codegen::Bindings::HTMLLegendElementBinding::HTMLLegendElementMethods;
11use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
12use crate::dom::bindings::inheritance::Castable;
13use crate::dom::bindings::root::{DomRoot, MutNullableDom};
14use crate::dom::document::Document;
15use crate::dom::element::Element;
16use crate::dom::html::htmlelement::HTMLElement;
17use crate::dom::html::htmlfieldsetelement::HTMLFieldSetElement;
18use crate::dom::html::htmlformelement::{FormControl, HTMLFormElement};
19use crate::dom::node::{BindContext, Node, UnbindContext};
20use crate::dom::virtualmethods::VirtualMethods;
21
22#[dom_struct]
23pub(crate) struct HTMLLegendElement {
24 htmlelement: HTMLElement,
25 form_owner: MutNullableDom<HTMLFormElement>,
26}
27
28impl HTMLLegendElement {
29 fn new_inherited(
30 local_name: LocalName,
31 prefix: Option<Prefix>,
32 document: &Document,
33 ) -> HTMLLegendElement {
34 HTMLLegendElement {
35 htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
36 form_owner: Default::default(),
37 }
38 }
39
40 pub(crate) fn new(
41 cx: &mut js::context::JSContext,
42 local_name: LocalName,
43 prefix: Option<Prefix>,
44 document: &Document,
45 proto: Option<HandleObject>,
46 ) -> DomRoot<HTMLLegendElement> {
47 Node::reflect_node_with_proto(
48 cx,
49 Box::new(HTMLLegendElement::new_inherited(
50 local_name, prefix, document,
51 )),
52 document,
53 proto,
54 )
55 }
56}
57
58impl VirtualMethods for HTMLLegendElement {
59 fn super_type(&self) -> Option<&dyn VirtualMethods> {
60 Some(self.upcast::<HTMLElement>() as &dyn VirtualMethods)
61 }
62
63 fn bind_to_tree(&self, cx: &mut JSContext, context: &BindContext) {
64 if let Some(s) = self.super_type() {
65 s.bind_to_tree(cx, context);
66 }
67
68 self.upcast::<Element>()
69 .check_ancestors_disabled_state_for_form_control();
70 }
71
72 fn unbind_from_tree(&self, cx: &mut JSContext, context: &UnbindContext) {
73 self.super_type().unwrap().unbind_from_tree(cx, context);
74
75 let node = self.upcast::<Node>();
76 let el = self.upcast::<Element>();
77 if node
78 .ancestors()
79 .any(|ancestor| ancestor.is::<HTMLFieldSetElement>())
80 {
81 el.check_ancestors_disabled_state_for_form_control();
82 } else {
83 el.check_disabled_attribute();
84 }
85 }
86}
87
88impl HTMLLegendElementMethods<crate::DomTypeHolder> for HTMLLegendElement {
89 fn GetForm(&self) -> Option<DomRoot<HTMLFormElement>> {
91 let parent = self.upcast::<Node>().GetParentElement()?;
92 if parent.is::<HTMLFieldSetElement>() {
93 return self.form_owner();
94 }
95 None
96 }
97}
98
99impl FormControl for HTMLLegendElement {
100 fn form_owner(&self) -> Option<DomRoot<HTMLFormElement>> {
101 self.form_owner.get()
102 }
103
104 fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
105 self.form_owner.set(form);
106 }
107
108 fn to_element(&self) -> &Element {
109 self.upcast::<Element>()
110 }
111}