LibWeb/CSS: Implement pending-substitution value

This is a special value temporarily assigned to longhands when their
shorthand is unresolved, and then later replaced once that is resolved.
This commit is contained in:
Sam Atkins 2025-03-12 19:24:59 +00:00
parent 13ec08c27c
commit cc02778ef6
4 changed files with 48 additions and 0 deletions

View file

@ -46,6 +46,7 @@
#include <LibWeb/CSS/StyleValues/MathDepthStyleValue.h>
#include <LibWeb/CSS/StyleValues/NumberStyleValue.h>
#include <LibWeb/CSS/StyleValues/OpenTypeTaggedStyleValue.h>
#include <LibWeb/CSS/StyleValues/PendingSubstitutionStyleValue.h>
#include <LibWeb/CSS/StyleValues/PercentageStyleValue.h>
#include <LibWeb/CSS/StyleValues/PositionStyleValue.h>
#include <LibWeb/CSS/StyleValues/RadialGradientStyleValue.h>
@ -281,6 +282,12 @@ OpenTypeTaggedStyleValue const& CSSStyleValue::as_open_type_tagged() const
return static_cast<OpenTypeTaggedStyleValue const&>(*this);
}
PendingSubstitutionStyleValue const& CSSStyleValue::as_pending_substitution() const
{
VERIFY(is_pending_substitution());
return static_cast<PendingSubstitutionStyleValue const&>(*this);
}
PercentageStyleValue const& CSSStyleValue::as_percentage() const
{
VERIFY(is_percentage());

View file

@ -120,6 +120,7 @@ public:
MathDepth,
Number,
OpenTypeTagged,
PendingSubstitution,
Percentage,
Position,
RadialGradient,
@ -284,6 +285,10 @@ public:
OpenTypeTaggedStyleValue const& as_open_type_tagged() const;
OpenTypeTaggedStyleValue& as_open_type_tagged() { return const_cast<OpenTypeTaggedStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_open_type_tagged()); }
bool is_pending_substitution() const { return type() == Type::PendingSubstitution; }
PendingSubstitutionStyleValue const& as_pending_substitution() const;
PendingSubstitutionStyleValue& as_pending_substitution() { return const_cast<PendingSubstitutionStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_pending_substitution()); }
bool is_percentage() const { return type() == Type::Percentage; }
PercentageStyleValue const& as_percentage() const;
PercentageStyleValue& as_percentage() { return const_cast<PercentageStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_percentage()); }

View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWeb/CSS/CSSStyleValue.h>
namespace Web::CSS {
// https://drafts.csswg.org/css-values-5/#pending-substitution-value
class PendingSubstitutionStyleValue final : public StyleValueWithDefaultOperators<PendingSubstitutionStyleValue> {
public:
static ValueComparingNonnullRefPtr<PendingSubstitutionStyleValue> create()
{
static ValueComparingNonnullRefPtr<PendingSubstitutionStyleValue> instance = adopt_ref(*new (nothrow) PendingSubstitutionStyleValue());
return instance;
}
virtual ~PendingSubstitutionStyleValue() override = default;
virtual String to_string(SerializationMode) const override { return {}; }
// We shouldn't need to compare these, but in case we do: The nature of them is that their value is unknown, so
// consider them all to be unique.
bool properties_equal(PendingSubstitutionStyleValue const&) const { return false; }
private:
PendingSubstitutionStyleValue()
: StyleValueWithDefaultOperators(Type::PendingSubstitution)
{
}
};
}

View file

@ -233,6 +233,7 @@ class NumberOrCalculated;
class NumberStyleValue;
class OpenTypeTaggedStyleValue;
class ParsedFontFace;
class PendingSubstitutionStyleValue;
class Percentage;
class PercentageOrCalculated;
class PercentageStyleValue;