2020-01-18 09:38:21 +01:00
/*
2023-02-20 18:56:08 +01:00
* Copyright ( c ) 2018 - 2023 , Andreas Kling < kling @ serenityos . org >
2020-01-18 09:38:21 +01:00
*
2021-04-22 01:24:48 -07:00
* SPDX - License - Identifier : BSD - 2 - Clause
2020-01-18 09:38:21 +01:00
*/
2022-09-24 16:34:04 -06:00
# include <LibWeb/Bindings/CSSStyleDeclarationPrototype.h>
2022-10-30 17:50:04 +00:00
# include <LibWeb/Bindings/ExceptionOrUtils.h>
2022-09-24 16:34:04 -06:00
# include <LibWeb/Bindings/Intrinsics.h>
2021-03-13 20:11:33 +01:00
# include <LibWeb/CSS/CSSStyleDeclaration.h>
2021-09-12 19:24:01 +02:00
# include <LibWeb/CSS/Parser/Parser.h>
2023-09-24 18:13:39 +02:00
# include <LibWeb/CSS/StyleValues/ImageStyleValue.h>
2022-08-07 16:21:26 +02:00
# include <LibWeb/DOM/Document.h>
2021-03-16 18:55:53 +01:00
# include <LibWeb/DOM/Element.h>
2023-02-17 15:21:32 +00:00
# include <LibWeb/Infra/Strings.h>
2019-06-20 23:25:25 +02:00
2020-07-26 20:01:35 +02:00
namespace Web : : CSS {
2020-03-07 10:27:02 +01:00
2023-11-19 19:47:52 +01:00
JS_DEFINE_ALLOCATOR ( CSSStyleDeclaration ) ;
JS_DEFINE_ALLOCATOR ( PropertyOwningCSSStyleDeclaration ) ;
JS_DEFINE_ALLOCATOR ( ElementInlineCSSStyleDeclaration ) ;
2022-09-24 16:34:04 -06:00
CSSStyleDeclaration : : CSSStyleDeclaration ( JS : : Realm & realm )
2023-05-21 12:42:22 +02:00
: PlatformObject ( realm )
2022-08-07 16:21:26 +02:00
{
}
2023-08-07 08:41:28 +02:00
void CSSStyleDeclaration : : initialize ( JS : : Realm & realm )
2023-05-21 12:42:22 +02:00
{
2023-08-07 08:41:28 +02:00
Base : : initialize ( realm ) ;
2023-11-22 12:55:21 +13:00
set_prototype ( & Bindings : : ensure_web_prototype < Bindings : : CSSStyleDeclarationPrototype > ( realm , " CSSStyleDeclaration " _fly_string ) ) ;
2023-05-21 12:42:22 +02:00
}
2023-11-05 16:19:16 +13:00
JS : : NonnullGCPtr < PropertyOwningCSSStyleDeclaration > PropertyOwningCSSStyleDeclaration : : create ( JS : : Realm & realm , Vector < StyleProperty > properties , HashMap < FlyString , StyleProperty > custom_properties )
2022-08-07 16:21:26 +02:00
{
2023-08-13 13:05:26 +02:00
return realm . heap ( ) . allocate < PropertyOwningCSSStyleDeclaration > ( realm , realm , move ( properties ) , move ( custom_properties ) ) ;
2022-08-07 16:21:26 +02:00
}
2023-11-05 16:19:16 +13:00
PropertyOwningCSSStyleDeclaration : : PropertyOwningCSSStyleDeclaration ( JS : : Realm & realm , Vector < StyleProperty > properties , HashMap < FlyString , StyleProperty > custom_properties )
2022-09-24 16:34:04 -06:00
: CSSStyleDeclaration ( realm )
2022-08-07 16:21:26 +02:00
, m_properties ( move ( properties ) )
2021-05-24 22:54:41 +02:00
, m_custom_properties ( move ( custom_properties ) )
2019-06-20 23:25:25 +02:00
{
}
2023-09-24 18:13:39 +02:00
void PropertyOwningCSSStyleDeclaration : : visit_edges ( Cell : : Visitor & visitor )
{
Base : : visit_edges ( visitor ) ;
for ( auto & property : m_properties ) {
if ( property . value - > is_image ( ) )
property . value - > as_image ( ) . visit_edges ( visitor ) ;
}
}
2023-09-06 19:07:24 +12:00
String PropertyOwningCSSStyleDeclaration : : item ( size_t index ) const
2021-03-13 22:39:55 +01:00
{
if ( index > = m_properties . size ( ) )
return { } ;
2023-09-06 19:07:24 +12:00
return MUST ( String : : from_utf8 ( CSS : : string_from_property_id ( m_properties [ index ] . property_id ) ) ) ;
2021-03-13 22:39:55 +01:00
}
2023-11-05 16:19:16 +13:00
JS : : NonnullGCPtr < ElementInlineCSSStyleDeclaration > ElementInlineCSSStyleDeclaration : : create ( DOM : : Element & element , Vector < StyleProperty > properties , HashMap < FlyString , StyleProperty > custom_properties )
2022-08-07 16:21:26 +02:00
{
2022-09-24 16:34:04 -06:00
auto & realm = element . realm ( ) ;
2023-08-13 13:05:26 +02:00
return realm . heap ( ) . allocate < ElementInlineCSSStyleDeclaration > ( realm , element , move ( properties ) , move ( custom_properties ) ) ;
2022-08-07 16:21:26 +02:00
}
2023-11-05 16:19:16 +13:00
ElementInlineCSSStyleDeclaration : : ElementInlineCSSStyleDeclaration ( DOM : : Element & element , Vector < StyleProperty > properties , HashMap < FlyString , StyleProperty > custom_properties )
2022-09-24 16:34:04 -06:00
: PropertyOwningCSSStyleDeclaration ( element . realm ( ) , move ( properties ) , move ( custom_properties ) )
2021-07-23 10:35:39 +02:00
, m_element ( element . make_weak_ptr < DOM : : Element > ( ) )
{
}
2022-08-28 13:42:07 +02:00
void ElementInlineCSSStyleDeclaration : : visit_edges ( Cell : : Visitor & visitor )
{
Base : : visit_edges ( visitor ) ;
2023-11-19 16:18:00 +13:00
visitor . visit ( m_element ) ;
2022-08-28 13:42:07 +02:00
}
2021-09-12 19:24:01 +02:00
size_t PropertyOwningCSSStyleDeclaration : : length ( ) const
{
return m_properties . size ( ) ;
}
Optional < StyleProperty > PropertyOwningCSSStyleDeclaration : : property ( PropertyID property_id ) const
{
for ( auto & property : m_properties ) {
if ( property . property_id = = property_id )
return property ;
}
return { } ;
}
2022-04-11 16:10:55 +02:00
// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-setproperty
2022-09-25 17:03:42 +01:00
WebIDL : : ExceptionOr < void > PropertyOwningCSSStyleDeclaration : : set_property ( PropertyID property_id , StringView value , StringView priority )
2021-09-12 19:24:01 +02:00
{
2022-04-11 16:10:55 +02:00
// 1. If the computed flag is set, then throw a NoModificationAllowedError exception.
// NOTE: This is handled by the virtual override in ResolvedCSSStyleDeclaration.
// FIXME: 2. If property is not a custom property, follow these substeps:
// FIXME: 1. Let property be property converted to ASCII lowercase.
// FIXME: 2. If property is not a case-sensitive match for a supported CSS property, then return.
// NOTE: This must be handled before we've turned the property string into a PropertyID.
// 3. If value is the empty string, invoke removeProperty() with property as argument and return.
if ( value . is_empty ( ) ) {
MUST ( remove_property ( property_id ) ) ;
return { } ;
2021-09-26 19:06:17 +02:00
}
2021-09-12 19:24:01 +02:00
2022-04-11 16:10:55 +02:00
// 4. If priority is not the empty string and is not an ASCII case-insensitive match for the string "important", then return.
2023-02-17 15:21:32 +00:00
if ( ! priority . is_empty ( ) & & ! Infra : : is_ascii_case_insensitive_match ( priority , " important " sv ) )
2022-04-11 16:10:55 +02:00
return { } ;
// 5. Let component value list be the result of parsing value for property property.
2023-03-29 01:17:38 +01:00
auto component_value_list = is < ElementInlineCSSStyleDeclaration > ( this )
2023-08-19 15:01:21 +01:00
? parse_css_value ( CSS : : Parser : : ParsingContext { static_cast < ElementInlineCSSStyleDeclaration & > ( * this ) . element ( ) - > document ( ) } , value , property_id )
: parse_css_value ( CSS : : Parser : : ParsingContext { realm ( ) } , value , property_id ) ;
2022-04-11 16:10:55 +02:00
// 6. If component value list is null, then return.
if ( ! component_value_list )
return { } ;
// 7. Let updated be false.
bool updated = false ;
// FIXME: 8. If property is a shorthand property, then for each longhand property longhand that property maps to, in canonical order, follow these substeps:
// FIXME: 1. Let longhand result be the result of set the CSS declaration longhand with the appropriate value(s) from component value list,
// with the important flag set if priority is not the empty string, and unset otherwise, and with the list of declarations being the declarations.
// FIXME: 2. If longhand result is true, let updated be true.
// 9. Otherwise, let updated be the result of set the CSS declaration property with value component value list,
// with the important flag set if priority is not the empty string, and unset otherwise,
// and with the list of declarations being the declarations.
updated = set_a_css_declaration ( property_id , component_value_list . release_nonnull ( ) , ! priority . is_empty ( ) ? Important : : Yes : Important : : No ) ;
// 10. If updated is true, update style attribute for the CSS declaration block.
if ( updated )
update_style_attribute ( ) ;
return { } ;
}
// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-removeproperty
2023-09-06 19:07:24 +12:00
WebIDL : : ExceptionOr < String > PropertyOwningCSSStyleDeclaration : : remove_property ( PropertyID property_id )
2022-04-11 16:10:55 +02:00
{
// 1. If the computed flag is set, then throw a NoModificationAllowedError exception.
// NOTE: This is handled by the virtual override in ResolvedCSSStyleDeclaration.
// 2. If property is not a custom property, let property be property converted to ASCII lowercase.
// NOTE: We've already converted it to a PropertyID enum value.
// 3. Let value be the return value of invoking getPropertyValue() with property as argument.
// FIXME: The trip through string_from_property_id() here is silly.
auto value = get_property_value ( string_from_property_id ( property_id ) ) ;
// 4. Let removed be false.
bool removed = false ;
2021-09-12 19:24:01 +02:00
2022-04-11 16:10:55 +02:00
// FIXME: 5. If property is a shorthand property, for each longhand property longhand that property maps to:
// 1. If longhand is not a property name of a CSS declaration in the declarations, continue.
// 2. Remove that CSS declaration and let removed be true.
// 6. Otherwise, if property is a case-sensitive match for a property name of a CSS declaration in the declarations, remove that CSS declaration and let removed be true.
removed = m_properties . remove_first_matching ( [ & ] ( auto & entry ) { return entry . property_id = = property_id ; } ) ;
// 7. If removed is true, Update style attribute for the CSS declaration block.
if ( removed )
update_style_attribute ( ) ;
// 8. Return value.
return value ;
}
// https://drafts.csswg.org/cssom/#update-style-attribute-for
void ElementInlineCSSStyleDeclaration : : update_style_attribute ( )
{
2022-04-11 16:56:52 +02:00
// 1. Assert: declaration block’ s computed flag is unset.
// NOTE: Unnecessary, only relevant for ResolvedCSSStyleDeclaration.
// 2. Let owner node be declaration block’ s owner node.
// 3. If owner node is null, then return.
2022-04-11 16:10:55 +02:00
if ( ! m_element )
return ;
2022-04-11 16:56:52 +02:00
// 4. Set declaration block’ s updating flag.
m_updating = true ;
// 5. Set an attribute value for owner node using "style" and the result of serializing declaration block.
2023-11-21 10:39:54 +13:00
MUST ( m_element - > set_attribute ( HTML : : AttributeNames : : style , serialized ( ) ) ) ;
2022-04-11 16:56:52 +02:00
// 6. Unset declaration block’ s updating flag.
m_updating = false ;
2022-04-11 16:10:55 +02:00
}
// https://drafts.csswg.org/cssom/#set-a-css-declaration
2023-02-20 18:56:08 +01:00
bool PropertyOwningCSSStyleDeclaration : : set_a_css_declaration ( PropertyID property_id , NonnullRefPtr < StyleValue const > value , Important important )
2022-04-11 16:10:55 +02:00
{
// FIXME: Handle logical property groups.
2021-09-12 19:24:01 +02:00
for ( auto & property : m_properties ) {
if ( property . property_id = = property_id ) {
2022-04-11 16:10:55 +02:00
if ( property . important = = important & & * property . value = = * value )
return false ;
property . value = move ( value ) ;
property . important = important ;
2021-09-12 19:24:01 +02:00
return true ;
}
}
m_properties . append ( CSS : : StyleProperty {
2022-04-11 16:10:55 +02:00
. important = important ,
2021-09-12 19:24:01 +02:00
. property_id = property_id ,
2022-04-11 16:10:55 +02:00
. value = move ( value ) ,
2021-09-12 19:24:01 +02:00
} ) ;
return true ;
}
2023-09-06 19:07:24 +12:00
String CSSStyleDeclaration : : get_property_value ( StringView property_name ) const
2021-09-12 20:44:17 +02:00
{
auto property_id = property_id_from_string ( property_name ) ;
2023-05-10 13:01:30 +01:00
if ( ! property_id . has_value ( ) )
2021-09-12 20:44:17 +02:00
return { } ;
2023-05-10 13:01:30 +01:00
auto maybe_property = property ( property_id . value ( ) ) ;
2021-09-12 20:44:17 +02:00
if ( ! maybe_property . has_value ( ) )
return { } ;
2023-09-06 19:07:24 +12:00
return maybe_property - > value - > to_string ( ) ;
2021-09-12 20:44:17 +02:00
}
2022-04-11 20:48:50 +02:00
// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-getpropertypriority
2023-09-06 19:07:24 +12:00
StringView CSSStyleDeclaration : : get_property_priority ( StringView property_name ) const
2022-04-11 20:48:50 +02:00
{
auto property_id = property_id_from_string ( property_name ) ;
2023-05-10 13:01:30 +01:00
if ( ! property_id . has_value ( ) )
2022-04-11 20:48:50 +02:00
return { } ;
2023-05-10 13:01:30 +01:00
auto maybe_property = property ( property_id . value ( ) ) ;
2022-04-11 20:48:50 +02:00
if ( ! maybe_property . has_value ( ) )
return { } ;
2023-09-06 19:07:24 +12:00
return maybe_property - > important = = Important : : Yes ? " important " sv : " " sv ;
2022-04-11 20:48:50 +02:00
}
2022-09-25 17:03:42 +01:00
WebIDL : : ExceptionOr < void > CSSStyleDeclaration : : set_property ( StringView property_name , StringView css_text , StringView priority )
2021-09-26 19:06:17 +02:00
{
auto property_id = property_id_from_string ( property_name ) ;
2023-05-10 13:01:30 +01:00
if ( ! property_id . has_value ( ) )
2022-04-11 16:10:55 +02:00
return { } ;
2023-05-10 13:01:30 +01:00
return set_property ( property_id . value ( ) , css_text , priority ) ;
2022-04-11 16:10:55 +02:00
}
2023-09-06 19:07:24 +12:00
WebIDL : : ExceptionOr < String > CSSStyleDeclaration : : remove_property ( StringView property_name )
2022-04-11 16:10:55 +02:00
{
auto property_id = property_id_from_string ( property_name ) ;
2023-05-10 13:01:30 +01:00
if ( ! property_id . has_value ( ) )
2023-09-06 19:07:24 +12:00
return String { } ;
2023-05-10 13:01:30 +01:00
return remove_property ( property_id . value ( ) ) ;
2021-09-26 19:06:17 +02:00
}
2022-11-05 04:51:05 +00:00
// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-csstext
2023-11-21 10:39:54 +13:00
String CSSStyleDeclaration : : css_text ( ) const
2021-10-01 19:57:45 +02:00
{
2022-11-05 04:51:05 +00:00
// 1. If the computed flag is set, then return the empty string.
// NOTE: See ResolvedCSSStyleDeclaration::serialized()
2021-10-01 19:57:45 +02:00
2022-11-05 04:51:05 +00:00
// 2. Return the result of serializing the declarations.
return serialized ( ) ;
2021-10-01 19:57:45 +02:00
}
2021-10-15 19:38:39 +01:00
// https://www.w3.org/TR/cssom/#serialize-a-css-declaration
2023-11-21 10:39:54 +13:00
static String serialize_a_css_declaration ( CSS : : PropertyID property , StringView value , Important important )
2021-10-01 19:57:45 +02:00
{
StringBuilder builder ;
// 1. Let s be the empty string.
// 2. Append property to s.
builder . append ( string_from_property_id ( property ) ) ;
// 3. Append ": " (U+003A U+0020) to s.
builder . append ( " : " sv ) ;
// 4. Append value to s.
builder . append ( value ) ;
// 5. If the important flag is set, append " !important" (U+0020 U+0021 U+0069 U+006D U+0070 U+006F U+0072 U+0074 U+0061 U+006E U+0074) to s.
2022-02-12 14:53:59 +00:00
if ( important = = Important : : Yes )
2021-10-01 19:57:45 +02:00
builder . append ( " !important " sv ) ;
// 6. Append ";" (U+003B) to s.
builder . append ( ' ; ' ) ;
// 7. Return s.
2023-11-21 10:39:54 +13:00
return MUST ( builder . to_string ( ) ) ;
2021-10-01 19:57:45 +02:00
}
2021-10-15 19:38:39 +01:00
// https://www.w3.org/TR/cssom/#serialize-a-css-declaration-block
2023-11-21 10:39:54 +13:00
String PropertyOwningCSSStyleDeclaration : : serialized ( ) const
2021-10-01 19:57:45 +02:00
{
// 1. Let list be an empty array.
2023-11-21 10:39:54 +13:00
Vector < String > list ;
2021-10-01 19:57:45 +02:00
// 2. Let already serialized be an empty array.
HashTable < PropertyID > already_serialized ;
2023-06-09 02:08:11 +03:30
// NOTE: The spec treats custom properties the same as any other property, and expects the above loop to handle them.
// However, our implementation separates them from regular properties, so we need to handle them separately here.
// FIXME: Is the relative order of custom properties and regular properties supposed to be preserved?
for ( auto & declaration : m_custom_properties ) {
// 1. Let property be declaration’ s property name.
auto const & property = declaration . key ;
// 2. If property is in already serialized, continue with the steps labeled declaration loop.
// NOTE: It is never in already serialized, as there are no shorthands for custom properties.
// 3. If property maps to one or more shorthand properties, let shorthands be an array of those shorthand properties, in preferred order.
// NOTE: There are no shorthands for custom properties.
// 4. Shorthand loop: For each shorthand in shorthands, follow these substeps: ...
// NOTE: There are no shorthands for custom properties.
// 5. Let value be the result of invoking serialize a CSS value of declaration.
2023-08-22 14:08:15 +01:00
auto value = declaration . value . value - > to_string ( ) . to_deprecated_string ( ) ;
2023-06-09 02:08:11 +03:30
// 6. Let serialized declaration be the result of invoking serialize a CSS declaration with property name property, value value,
// and the important flag set if declaration has its important flag set.
// NOTE: We have to inline this here as the actual implementation does not accept custom properties.
2023-11-21 10:39:54 +13:00
String serialized_declaration = [ & ] {
2023-06-09 02:08:11 +03:30
// https://www.w3.org/TR/cssom/#serialize-a-css-declaration
StringBuilder builder ;
// 1. Let s be the empty string.
// 2. Append property to s.
builder . append ( property ) ;
// 3. Append ": " (U+003A U+0020) to s.
builder . append ( " : " sv ) ;
// 4. Append value to s.
builder . append ( value ) ;
// 5. If the important flag is set, append " !important" (U+0020 U+0021 U+0069 U+006D U+0070 U+006F U+0072 U+0074 U+0061 U+006E U+0074) to s.
if ( declaration . value . important = = Important : : Yes )
builder . append ( " !important " sv ) ;
// 6. Append ";" (U+003B) to s.
builder . append ( ' ; ' ) ;
// 7. Return s.
2023-11-21 10:39:54 +13:00
return MUST ( builder . to_string ( ) ) ;
2023-06-09 02:08:11 +03:30
} ( ) ;
// 7. Append serialized declaration to list.
list . append ( move ( serialized_declaration ) ) ;
// 8. Append property to already serialized.
// NOTE: We don't need to do this, as we don't have shorthands for custom properties.
}
2021-10-01 19:57:45 +02:00
// 3. Declaration loop: For each CSS declaration declaration in declaration block’ s declarations, follow these substeps:
for ( auto & declaration : m_properties ) {
// 1. Let property be declaration’ s property name.
auto property = declaration . property_id ;
// 2. If property is in already serialized, continue with the steps labeled declaration loop.
if ( already_serialized . contains ( property ) )
continue ;
// FIXME: 3. If property maps to one or more shorthand properties, let shorthands be an array of those shorthand properties, in preferred order.
// FIXME: 4. Shorthand loop: For each shorthand in shorthands, follow these substeps: ...
// 5. Let value be the result of invoking serialize a CSS value of declaration.
2023-11-21 10:39:54 +13:00
auto value = declaration . value - > to_string ( ) ;
2021-10-01 19:57:45 +02:00
// 6. Let serialized declaration be the result of invoking serialize a CSS declaration with property name property, value value,
// and the important flag set if declaration has its important flag set.
auto serialized_declaration = serialize_a_css_declaration ( property , move ( value ) , declaration . important ) ;
// 7. Append serialized declaration to list.
list . append ( move ( serialized_declaration ) ) ;
// 8. Append property to already serialized.
already_serialized . set ( property ) ;
}
// 4. Return list joined with " " (U+0020).
StringBuilder builder ;
builder . join ( ' ' , list ) ;
2023-11-21 10:39:54 +13:00
return MUST ( builder . to_string ( ) ) ;
2021-10-01 19:57:45 +02:00
}
2022-08-07 16:21:26 +02:00
static CSS : : PropertyID property_id_from_name ( StringView name )
{
// FIXME: Perhaps this should go in the code generator.
if ( name = = " cssFloat " sv )
return CSS : : PropertyID : : Float ;
2023-05-10 13:01:30 +01:00
if ( auto property_id = CSS : : property_id_from_camel_case_string ( name ) ; property_id . has_value ( ) )
return property_id . value ( ) ;
2022-08-07 16:21:26 +02:00
2023-05-10 13:01:30 +01:00
if ( auto property_id = CSS : : property_id_from_string ( name ) ; property_id . has_value ( ) )
return property_id . value ( ) ;
2022-08-07 16:21:26 +02:00
return CSS : : PropertyID : : Invalid ;
}
JS : : ThrowCompletionOr < bool > CSSStyleDeclaration : : internal_has_property ( JS : : PropertyKey const & name ) const
{
if ( ! name . is_string ( ) )
return Base : : internal_has_property ( name ) ;
return property_id_from_name ( name . to_string ( ) ) ! = CSS : : PropertyID : : Invalid ;
}
2023-07-08 17:39:18 +02:00
JS : : ThrowCompletionOr < JS : : Value > CSSStyleDeclaration : : internal_get ( JS : : PropertyKey const & name , JS : : Value receiver , JS : : CacheablePropertyMetadata * cacheable_metadata ) const
2022-08-07 16:21:26 +02:00
{
2023-09-29 16:48:28 +01:00
if ( name . is_number ( ) )
return { JS : : PrimitiveString : : create ( vm ( ) , item ( name . as_number ( ) ) ) } ;
2022-08-07 16:21:26 +02:00
if ( ! name . is_string ( ) )
2023-07-08 17:39:18 +02:00
return Base : : internal_get ( name , receiver , cacheable_metadata ) ;
2022-08-07 16:21:26 +02:00
auto property_id = property_id_from_name ( name . to_string ( ) ) ;
if ( property_id = = CSS : : PropertyID : : Invalid )
2023-07-08 17:39:18 +02:00
return Base : : internal_get ( name , receiver , cacheable_metadata ) ;
2022-08-07 16:21:26 +02:00
if ( auto maybe_property = property ( property_id ) ; maybe_property . has_value ( ) )
2023-08-22 14:08:15 +01:00
return { JS : : PrimitiveString : : create ( vm ( ) , maybe_property - > value - > to_string ( ) . to_deprecated_string ( ) ) } ;
2023-01-21 10:42:46 -05:00
return { JS : : PrimitiveString : : create ( vm ( ) , String { } ) } ;
2022-08-07 16:21:26 +02:00
}
2023-11-08 20:51:26 +01:00
JS : : ThrowCompletionOr < bool > CSSStyleDeclaration : : internal_set ( JS : : PropertyKey const & name , JS : : Value value , JS : : Value receiver , JS : : CacheablePropertyMetadata * cacheable_metadata )
2022-08-07 16:21:26 +02:00
{
2022-10-30 17:50:04 +00:00
auto & vm = this - > vm ( ) ;
2022-08-07 16:21:26 +02:00
if ( ! name . is_string ( ) )
2023-11-08 20:51:26 +01:00
return Base : : internal_set ( name , value , receiver , cacheable_metadata ) ;
2022-08-07 16:21:26 +02:00
auto property_id = property_id_from_name ( name . to_string ( ) ) ;
if ( property_id = = CSS : : PropertyID : : Invalid )
2023-11-08 20:51:26 +01:00
return Base : : internal_set ( name , value , receiver , cacheable_metadata ) ;
2022-08-07 16:21:26 +02:00
2023-01-13 10:29:02 -05:00
auto css_text = TRY ( value . to_deprecated_string ( vm ) ) ;
2022-08-07 16:21:26 +02:00
2022-10-30 17:50:04 +00:00
TRY ( Bindings : : throw_dom_exception_if_needed ( vm , [ & ] { return set_property ( property_id , css_text ) ; } ) ) ;
2022-08-07 16:21:26 +02:00
return true ;
}
2022-11-05 04:51:05 +00:00
WebIDL : : ExceptionOr < void > PropertyOwningCSSStyleDeclaration : : set_css_text ( StringView css_text )
{
dbgln ( " (STUBBED) PropertyOwningCSSStyleDeclaration::set_css_text(css_text='{}') " , css_text ) ;
return { } ;
}
void PropertyOwningCSSStyleDeclaration : : empty_the_declarations ( )
{
m_properties . clear ( ) ;
m_custom_properties . clear ( ) ;
}
2023-11-05 16:19:16 +13:00
void PropertyOwningCSSStyleDeclaration : : set_the_declarations ( Vector < StyleProperty > properties , HashMap < FlyString , StyleProperty > custom_properties )
2022-11-05 04:51:05 +00:00
{
m_properties = move ( properties ) ;
m_custom_properties = move ( custom_properties ) ;
}
// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-csstext
WebIDL : : ExceptionOr < void > ElementInlineCSSStyleDeclaration : : set_css_text ( StringView css_text )
{
// FIXME: What do we do if the element is null?
if ( ! m_element ) {
dbgln ( " FIXME: Returning from ElementInlineCSSStyleDeclaration::set_css_text as m_element is null. " ) ;
return { } ;
}
// 1. If the computed flag is set, then throw a NoModificationAllowedError exception.
// NOTE: See ResolvedCSSStyleDeclaration.
// 2. Empty the declarations.
empty_the_declarations ( ) ;
// 3. Parse the given value and, if the return value is not the empty list, insert the items in the list into the declarations, in specified order.
auto style = parse_css_style_attribute ( CSS : : Parser : : ParsingContext ( m_element - > document ( ) ) , css_text , * m_element . ptr ( ) ) ;
2023-06-07 12:00:00 +02:00
auto custom_properties = TRY_OR_THROW_OOM ( vm ( ) , style - > custom_properties ( ) . clone ( ) ) ;
set_the_declarations ( style - > properties ( ) , move ( custom_properties ) ) ;
2022-11-05 04:51:05 +00:00
// 4. Update style attribute for the CSS declaration block.
update_style_attribute ( ) ;
return { } ;
}
2020-03-07 10:27:02 +01:00
}