ladybird/Libraries/LibWeb/CSS
Sam Atkins 4edafb35cd LibWeb/CSS: Use PendingSubstitutionValue for unresolved shorthands
Previously, we would just assign the UnresolvedStyleValue to each
longhand, which was completely wrong but happened to work if it was a
ShorthandStyleValue (because that's basically a list of "set property X
to Y", and doesn't care which property it's the value of).

For example, the included `var-in-margin-shorthand.html` test would:
1. Set `margin-top` to `var(--a) 10px`
2. Resolve it to `margin-top: 5px 10px`
3. Reject that as invalid

What now happens is:
1. Set `margin-top` to a PendingSubstitutionValue
2. Resolve `margin` to `5px 10px`
3. Expand that out into its longhands
4. `margin-top` is `5px` 🎉

In order to support this, `for_each_property_expanding_shorthands()` now
runs the callback for the shorthand too if it's an unresolved or
pending-substitution value. This is so that we can store those in the
CascadedProperties until they can be resolved - otherwise, by the time
we want to resolve them, we don't have them any more.

`cascade_declarations()` has an unfortunate hack: it tracks, for each
declaration, which properties have already been given values, so that
it can avoid overwriting an actual value with a pending one. This is
necessary because of the unfortunate way that CSSStyleProperties holds
expanded longhands, and not just the original declarations. The spec
disagrees with itself about this, but we do need to do that expansion
for `element.style` to work correctly. This HashTable is unfortunate
but it does solve the problem until a better solution can be found.
2025-05-14 11:46:47 +01:00
..
Parser LibWeb/CSS: Use PendingSubstitutionValue for unresolved shorthands 2025-05-14 11:46:47 +01:00
StyleValues LibWeb/CSS: Implement pending-substitution value 2025-05-14 11:46:47 +01:00
SyntaxHighlighter
Angle.cpp LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
Angle.h LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
AnimationEvent.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
AnimationEvent.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
AnimationEvent.idl
BooleanExpression.cpp LibWeb: Implement generic boolean logic for media/supports queries 2025-03-17 10:00:19 +00:00
BooleanExpression.h LibWeb: Implement generic boolean logic for media/supports queries 2025-03-17 10:00:19 +00:00
CalculatedOr.cpp LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
CalculatedOr.h LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
CascadedProperties.cpp Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
CascadedProperties.h LibWeb/CSS: Move and rename PseudoElement types to prep for code gen 2025-03-24 09:49:50 +00:00
CascadeOrigin.h LibWeb: Split StyleComputer work into two phases with separate outputs 2024-12-22 10:12:49 +01:00
CharacterTypes.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
Clip.cpp
Clip.h
ColumnCount.h Everywhere: Run clang-format 2024-12-28 05:39:32 -08:00
ComputedProperties.cpp LibWeb: Parse and propagate touch-action CSS property 2025-05-06 12:22:01 +01:00
ComputedProperties.h LibWeb: Parse and propagate touch-action CSS property 2025-05-06 12:22:01 +01:00
ComputedValues.h LibWeb: Parse and propagate touch-action CSS property 2025-05-06 12:22:01 +01:00
CountersSet.cpp AK+Everywhere: Rename verify_cast to as 2025-01-21 11:34:06 -05:00
CountersSet.h
CSS.cpp LibWeb/CSS: Integrate ParsingContext into the Parser 2025-02-06 16:47:25 +00:00
CSS.h
CSS.idl
CSSAnimation.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSAnimation.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSAnimation.idl
CSSConditionRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSConditionRule.h
CSSConditionRule.idl
CSSDescriptors.cpp LibWeb/CSS: Extract a CSSDescriptors base class 2025-05-08 16:21:32 +01:00
CSSDescriptors.h LibWeb/CSS: Extract a CSSDescriptors base class 2025-05-08 16:21:32 +01:00
CSSFontFaceDescriptors.cpp LibWeb/CSS: Extract a CSSDescriptors base class 2025-05-08 16:21:32 +01:00
CSSFontFaceDescriptors.h LibWeb/CSS: Extract a CSSDescriptors base class 2025-05-08 16:21:32 +01:00
CSSFontFaceDescriptors.idl LibWeb/CSS: Add CSSFontFaceDescriptors type 2025-04-04 10:40:32 +01:00
CSSFontFaceRule.cpp LibWeb/CSS: Set CSSFontFaceDescriptors' parent rule 2025-05-03 12:01:43 +01:00
CSSFontFaceRule.h LibWeb: Dump CSSDescriptors in a generic way 2025-05-08 16:21:32 +01:00
CSSFontFaceRule.idl
CSSGroupingRule.cpp LibWeb/CSS: Use CSSRule's context to parse new child rules 2025-04-23 10:55:45 +01:00
CSSGroupingRule.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSGroupingRule.idl
CSSImportRule.cpp LibWeb/CSS: Remove URL parameter to the CSS Parser 2025-05-03 12:01:43 +01:00
CSSImportRule.h LibWeb/CSS: Don't resolve @import URLs until they are used 2025-04-09 18:45:57 +01:00
CSSImportRule.idl LibWeb/CSS: Mark CSSImportRule.media as nullable 2025-04-09 18:45:57 +01:00
CSSKeyframeRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSKeyframeRule.h LibWeb/CSS: Merge style declaration subclasses into CSSStyleProperties 2025-03-19 13:53:00 +00:00
CSSKeyframeRule.idl LibWeb/CSS: Merge style declaration subclasses into CSSStyleProperties 2025-03-19 13:53:00 +00:00
CSSKeyframesRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSKeyframesRule.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSKeyframesRule.idl
CSSLayerBlockRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSLayerBlockRule.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSLayerBlockRule.idl
CSSLayerStatementRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSLayerStatementRule.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSLayerStatementRule.idl LibWeb: Convert trivial attributes to FrozenArray 2025-04-25 16:43:43 +02:00
CSSMediaRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSMediaRule.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSMediaRule.idl
CSSNamespaceRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSNamespaceRule.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSNamespaceRule.idl
CSSNestedDeclarations.cpp LibWeb: Return correct type from CSSNestedDeclarations::style 2025-04-25 08:48:29 +02:00
CSSNestedDeclarations.h LibWeb: Return correct type from CSSNestedDeclarations::style 2025-04-25 08:48:29 +02:00
CSSNestedDeclarations.idl LibWeb: Return correct type from CSSNestedDeclarations::style 2025-04-25 08:48:29 +02:00
CSSNumericType.cpp LibWeb: Parse CSS fit-content(<length-percentage>) values 2025-02-27 00:44:14 +01:00
CSSNumericType.h LibWeb/CSS: Use CalcSV's context to determine what percentages are 2025-01-13 10:59:16 +00:00
CSSPropertyRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSPropertyRule.h LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
CSSPropertyRule.idl
CSSRule.cpp
CSSRule.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSRule.idl
CSSRuleList.cpp LibWeb: Throw on deleting CSS @namespace rule in disallowed conditions 2025-04-24 18:26:54 +02:00
CSSRuleList.h LibWeb/CSS: Use CSSRule's context to parse new child rules 2025-04-23 10:55:45 +01:00
CSSRuleList.idl
CSSStyleDeclaration.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSStyleDeclaration.h LibWeb/CSS: Move property code from CSSStyleDeclaration to *Properties 2025-03-19 13:53:00 +00:00
CSSStyleDeclaration.idl LibWeb/CSS: Move property code from CSSStyleDeclaration to *Properties 2025-03-19 13:53:00 +00:00
CSSStyleProperties.cpp LibWeb: Invalidate owner sheet on add/remove in CSSStyleProperties 2025-04-24 18:26:54 +02:00
CSSStyleProperties.h LibWeb: Invalidate owner sheet on add/remove in CSSStyleProperties 2025-04-24 18:26:54 +02:00
CSSStyleProperties.idl LibWeb/CSS: Move property code from CSSStyleDeclaration to *Properties 2025-03-19 13:53:00 +00:00
CSSStyleRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSStyleRule.h LibWeb/CSS: Let CSSStyleValue know its CSSStyleSheet 2025-04-15 09:54:35 +01:00
CSSStyleRule.idl LibWeb/CSS: Merge style declaration subclasses into CSSStyleProperties 2025-03-19 13:53:00 +00:00
CSSStyleSheet.cpp LibWeb: Invalidate owner sheet on add/remove in CSSStyleProperties 2025-04-24 18:26:54 +02:00
CSSStyleSheet.h LibWeb/CSS: Expose owning document of CSSStyleSheet 2025-04-15 09:54:35 +01:00
CSSStyleSheet.idl
CSSStyleValue.cpp LibWeb/CSS: Implement pending-substitution value 2025-05-14 11:46:47 +01:00
CSSStyleValue.h LibWeb/CSS: Implement pending-substitution value 2025-05-14 11:46:47 +01:00
CSSSupportsRule.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSSupportsRule.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
CSSSupportsRule.idl
CSSTransition.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
CSSTransition.h LibWeb/DOM: Fire transition[cancel,start,run,end] events 2024-12-25 17:14:08 +01:00
CSSTransition.idl
Default.css LibWeb: Avoid changing button border color on disable/hover 2025-04-30 20:13:14 +01:00
Descriptor.cpp LibWeb: Parse descriptors as style values, using the JSON data 2025-04-04 10:40:32 +01:00
Descriptor.h LibWeb: Parse descriptors as style values, using the JSON data 2025-04-04 10:40:32 +01:00
Descriptors.json LibWeb/CSS: Remove unnecessary note about unicode-range parsing 2025-04-07 10:00:21 +01:00
Display.cpp LibWeb: Make CSS display serialization match other engines 2024-11-15 14:46:09 +01:00
Display.h LibWeb: Implement CSS 'contain' property 2025-01-28 11:24:40 +00:00
EasingFunctions.json
EdgeRect.cpp
EdgeRect.h
ElementCSSInlineStyle.idl LibWeb/CSS: Merge style declaration subclasses into CSSStyleProperties 2025-03-19 13:53:00 +00:00
Enums.json LibWeb: Parse and propagate touch-action CSS property 2025-05-06 12:22:01 +01:00
Fetch.cpp LibWeb: Set the initiator type for script-initiated CSS requests 2025-05-06 17:37:34 +01:00
Fetch.h LibWeb/CSS: Parse and use CSS URL request modifiers 2025-05-03 23:22:40 +01:00
Filter.h Everywhere: Run clang-format 2024-12-28 05:39:32 -08:00
Flex.cpp
Flex.h
FontFace.cpp LibWeb/CSS: Remove URL parameter to the CSS Parser 2025-05-03 12:01:43 +01:00
FontFace.h LibGfx+LibWeb: Store Typeface and Font-related types in RefPtr to const 2025-04-16 10:41:44 -06:00
FontFace.idl
FontFaceSet.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
FontFaceSet.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
FontFaceSet.idl
Frequency.cpp LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
Frequency.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
GridTrackPlacement.cpp LibWeb: Avoid repetition when serializing grid track placement values 2025-03-19 02:08:05 +01:00
GridTrackPlacement.h Everywhere: Run clang-format 2024-12-28 05:39:32 -08:00
GridTrackSize.cpp LibWeb/CSS: Make empty GridTrackSize value serialize to "none" 2025-03-22 17:33:37 +01:00
GridTrackSize.h
Interpolation.cpp LibWeb/CSS: Use PendingSubstitutionValue for unresolved shorthands 2025-05-14 11:46:47 +01:00
Interpolation.h LibWeb: Implement the transition-behavior CSS property 2025-05-02 11:07:19 +01:00
InvalidationSet.cpp LibWeb: Allow to early break from InvalidationSet::for_each_property() 2025-01-29 09:30:18 +01:00
InvalidationSet.h LibWeb: Allow to early break from InvalidationSet::for_each_property() 2025-01-29 09:30:18 +01:00
Keywords.json LibWeb: Parse and propagate touch-action CSS property 2025-05-06 12:22:01 +01:00
Length.cpp LibWeb: Scale font size by 1.15 for line-height: normal 2025-05-05 13:15:56 +02:00
Length.h LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
LengthBox.cpp
LengthBox.h LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
LinkStyle.idl
MathFunctions.json LibWeb/CSS: Add some FIXME comments for missing math-function features 2025-01-30 19:31:54 +01:00
MediaFeatures.json
MediaList.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
MediaList.h LibWeb: Invalidate style (and rule cache) on MediaList changes 2025-03-04 19:07:40 +01:00
MediaList.idl
MediaQuery.cpp LibWeb/CSS: Compare MediaFeatureValues using references not copies 2025-03-17 10:00:19 +00:00
MediaQuery.h LibWeb/CSS: Compare MediaFeatureValues using references not copies 2025-03-17 10:00:19 +00:00
MediaQueryList.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
MediaQueryList.h LibWeb: Don't lose change events on MediaQueryList internal state change 2025-02-13 20:52:31 +01:00
MediaQueryList.idl
MediaQueryListEvent.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
MediaQueryListEvent.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
MediaQueryListEvent.idl
Number.cpp LibWeb/CSS: Make non-finite Numbers serialize as themselves 2025-01-30 19:31:54 +01:00
Number.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
ParsedFontFace.cpp LibWeb/CSS: Use CSS::URL for font-fetching 2025-05-03 12:01:43 +01:00
ParsedFontFace.h LibWeb/CSS: Use CSS::URL for font-fetching 2025-05-03 12:01:43 +01:00
Percentage.h
PercentageOr.h LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
PreferredColorScheme.cpp
PreferredColorScheme.h
PreferredContrast.cpp
PreferredContrast.h
PreferredMotion.cpp
PreferredMotion.h
Properties.json LibWeb: Interpolate the content-visibility property correctly 2025-05-13 11:24:05 +01:00
PropertyName.h
PseudoClassBitmap.h LibWeb: Make :hover invalidation logic reusable for all pseudo classes 2025-04-17 19:45:55 +02:00
PseudoClasses.json LibWeb: Replace webkit meter-state pseudo-elements with pseudo-classes 2025-03-19 10:10:03 +00:00
PseudoElements.json LibWeb: Add support for trees of pseudo-elements 2025-05-13 12:38:42 +01:00
QuirksMode.css LibWeb/CSS: Update quirks-mode styling for form elements 2025-03-26 09:47:45 +00:00
Ratio.cpp
Ratio.h
Resolution.cpp
Resolution.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
Screen.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
Screen.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
Screen.idl LibWeb: Update Screen IDL definition to not inherit from EventTarget 2024-11-26 18:44:26 +01:00
ScreenOrientation.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
ScreenOrientation.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
ScreenOrientation.idl
Selector.cpp LibWeb: Make :hover invalidation logic reusable for all pseudo classes 2025-04-17 19:45:55 +02:00
Selector.h LibWeb: Make :hover invalidation logic reusable for all pseudo classes 2025-04-17 19:45:55 +02:00
SelectorEngine.cpp LibWeb: Invalidate sibling style for :only-child and :*-of-type 2025-05-07 14:55:12 +03:00
SelectorEngine.h LibWeb: Make :hover invalidation logic reusable for all pseudo classes 2025-04-17 19:45:55 +02:00
Serialize.cpp Everywhere: Remove sv suffix from format string literals 2025-04-08 20:00:18 -04:00
Serialize.h LibWeb/CSS: Serialize @font-face closer to spec 2025-04-07 10:00:21 +01:00
Size.cpp LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
Size.h LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
Sizing.cpp
Sizing.h
StyleComputer.cpp LibWeb/CSS: Use PendingSubstitutionValue for unresolved shorthands 2025-05-14 11:46:47 +01:00
StyleComputer.h LibWeb/CSS: Use CSS::URL for font-fetching 2025-05-03 12:01:43 +01:00
StyleInvalidation.cpp LibWeb: Update the layout tree when CSS text-transform changes 2025-03-08 20:22:01 +01:00
StyleInvalidation.h LibGC+LibWeb+LibJS: Remove workaround for Swift boolean bitfield issue 2025-04-04 13:06:53 -06:00
StyleInvalidationData.cpp LibWeb: Narrow :has() style invalidation to ancestor nodes 2025-02-10 01:13:53 +01:00
StyleInvalidationData.h LibWeb: Fix underinvalidation of :nth-child using invalidation sets 2025-01-25 10:16:21 +01:00
StyleProperty.cpp
StyleProperty.h
StyleSheet.cpp LibWeb/CSS: Store CSSStyleSheet location as a URL 2025-04-09 18:45:57 +01:00
StyleSheet.h LibWeb/CSS: Make it clear that StyleSheet::media() is never null 2025-04-09 18:45:57 +01:00
StyleSheet.idl
StyleSheetIdentifier.cpp LibWeb+WebContent: Include rule count in listed CSS style sheets 2025-03-13 16:56:28 -04:00
StyleSheetIdentifier.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
StyleSheetList.cpp LibWeb/CSS: Remove document-URL hack from create_a_style_sheet() 2025-05-03 12:01:43 +01:00
StyleSheetList.h LibWeb/CSS: Return GC::Ref from style sheet parsing methods 2025-04-15 09:40:38 +01:00
StyleSheetList.idl
Supports.cpp LibWeb: Implement CSSImportRule.supportsText 2025-03-19 16:42:51 +01:00
Supports.h LibWeb/CSS: Implement @supports font-format() and font-tech() 2025-03-17 10:00:19 +00:00
SystemColor.cpp LibWeb/CSS: Implement the color-scheme CSS property 2025-01-08 11:18:13 +00:00
SystemColor.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
Time.cpp LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
Time.h LibWeb: Make storage of CSS::StyleValues const-correct 2025-04-16 10:41:44 -06:00
Transformation.cpp LibWeb: Allow transform calculated length properties 2025-05-02 11:10:02 +01:00
Transformation.h
TransformFunctions.json LibWeb: Implement interpolation for CSS scale values 2025-04-25 14:08:12 +02:00
TransitionEvent.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
TransitionEvent.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
TransitionEvent.idl LibWeb/CSS: Add the TransitionEvent type 2024-12-25 17:14:08 +01:00
URL.cpp LibWeb/CSS: Parse and use CSS URL request modifiers 2025-05-03 23:22:40 +01:00
URL.h Meta: Enforce newlines around namespaces 2025-05-14 02:01:59 -06:00
VisualViewport.cpp LibWeb: Only set prototype once for object with IDL interface 2025-04-20 18:43:11 +02:00
VisualViewport.h LibGC+Everywhere: Factor out a LibGC from LibJS 2024-11-15 14:49:20 +01:00
VisualViewport.idl