diff options
5 files changed, 29 insertions, 15 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/ComputedValues.h b/Userland/Libraries/LibWeb/CSS/ComputedValues.h index a39b1f0703..98973e6077 100644 --- a/Userland/Libraries/LibWeb/CSS/ComputedValues.h +++ b/Userland/Libraries/LibWeb/CSS/ComputedValues.h @@ -69,9 +69,9 @@ struct Transformation { struct FlexBasisData { CSS::FlexBasis type { CSS::FlexBasis::Auto }; - CSS::Length length {}; + Optional<CSS::LengthPercentage> length_percentage; - bool is_definite() const { return type == CSS::FlexBasis::Length; } + bool is_definite() const { return type == CSS::FlexBasis::LengthPercentage; } }; struct BoxShadowData { diff --git a/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp b/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp index bdf93d0503..3e86ddff76 100644 --- a/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp +++ b/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp @@ -439,6 +439,13 @@ static NonnullRefPtr<StyleValue> value_or_default(Optional<StyleProperty> proper return default_style; } +static NonnullRefPtr<StyleValue> style_value_for_length_percentage(LengthPercentage const& length_percentage) +{ + if (length_percentage.is_percentage()) + return PercentageStyleValue::create(length_percentage.percentage()); + return LengthStyleValue::create(length_percentage.length()); +} + RefPtr<StyleValue> ResolvedCSSStyleDeclaration::style_value_for_property(Layout::NodeWithStyle const& layout_node, PropertyID property_id) const { switch (property_id) { @@ -474,8 +481,8 @@ RefPtr<StyleValue> ResolvedCSSStyleDeclaration::style_value_for_property(Layout: switch (layout_node.computed_values().flex_basis().type) { case FlexBasis::Content: return IdentifierStyleValue::create(CSS::ValueID::Content); - case FlexBasis::Length: - return LengthStyleValue::create(layout_node.computed_values().flex_basis().length); + case FlexBasis::LengthPercentage: + return style_value_for_length_percentage(*layout_node.computed_values().flex_basis().length_percentage); case FlexBasis::Auto: return IdentifierStyleValue::create(CSS::ValueID::Auto); default: diff --git a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp index 0dab63c216..f915f9a256 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp @@ -194,18 +194,22 @@ Optional<CSS::FlexWrap> StyleProperties::flex_wrap() const Optional<CSS::FlexBasisData> StyleProperties::flex_basis() const { - auto value = property(CSS::PropertyID::FlexBasis); - if (!value.has_value()) + auto maybe_value = property(CSS::PropertyID::FlexBasis); + if (!maybe_value.has_value()) return {}; + auto& value = maybe_value.value(); - if (value.value()->is_identifier() && value.value()->to_identifier() == CSS::ValueID::Content) + if (value->is_identifier() && value->to_identifier() == CSS::ValueID::Content) return { { CSS::FlexBasis::Content, {} } }; - if (value.value()->has_auto()) + if (value->has_auto()) return { { CSS::FlexBasis::Auto, {} } }; - if (value.value()->has_length()) - return { { CSS::FlexBasis::Length, value.value()->to_length() } }; + if (value->is_percentage()) + return { { CSS::FlexBasis::LengthPercentage, value->as_percentage().percentage() } }; + + if (value->has_length()) + return { { CSS::FlexBasis::LengthPercentage, value->to_length() } }; return {}; } diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index 93ef5f60c8..2d432d55e0 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -112,7 +112,7 @@ enum class Cursor { enum class FlexBasis { Content, - Length, + LengthPercentage, Auto, }; @@ -1185,7 +1185,7 @@ private: class PercentageStyleValue final : public StyleValue { public: - static NonnullRefPtr<PercentageStyleValue> create(Percentage&& percentage) + static NonnullRefPtr<PercentageStyleValue> create(Percentage percentage) { return adopt_ref(*new PercentageStyleValue(move(percentage))); } diff --git a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp index 8e7a573fed..11310d143e 100644 --- a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp @@ -17,9 +17,12 @@ namespace Web::Layout { -static float get_pixel_size(Box const& box, CSS::Length const& length) +static float get_pixel_size(Box const& box, CSS::LengthPercentage const& length_percentage) { - return length.resolved(CSS::Length::make_px(0), box, box.containing_block()->width()).to_px(box); + auto inner_main_size = CSS::Length::make_px(box.containing_block()->width()); + return length_percentage.resolved(inner_main_size) + .resolved(CSS::Length::make_px(0), box, box.containing_block()->width()) + .to_px(box); } FlexFormattingContext::FlexFormattingContext(Box& flex_container, FormattingContext* parent) @@ -461,7 +464,7 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size( // A. If the item has a definite used flex basis, thatโs the flex base size. if (used_flex_basis.is_definite()) { - auto specified_base_size = get_pixel_size(child_box, used_flex_basis.length); + auto specified_base_size = get_pixel_size(child_box, used_flex_basis.length_percentage.value()); if (specified_base_size == 0) return calculated_main_size(flex_item.box); return specified_base_size; |