1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-09 09:34:57 +09:00

LibWeb: Move PercentageOr and subclasses into PercentageOr.{h,cpp}

This solves an awkward dependency cycle, where CalculatedStyleValue
needs the definition of Percentage, but including that would also pull
in PercentageOr, which in turn needs CalculatedStyleValue.

Many places that previously included StyleValue.h no longer need to. :^)
This commit is contained in:
Sam Atkins 2023-03-30 17:13:37 +01:00 committed by Andreas Kling
parent 16e3a86393
commit 0c14103025
Notes: sideshowbarker 2024-07-17 10:05:47 +09:00
26 changed files with 265 additions and 259 deletions

View file

@ -51,7 +51,7 @@ set(SOURCES
CSS/Parser/Rule.cpp
CSS/Parser/Token.cpp
CSS/Parser/Tokenizer.cpp
CSS/Percentage.cpp
CSS/PercentageOr.cpp
CSS/Position.cpp
CSS/PreferredColorScheme.cpp
CSS/Ratio.cpp

View file

@ -8,13 +8,14 @@
#include <AK/Optional.h>
#include <LibWeb/CSS/BackdropFilter.h>
#include <LibWeb/CSS/CalculatedOr.h>
#include <LibWeb/CSS/Clip.h>
#include <LibWeb/CSS/Display.h>
#include <LibWeb/CSS/GridTrackPlacement.h>
#include <LibWeb/CSS/GridTrackSize.h>
#include <LibWeb/CSS/LengthBox.h>
#include <LibWeb/CSS/PercentageOr.h>
#include <LibWeb/CSS/Size.h>
#include <LibWeb/CSS/StyleValue.h>
#include <LibWeb/CSS/StyleValues/AbstractImageStyleValue.h>
#include <LibWeb/CSS/StyleValues/ShadowStyleValue.h>
#include <LibWeb/CSS/TransformFunctions.h>

View file

@ -6,9 +6,6 @@
#include "GridTrackSize.h"
#include <AK/String.h>
#include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -6,7 +6,6 @@
*/
#include "LengthBox.h"
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -6,7 +6,7 @@
#pragma once
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/PercentageOr.h>
namespace Web::CSS {

View file

@ -11,9 +11,10 @@
#include <AK/OwnPtr.h>
#include <AK/RefCounted.h>
#include <LibWeb/CSS/GeneralEnclosed.h>
#include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/MediaFeatureID.h>
#include <LibWeb/CSS/Ratio.h>
#include <LibWeb/CSS/StyleValue.h>
#include <LibWeb/CSS/Resolution.h>
namespace Web::CSS {

View file

@ -42,232 +42,4 @@ private:
float m_value;
};
bool calculated_style_value_contains_percentage(CalculatedStyleValue const&);
template<typename T>
class PercentageOr {
public:
PercentageOr(T t)
: m_value(move(t))
{
}
PercentageOr(Percentage percentage)
: m_value(move(percentage))
{
}
PercentageOr(NonnullRefPtr<CalculatedStyleValue> calculated)
: m_value(move(calculated))
{
}
virtual ~PercentageOr() = default;
PercentageOr<T>& operator=(T t)
{
m_value = move(t);
return *this;
}
PercentageOr<T>& operator=(Percentage percentage)
{
m_value = move(percentage);
return *this;
}
bool is_percentage() const { return m_value.template has<Percentage>(); }
bool is_calculated() const { return m_value.template has<NonnullRefPtr<CalculatedStyleValue>>(); }
bool contains_percentage() const
{
return m_value.visit(
[&](T const& t) {
if constexpr (requires { t.is_calculated(); }) {
if (t.is_calculated())
return calculated_style_value_contains_percentage(*t.calculated_style_value());
}
return false;
},
[&](Percentage const&) {
return true;
},
[&](NonnullRefPtr<CalculatedStyleValue> const& calculated) {
return calculated_style_value_contains_percentage(*calculated);
});
}
Percentage const& percentage() const
{
VERIFY(is_percentage());
return m_value.template get<Percentage>();
}
NonnullRefPtr<CalculatedStyleValue> const& calculated() const
{
VERIFY(is_calculated());
return m_value.template get<NonnullRefPtr<CalculatedStyleValue>>();
}
virtual T resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, [[maybe_unused]] Layout::Node const&, [[maybe_unused]] T const& reference_value) const
{
VERIFY_NOT_REACHED();
}
T resolved(Layout::Node const& layout_node, T const& reference_value) const
{
return m_value.visit(
[&](T const& t) {
if constexpr (requires { t.is_calculated(); }) {
if (t.is_calculated())
return resolve_calculated(t.calculated_style_value(), layout_node, reference_value);
}
return t;
},
[&](Percentage const& percentage) {
return reference_value.percentage_of(percentage);
},
[&](NonnullRefPtr<CalculatedStyleValue> const& calculated) {
return resolve_calculated(calculated, layout_node, reference_value);
});
}
ErrorOr<String> to_string() const
{
if (is_percentage())
return m_value.template get<Percentage>().to_string();
return m_value.template get<T>().to_string();
}
bool operator==(PercentageOr<T> const& other) const
{
if (is_calculated())
return false;
if (is_percentage() != other.is_percentage())
return false;
if (is_percentage())
return (m_value.template get<Percentage>() == other.m_value.template get<Percentage>());
return (m_value.template get<T>() == other.m_value.template get<T>());
}
protected:
bool is_t() const { return m_value.template has<T>(); }
T const& get_t() const { return m_value.template get<T>(); }
private:
Variant<T, Percentage, NonnullRefPtr<CalculatedStyleValue>> m_value;
};
template<typename T>
bool operator==(PercentageOr<T> const& percentage_or, T const& t)
{
return percentage_or == PercentageOr<T> { t };
}
template<typename T>
bool operator==(T const& t, PercentageOr<T> const& percentage_or)
{
return t == percentage_or;
}
template<typename T>
bool operator==(PercentageOr<T> const& percentage_or, Percentage const& percentage)
{
return percentage_or == PercentageOr<T> { percentage };
}
template<typename T>
bool operator==(Percentage const& percentage, PercentageOr<T> const& percentage_or)
{
return percentage == percentage_or;
}
class AnglePercentage : public PercentageOr<Angle> {
public:
using PercentageOr<Angle>::PercentageOr;
bool is_angle() const { return is_t(); }
Angle const& angle() const { return get_t(); }
virtual Angle resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, Layout::Node const&, Angle const& reference_value) const override;
};
class FrequencyPercentage : public PercentageOr<Frequency> {
public:
using PercentageOr<Frequency>::PercentageOr;
bool is_frequency() const { return is_t(); }
Frequency const& frequency() const { return get_t(); }
virtual Frequency resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, Layout::Node const&, Frequency const& reference_value) const override;
};
class LengthPercentage : public PercentageOr<Length> {
public:
using PercentageOr<Length>::PercentageOr;
bool is_auto() const { return is_length() && length().is_auto(); }
bool is_length() const { return is_t(); }
Length const& length() const { return get_t(); }
virtual Length resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, Layout::Node const&, Length const& reference_value) const override;
};
class TimePercentage : public PercentageOr<Time> {
public:
using PercentageOr<Time>::PercentageOr;
bool is_time() const { return is_t(); }
Time const& time() const { return get_t(); }
virtual Time resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, Layout::Node const&, Time const& reference_value) const override;
};
struct NumberPercentage : public PercentageOr<Number> {
public:
using PercentageOr<Number>::PercentageOr;
bool is_number() const { return is_t(); }
Number const& number() const { return get_t(); }
};
}
template<>
struct AK::Formatter<Web::CSS::Percentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::Percentage const& percentage)
{
return Formatter<StringView>::format(builder, TRY(percentage.to_string()));
}
};
template<>
struct AK::Formatter<Web::CSS::AnglePercentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::AnglePercentage const& angle_percentage)
{
return Formatter<StringView>::format(builder, TRY(angle_percentage.to_string()));
}
};
template<>
struct AK::Formatter<Web::CSS::FrequencyPercentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::FrequencyPercentage const& frequency_percentage)
{
return Formatter<StringView>::format(builder, TRY(frequency_percentage.to_string()));
}
};
template<>
struct AK::Formatter<Web::CSS::LengthPercentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::LengthPercentage const& length_percentage)
{
return Formatter<StringView>::format(builder, TRY(length_percentage.to_string()));
}
};
template<>
struct AK::Formatter<Web::CSS::TimePercentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::TimePercentage const& time_percentage)
{
return Formatter<StringView>::format(builder, TRY(time_percentage.to_string()));
}
};

View file

@ -1,11 +1,10 @@
/*
* Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
* Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/StyleValue.h>
#include "PercentageOr.h"
namespace Web::CSS {

View file

@ -0,0 +1,247 @@
/*
* Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/String.h>
#include <AK/Variant.h>
#include <LibWeb/CSS/Angle.h>
#include <LibWeb/CSS/Frequency.h>
#include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/Number.h>
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/StyleValue.h>
#include <LibWeb/CSS/Time.h>
namespace Web::CSS {
template<typename T>
class PercentageOr {
public:
PercentageOr(T t)
: m_value(move(t))
{
}
PercentageOr(Percentage percentage)
: m_value(move(percentage))
{
}
PercentageOr(NonnullRefPtr<CalculatedStyleValue> calculated)
: m_value(move(calculated))
{
}
virtual ~PercentageOr() = default;
PercentageOr<T>& operator=(T t)
{
m_value = move(t);
return *this;
}
PercentageOr<T>& operator=(Percentage percentage)
{
m_value = move(percentage);
return *this;
}
bool is_percentage() const { return m_value.template has<Percentage>(); }
bool is_calculated() const { return m_value.template has<NonnullRefPtr<CalculatedStyleValue>>(); }
bool contains_percentage() const
{
return m_value.visit(
[&](T const& t) {
if constexpr (requires { t.is_calculated(); }) {
if (t.is_calculated())
return t.calculated_style_value()->contains_percentage();
}
return false;
},
[&](Percentage const&) {
return true;
},
[&](NonnullRefPtr<CalculatedStyleValue> const& calculated) {
return calculated->contains_percentage();
});
}
Percentage const& percentage() const
{
VERIFY(is_percentage());
return m_value.template get<Percentage>();
}
NonnullRefPtr<CalculatedStyleValue> const& calculated() const
{
VERIFY(is_calculated());
return m_value.template get<NonnullRefPtr<CalculatedStyleValue>>();
}
virtual T resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, [[maybe_unused]] Layout::Node const&, [[maybe_unused]] T const& reference_value) const
{
VERIFY_NOT_REACHED();
}
T resolved(Layout::Node const& layout_node, T const& reference_value) const
{
return m_value.visit(
[&](T const& t) {
if constexpr (requires { t.is_calculated(); }) {
if (t.is_calculated())
return resolve_calculated(t.calculated_style_value(), layout_node, reference_value);
}
return t;
},
[&](Percentage const& percentage) {
return reference_value.percentage_of(percentage);
},
[&](NonnullRefPtr<CalculatedStyleValue> const& calculated) {
return resolve_calculated(calculated, layout_node, reference_value);
});
}
ErrorOr<String> to_string() const
{
if (is_percentage())
return m_value.template get<Percentage>().to_string();
return m_value.template get<T>().to_string();
}
bool operator==(PercentageOr<T> const& other) const
{
if (is_calculated())
return false;
if (is_percentage() != other.is_percentage())
return false;
if (is_percentage())
return (m_value.template get<Percentage>() == other.m_value.template get<Percentage>());
return (m_value.template get<T>() == other.m_value.template get<T>());
}
protected:
bool is_t() const { return m_value.template has<T>(); }
T const& get_t() const { return m_value.template get<T>(); }
private:
Variant<T, Percentage, NonnullRefPtr<CalculatedStyleValue>> m_value;
};
template<typename T>
bool operator==(PercentageOr<T> const& percentage_or, T const& t)
{
return percentage_or == PercentageOr<T> { t };
}
template<typename T>
bool operator==(T const& t, PercentageOr<T> const& percentage_or)
{
return t == percentage_or;
}
template<typename T>
bool operator==(PercentageOr<T> const& percentage_or, Percentage const& percentage)
{
return percentage_or == PercentageOr<T> { percentage };
}
template<typename T>
bool operator==(Percentage const& percentage, PercentageOr<T> const& percentage_or)
{
return percentage == percentage_or;
}
class AnglePercentage : public PercentageOr<Angle> {
public:
using PercentageOr<Angle>::PercentageOr;
bool is_angle() const { return is_t(); }
Angle const& angle() const { return get_t(); }
virtual Angle resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, Layout::Node const&, Angle const& reference_value) const override;
};
class FrequencyPercentage : public PercentageOr<Frequency> {
public:
using PercentageOr<Frequency>::PercentageOr;
bool is_frequency() const { return is_t(); }
Frequency const& frequency() const { return get_t(); }
virtual Frequency resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, Layout::Node const&, Frequency const& reference_value) const override;
};
class LengthPercentage : public PercentageOr<Length> {
public:
using PercentageOr<Length>::PercentageOr;
bool is_auto() const { return is_length() && length().is_auto(); }
bool is_length() const { return is_t(); }
Length const& length() const { return get_t(); }
virtual Length resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, Layout::Node const&, Length const& reference_value) const override;
};
class TimePercentage : public PercentageOr<Time> {
public:
using PercentageOr<Time>::PercentageOr;
bool is_time() const { return is_t(); }
Time const& time() const { return get_t(); }
virtual Time resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, Layout::Node const&, Time const& reference_value) const override;
};
struct NumberPercentage : public PercentageOr<Number> {
public:
using PercentageOr<Number>::PercentageOr;
bool is_number() const { return is_t(); }
Number const& number() const { return get_t(); }
};
}
template<>
struct AK::Formatter<Web::CSS::Percentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::Percentage const& percentage)
{
return Formatter<StringView>::format(builder, TRY(percentage.to_string()));
}
};
template<>
struct AK::Formatter<Web::CSS::AnglePercentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::AnglePercentage const& angle_percentage)
{
return Formatter<StringView>::format(builder, TRY(angle_percentage.to_string()));
}
};
template<>
struct AK::Formatter<Web::CSS::FrequencyPercentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::FrequencyPercentage const& frequency_percentage)
{
return Formatter<StringView>::format(builder, TRY(frequency_percentage.to_string()));
}
};
template<>
struct AK::Formatter<Web::CSS::LengthPercentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::LengthPercentage const& length_percentage)
{
return Formatter<StringView>::format(builder, TRY(length_percentage.to_string()));
}
};
template<>
struct AK::Formatter<Web::CSS::TimePercentage> : Formatter<StringView> {
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::TimePercentage const& time_percentage)
{
return Formatter<StringView>::format(builder, TRY(time_percentage.to_string()));
}
};

View file

@ -7,7 +7,6 @@
#include "Position.h"
#include <LibGfx/Point.h>
#include <LibGfx/Rect.h>
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -6,7 +6,7 @@
#pragma once
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/PercentageOr.h>
#include <LibWeb/PixelUnits.h>
namespace Web::CSS {

View file

@ -5,7 +5,6 @@
*/
#include "Resolution.h"
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -4,9 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/Size.h>
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -8,7 +8,7 @@
#pragma once
#include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/PercentageOr.h>
namespace Web::CSS {

View file

@ -13,7 +13,6 @@
#include <LibWeb/CSS/ComputedValues.h>
#include <LibWeb/CSS/LengthBox.h>
#include <LibWeb/CSS/PropertyID.h>
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -1073,9 +1073,4 @@ bool CalculatedStyleValue::CalcValue::contains_percentage() const
[](auto const&) { return false; });
}
bool calculated_style_value_contains_percentage(CalculatedStyleValue const& value)
{
return value.contains_percentage();
}
}

View file

@ -10,6 +10,7 @@
#pragma once
#include <LibWeb/CSS/Enums.h>
#include <LibWeb/CSS/PercentageOr.h>
#include <LibWeb/CSS/Serialize.h>
#include <LibWeb/CSS/StyleValue.h>

View file

@ -10,7 +10,7 @@
#pragma once
#include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/PercentageOr.h>
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -10,7 +10,7 @@
#pragma once
#include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/PercentageOr.h>
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -9,6 +9,7 @@
#pragma once
#include <LibWeb/CSS/Angle.h>
#include <LibWeb/CSS/Position.h>
#include <LibWeb/CSS/StyleValues/AbstractImageStyleValue.h>
#include <LibWeb/Painting/GradientPainting.h>

View file

@ -12,8 +12,7 @@
#include <LibWeb/CSS/Angle.h>
#include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/Number.h>
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/StyleValue.h>
#include <LibWeb/CSS/PercentageOr.h>
namespace Web::CSS {

View file

@ -10,6 +10,8 @@
#pragma once
#include <AK/Vector.h>
#include <LibWeb/CSS/Angle.h>
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/StyleValues/AbstractImageStyleValue.h>
#include <LibWeb/Painting/GradientPainting.h>

View file

@ -10,7 +10,7 @@
#pragma once
#include <LibWeb/CSS/Enums.h>
#include <LibWeb/CSS/Percentage.h>
#include <LibWeb/CSS/PercentageOr.h>
#include <LibWeb/CSS/StyleValue.h>
namespace Web::CSS {

View file

@ -5,7 +5,6 @@
*/
#include <LibWeb/CSS/StyleProperties.h>
#include <LibWeb/CSS/StyleValue.h>
#include <LibWeb/CSS/StyleValues/ColorStyleValue.h>
#include <LibWeb/CSS/StyleValues/ImageStyleValue.h>
#include <LibWeb/DOM/Document.h>

View file

@ -6,7 +6,6 @@
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/CSS/StyleProperties.h>
#include <LibWeb/CSS/StyleValue.h>
#include <LibWeb/CSS/StyleValues/ColorStyleValue.h>
#include <LibWeb/HTML/HTMLFontElement.h>

View file

@ -6,7 +6,6 @@
#include <AK/Math.h>
#include <LibGfx/Gradients.h>
#include <LibWeb/CSS/StyleValue.h>
#include <LibWeb/CSS/StyleValues/ConicGradientStyleValue.h>
#include <LibWeb/CSS/StyleValues/LinearGradientStyleValue.h>
#include <LibWeb/CSS/StyleValues/RadialGradientStyleValue.h>