LibWeb/CSS: Implement CSSStyleRule.styleMap

StylePropertyMap is just a stub, so this doesn't yet accomplish much.
This commit is contained in:
Sam Atkins 2025-08-11 16:07:02 +01:00
commit 215d8b8076
Notes: github-actions[bot] 2025-08-13 09:15:50 +00:00
12 changed files with 48 additions and 24 deletions

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2021-2024, Sam Atkins <sam@ladybird.org>
* Copyright (c) 2021-2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -12,6 +12,7 @@
#include <LibWeb/CSS/CSSStyleSheet.h>
#include <LibWeb/CSS/Parser/Parser.h>
#include <LibWeb/CSS/StyleComputer.h>
#include <LibWeb/CSS/StylePropertyMap.h>
namespace Web::CSS {
@ -40,6 +41,7 @@ void CSSStyleRule::visit_edges(Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
visitor.visit(m_declaration);
visitor.visit(m_style_map);
}
// https://drafts.csswg.org/cssom-1/#dom-cssstylerule-style
@ -48,6 +50,14 @@ GC::Ref<CSSStyleProperties> CSSStyleRule::style()
return m_declaration;
}
// https://drafts.css-houdini.org/css-typed-om-1/#dom-cssstylerule-stylemap
GC::Ref<StylePropertyMap> CSSStyleRule::style_map()
{
if (!m_style_map)
m_style_map = StylePropertyMap::create(realm(), m_declaration);
return *m_style_map;
}
// https://drafts.csswg.org/cssom-1/#serialize-a-css-rule
String CSSStyleRule::serialized() const
{

View file

@ -31,6 +31,7 @@ public:
void set_selector_text(StringView);
GC::Ref<CSSStyleProperties> style();
GC::Ref<StylePropertyMap> style_map();
[[nodiscard]] FlyString const& qualified_layer_name() const { return parent_layer_internal_qualified_name(); }
@ -49,6 +50,7 @@ private:
SelectorList m_selectors;
mutable Optional<SelectorList> m_cached_absolutized_selectors;
GC::Ref<CSSStyleProperties> m_declaration;
GC::Ptr<StylePropertyMap> m_style_map;
};
template<>

View file

@ -1,5 +1,6 @@
#import <CSS/CSSGroupingRule.idl>
#import <CSS/CSSStyleProperties.idl>
#import <CSS/StylePropertyMap.idl>
// https://drafts.csswg.org/cssom/#the-cssstylerule-interface
[Exposed=Window]

View file

@ -8,3 +8,8 @@ interface StylePropertyMap : StylePropertyMapReadOnly {
undefined delete(USVString property);
undefined clear();
};
// https://drafts.css-houdini.org/css-typed-om-1/#declared-stylepropertymap-objects
partial interface CSSStyleRule {
[SameObject] readonly attribute StylePropertyMap styleMap;
};

View file

@ -2,11 +2,12 @@ Harness status: OK
Found 7 tests
7 Fail
2 Pass
5 Fail
Fail Declared StylePropertyMap only contains properties in the style rule
Fail Declared StylePropertyMap contains CSS property declarations in style rules
Fail Declared StylePropertyMap does not contain inline styles
Pass Declared StylePropertyMap does not contain inline styles
Fail Declared StylePropertyMap contains custom property declarations
Fail Declared StylePropertyMap does not contain properties with invalid values
Pass Declared StylePropertyMap does not contain properties with invalid values
Fail Declared StylePropertyMap contains properties with their last valid value
Fail Declared StylePropertyMap is live

View file

@ -2,7 +2,8 @@ Harness status: OK
Found 3 tests
3 Fail
Fail Deleting a shorthand property not in the css rule is a no-op
1 Pass
2 Fail
Pass Deleting a shorthand property not in the css rule is a no-op
Fail Deleting a shorthand property in the css rule removes both it and its longhands
Fail Deleting a longhand property in the css rule removes both it and its shorthand

View file

@ -2,8 +2,9 @@ Harness status: OK
Found 5 tests
5 Fail
Fail Deleting a property not in the css rule is a no-op
1 Pass
4 Fail
Pass Deleting a property not in the css rule is a no-op
Fail Deleting a property in the css rule removes it from the css rule
Fail Deleting a custom property in the css rule removes it from the css rule
Fail Deleting a list-valued property in the css rule removes it from the css rule

View file

@ -2,6 +2,7 @@ Harness status: OK
Found 2 tests
2 Fail
1 Pass
1 Fail
Fail Getting a shorthand property set explicitly in css rule returns a base CSSStyleValue
Fail Getting a shorthand property that is partially set in css rule returns undefined
Pass Getting a shorthand property that is partially set in css rule returns undefined

View file

@ -2,9 +2,10 @@ Harness status: OK
Found 7 tests
7 Fail
Fail Getting a custom property not in the CSS rule returns undefined
Fail Getting a valid property not in the CSS rule returns undefined
2 Pass
5 Fail
Pass Getting a custom property not in the CSS rule returns undefined
Pass Getting a valid property not in the CSS rule returns undefined
Fail Getting a valid property from CSS rule returns the correct entry
Fail Getting a valid custom property from CSS rule returns the correct entry
Fail Getting a list-valued property from CSS rule returns only the first value

View file

@ -2,6 +2,7 @@ Harness status: OK
Found 2 tests
2 Fail
1 Pass
1 Fail
Fail StylePropertyMap.getAll() with a shorthand property set explicitly in css rule returns a base CSSStyleValue
Fail StylePropertyMap.getAll() with a shorthand property that is partially in css rule returns empty list
Pass StylePropertyMap.getAll() with a shorthand property that is partially in css rule returns empty list

View file

@ -2,11 +2,11 @@ Harness status: OK
Found 7 tests
1 Pass
6 Fail
3 Pass
4 Fail
Pass Calling StylePropertyMap.getAll with an unsupported property throws a TypeError
Fail Calling StylePropertyMap.getAll with a property not in the property model returns an empty list
Fail Calling StylePropertyMap.getAll with a custom property not in the property model returns an empty list
Pass Calling StylePropertyMap.getAll with a property not in the property model returns an empty list
Pass Calling StylePropertyMap.getAll with a custom property not in the property model returns an empty list
Fail Calling StylePropertyMap.getAll with a valid property returns a single element list with the correct entry
Fail StylePropertyMap.getAll is case-insensitive
Fail Calling StylePropertyMap.getAll with a valid custom property returns a single element list with the correct entry

View file

@ -2,14 +2,14 @@ Harness status: OK
Found 9 tests
1 Pass
8 Fail
4 Pass
5 Fail
Pass Calling StylePropertyMap.has with an unsupported property throws a TypeError
Fail Calling StylePropertyMap.has with a property not in the property model returns false
Fail Calling StylePropertyMap.has with a custom property not in the property model returns false
Pass Calling StylePropertyMap.has with a property not in the property model returns false
Pass Calling StylePropertyMap.has with a custom property not in the property model returns false
Fail Calling StylePropertyMap.has with a valid property returns true
Fail Calling StylePropertyMap.has with a valid property in mixed case returns true
Fail Calling StylePropertyMap.has with a valid shorthand specified explicitly returns true
Fail Calling StylePropertyMap.has with a valid shorthand only partially specified returns false
Pass Calling StylePropertyMap.has with a valid shorthand only partially specified returns false
Fail Calling StylePropertyMap.has with a valid custom property returns true
Fail Calling StylePropertyMap.has with a valid list-valued property returns true