2020-08-01 03:04:26 +01:00
/*
2021-04-28 22:46:44 +02:00
* Copyright ( c ) 2020 , the SerenityOS developers .
2020-08-01 03:04:26 +01:00
*
2021-04-22 01:24:48 -07:00
* SPDX - License - Identifier : BSD - 2 - Clause
2020-08-01 03:04:26 +01:00
*/
2024-04-27 12:09:58 +12:00
# include <LibWeb/Bindings/HTMLFieldSetElementPrototype.h>
2022-09-30 17:16:16 -06:00
# include <LibWeb/Bindings/Intrinsics.h>
2023-12-10 10:42:41 +01:00
# include <LibWeb/HTML/HTMLButtonElement.h>
2020-08-01 03:04:26 +01:00
# include <LibWeb/HTML/HTMLFieldSetElement.h>
2023-12-10 10:42:41 +01:00
# include <LibWeb/HTML/HTMLInputElement.h>
2022-09-30 16:21:34 +01:00
# include <LibWeb/HTML/HTMLLegendElement.h>
2023-12-10 10:42:41 +01:00
# include <LibWeb/HTML/HTMLObjectElement.h>
# include <LibWeb/HTML/HTMLOutputElement.h>
# include <LibWeb/HTML/HTMLSelectElement.h>
# include <LibWeb/HTML/HTMLTextAreaElement.h>
2024-11-05 08:07:13 +00:00
# include <LibWeb/Layout/FieldSetBox.h>
2020-08-01 03:04:26 +01:00
namespace Web : : HTML {
2024-11-15 04:01:23 +13:00
GC_DEFINE_ALLOCATOR ( HTMLFieldSetElement ) ;
2023-11-19 19:47:52 +01:00
2022-02-18 21:00:52 +01:00
HTMLFieldSetElement : : HTMLFieldSetElement ( DOM : : Document & document , DOM : : QualifiedName qualified_name )
2022-03-23 18:55:54 -04:00
: HTMLElement ( document , move ( qualified_name ) )
2020-08-01 03:04:26 +01:00
{
}
2022-03-14 13:21:51 -06:00
HTMLFieldSetElement : : ~ HTMLFieldSetElement ( ) = default ;
2022-09-30 16:21:34 +01:00
2023-08-07 08:41:28 +02:00
void HTMLFieldSetElement : : initialize ( JS : : Realm & realm )
2023-01-10 06:28:20 -05:00
{
2023-08-07 08:41:28 +02:00
Base : : initialize ( realm ) ;
2024-03-16 13:13:08 +01:00
WEB_SET_PROTOTYPE_FOR_INTERFACE ( HTMLFieldSetElement ) ;
2023-01-10 06:28:20 -05:00
}
2023-12-10 10:42:41 +01:00
void HTMLFieldSetElement : : visit_edges ( Cell : : Visitor & visitor )
{
Base : : visit_edges ( visitor ) ;
visitor . visit ( m_elements ) ;
}
2022-09-30 16:21:34 +01:00
// https://html.spec.whatwg.org/multipage/form-elements.html#concept-fieldset-disabled
bool HTMLFieldSetElement : : is_disabled ( ) const
{
// A fieldset element is a disabled fieldset if it matches any of the following conditions:
// - Its disabled attribute is specified
if ( has_attribute ( AttributeNames : : disabled ) )
return true ;
// - It is a descendant of another fieldset element whose disabled attribute is specified, and is not a descendant of that fieldset element's first legend element child, if any.
for ( auto * fieldset_ancestor = first_ancestor_of_type < HTMLFieldSetElement > ( ) ; fieldset_ancestor ; fieldset_ancestor = fieldset_ancestor - > first_ancestor_of_type < HTMLFieldSetElement > ( ) ) {
if ( fieldset_ancestor - > has_attribute ( HTML : : AttributeNames : : disabled ) ) {
auto * first_legend_element_child = fieldset_ancestor - > first_child_of_type < HTMLLegendElement > ( ) ;
if ( ! first_legend_element_child | | ! is_descendant_of ( * first_legend_element_child ) )
return true ;
}
}
return false ;
}
2023-12-10 10:42:41 +01:00
// https://html.spec.whatwg.org/multipage/form-elements.html#dom-fieldset-elements
2024-11-15 04:01:23 +13:00
GC : : Ptr < DOM : : HTMLCollection > const & HTMLFieldSetElement : : elements ( )
2023-12-10 10:42:41 +01:00
{
// The elements IDL attribute must return an HTMLCollection rooted at the fieldset element, whose filter matches listed elements.
if ( ! m_elements ) {
m_elements = DOM : : HTMLCollection : : create ( * this , DOM : : HTMLCollection : : Scope : : Descendants , [ ] ( DOM : : Element const & element ) {
// FIXME: Form-associated custom elements return also true
return is < HTMLButtonElement > ( element )
| | is < HTMLFieldSetElement > ( element )
| | is < HTMLInputElement > ( element )
| | is < HTMLObjectElement > ( element )
| | is < HTMLOutputElement > ( element )
| | is < HTMLSelectElement > ( element )
| | is < HTMLTextAreaElement > ( element ) ;
} ) ;
}
return m_elements ;
}
2024-11-05 08:07:13 +00:00
Layout : : FieldSetBox * HTMLFieldSetElement : : layout_node ( )
{
return static_cast < Layout : : FieldSetBox * > ( Node : : layout_node ( ) ) ;
}
2024-11-19 14:47:18 +01:00
GC : : Ptr < Layout : : Node > HTMLFieldSetElement : : create_layout_node ( CSS : : StyleProperties style )
2024-11-05 08:07:13 +00:00
{
return heap ( ) . allocate < Layout : : FieldSetBox > ( document ( ) , * this , style ) ;
}
2020-08-01 03:04:26 +01:00
}