2021-10-15 09:57:07 -04:00
/*
2022-01-31 13:07:22 -05:00
* Copyright ( c ) 2021 , Tim Flynn < trflynn89 @ serenityos . org >
2021-10-15 09:57:07 -04:00
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
2022-08-28 13:42:07 +02:00
# include <LibWeb/Bindings/AttributePrototype.h>
2021-10-15 09:57:07 -04:00
# include <LibWeb/DOM/Attribute.h>
# include <LibWeb/DOM/Document.h>
2021-10-17 15:09:47 -04:00
# include <LibWeb/DOM/Element.h>
2022-07-11 16:40:01 +01:00
# include <LibWeb/DOM/MutationType.h>
# include <LibWeb/DOM/StaticNodeList.h>
2021-10-15 09:57:07 -04:00
namespace Web : : DOM {
2022-08-28 13:42:07 +02:00
JS : : NonnullGCPtr < Attribute > Attribute : : create ( Document & document , FlyString local_name , String value , Element const * owner_element )
2021-10-15 09:57:07 -04:00
{
2022-08-28 13:42:07 +02:00
return * document . heap ( ) . allocate < Attribute > ( document . realm ( ) , document , move ( local_name ) , move ( value ) , owner_element ) ;
2021-10-15 09:57:07 -04:00
}
2021-10-15 12:03:08 -04:00
Attribute : : Attribute ( Document & document , FlyString local_name , String value , Element const * owner_element )
2021-10-15 09:57:07 -04:00
: Node ( document , NodeType : : ATTRIBUTE_NODE )
, m_qualified_name ( move ( local_name ) , { } , { } )
, m_value ( move ( value ) )
2021-10-15 12:03:08 -04:00
, m_owner_element ( owner_element )
2021-10-15 09:57:07 -04:00
{
2022-08-28 13:42:07 +02:00
set_prototype ( & window ( ) . ensure_web_prototype < Bindings : : AttributePrototype > ( " Attribute " ) ) ;
}
void Attribute : : visit_edges ( Cell : : Visitor & visitor )
{
Base : : visit_edges ( visitor ) ;
visitor . visit ( m_owner_element . ptr ( ) ) ;
2021-10-15 09:57:07 -04:00
}
2022-07-11 16:40:01 +01:00
Element * Attribute : : owner_element ( )
{
2022-08-28 13:42:07 +02:00
return m_owner_element . ptr ( ) ;
2022-07-11 16:40:01 +01:00
}
2021-10-17 15:09:47 -04:00
Element const * Attribute : : owner_element ( ) const
{
2022-08-28 13:42:07 +02:00
return m_owner_element . ptr ( ) ;
2021-10-17 15:09:47 -04:00
}
void Attribute : : set_owner_element ( Element const * owner_element )
{
m_owner_element = owner_element ;
}
2022-07-11 16:40:01 +01:00
// https://dom.spec.whatwg.org/#set-an-existing-attribute-value
void Attribute : : set_value ( String value )
{
// 1. If attribute’ s element is null, then set attribute’ s value to value.
if ( ! owner_element ( ) ) {
m_value = move ( value ) ;
return ;
}
// 2. Otherwise, change attribute to value.
// https://dom.spec.whatwg.org/#concept-element-attributes-change
// 1. Handle attribute changes for attribute with attribute’ s element, attribute’ s value, and value.
handle_attribute_changes ( * owner_element ( ) , m_value , value ) ;
// 2. Set attribute’ s value to value.
m_value = move ( value ) ;
}
// https://dom.spec.whatwg.org/#handle-attribute-changes
void Attribute : : handle_attribute_changes ( Element & element , String const & old_value , [[maybe_unused]] String const & new_value )
{
// 1. Queue a mutation record of "attributes" for element with attribute’ s local name, attribute’ s namespace, oldValue, « », « », null, and null.
2022-09-01 16:30:26 +02:00
element . queue_mutation_record ( MutationType : : attributes , local_name ( ) , namespace_uri ( ) , old_value , StaticNodeList : : create ( window ( ) , { } ) , StaticNodeList : : create ( window ( ) , { } ) , nullptr , nullptr ) ;
2022-07-11 16:40:01 +01:00
// FIXME: 2. If element is custom, then enqueue a custom element callback reaction with element, callback name "attributeChangedCallback", and an argument list containing attribute’ s local name, oldValue, newValue, and attribute’ s namespace.
// FIXME: 3. Run the attribute change steps with element, attribute’ s local name, oldValue, newValue, and attribute’ s namespace.
}
2021-10-15 09:57:07 -04:00
}