diff --git a/Libraries/LibWeb/CSS/ComputedProperties.cpp b/Libraries/LibWeb/CSS/ComputedProperties.cpp index 43b13a9b3e1..b0016abf739 100644 --- a/Libraries/LibWeb/CSS/ComputedProperties.cpp +++ b/Libraries/LibWeb/CSS/ComputedProperties.cpp @@ -640,15 +640,30 @@ TransformBox ComputedProperties::transform_box() const TransformOrigin ComputedProperties::transform_origin() const { + auto length_percentage_with_keywords_resolved = [](CSSStyleValue const& value) -> Optional { + if (value.is_keyword()) { + auto keyword = value.to_keyword(); + if (keyword == Keyword::Left || keyword == Keyword::Top) + return Percentage(0); + if (keyword == Keyword::Center) + return Percentage(50); + if (keyword == Keyword::Right || keyword == Keyword::Bottom) + return Percentage(100); + + VERIFY_NOT_REACHED(); + } + return length_percentage_for_style_value(value); + }; + auto const& value = property(PropertyID::TransformOrigin); if (!value.is_value_list() || value.as_value_list().size() != 2) return {}; auto const& list = value.as_value_list(); - auto x_value = length_percentage_for_style_value(list.values()[0]); - auto y_value = length_percentage_for_style_value(list.values()[1]); - if (!x_value.has_value() || !y_value.has_value()) { + + auto x_value = length_percentage_with_keywords_resolved(list.values()[0]); + auto y_value = length_percentage_with_keywords_resolved(list.values()[1]); + if (!x_value.has_value() || !y_value.has_value()) return {}; - } return { x_value.value(), y_value.value() }; } diff --git a/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp b/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp index a7f0ca017ca..373229c45da 100644 --- a/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp @@ -3830,15 +3830,15 @@ RefPtr Parser::parse_transform_origin_value(TokenStreamis_keyword()) { switch (value->to_keyword()) { case Keyword::Top: - return AxisOffset { Axis::Y, PercentageStyleValue::create(Percentage(0)) }; + return AxisOffset { Axis::Y, value.release_nonnull() }; case Keyword::Left: - return AxisOffset { Axis::X, PercentageStyleValue::create(Percentage(0)) }; + return AxisOffset { Axis::X, value.release_nonnull() }; case Keyword::Center: - return AxisOffset { Axis::None, PercentageStyleValue::create(Percentage(50)) }; + return AxisOffset { Axis::None, value.release_nonnull() }; case Keyword::Bottom: - return AxisOffset { Axis::Y, PercentageStyleValue::create(Percentage(100)) }; + return AxisOffset { Axis::Y, value.release_nonnull() }; case Keyword::Right: - return AxisOffset { Axis::X, PercentageStyleValue::create(Percentage(100)) }; + return AxisOffset { Axis::X, value.release_nonnull() }; default: return OptionalNone {}; } @@ -3866,9 +3866,9 @@ RefPtr Parser::parse_transform_origin_value(TokenStreamaxis) { case Axis::None: case Axis::X: - return make_list(single_value->offset, PercentageStyleValue::create(Percentage(50))); + return make_list(single_value->offset, CSSKeywordValue::create(Keyword::Center)); case Axis::Y: - return make_list(PercentageStyleValue::create(Percentage(50)), single_value->offset); + return make_list(CSSKeywordValue::create(Keyword::Center), single_value->offset); } VERIFY_NOT_REACHED(); } diff --git a/Tests/LibWeb/Text/expected/css/transform-origin-serialization.txt b/Tests/LibWeb/Text/expected/css/transform-origin-serialization.txt index 90d8bcd353a..c0614686aae 100644 --- a/Tests/LibWeb/Text/expected/css/transform-origin-serialization.txt +++ b/Tests/LibWeb/Text/expected/css/transform-origin-serialization.txt @@ -1,7 +1,7 @@ -center => 50% 50% -10px => 10px 50% -25% => 25% 50% -left 20% => 0% 20% -20px bottom => 20px 100% -top right => 100% 0% +center => center center +10px => 10px center +25% => 25% center +left 20% => left 20% +20px bottom => 20px bottom +top right => right top "center" => (invalid) diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-transforms/parsing/transform-origin-invalid.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-transforms/parsing/transform-origin-invalid.txt new file mode 100644 index 00000000000..680c1faea29 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-transforms/parsing/transform-origin-invalid.txt @@ -0,0 +1,16 @@ +Harness status: OK + +Found 10 tests + +8 Pass +2 Fail +Pass e.style['transform-origin'] = "1px 2px 3%" should not set the property value +Pass e.style['transform-origin'] = "1px 2px left" should not set the property value +Pass e.style['transform-origin'] = "1px 2px 3px 4px" should not set the property value +Fail e.style['transform-origin'] = "1px left" should not set the property value +Fail e.style['transform-origin'] = "top 1px" should not set the property value +Pass e.style['transform-origin'] = "right left" should not set the property value +Pass e.style['transform-origin'] = "top bottom" should not set the property value +Pass e.style['transform-origin'] = "bottom 10% right 20%" should not set the property value +Pass e.style['transform-origin'] = "right 30% top -60px" should not set the property value +Pass e.style['transform-origin'] = "right 20px bottom 30px" should not set the property value \ No newline at end of file diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-transforms/parsing/transform-origin-valid.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-transforms/parsing/transform-origin-valid.txt new file mode 100644 index 00000000000..66b3b461050 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-transforms/parsing/transform-origin-valid.txt @@ -0,0 +1,22 @@ +Harness status: OK + +Found 16 tests + +12 Pass +4 Fail +Pass e.style['transform-origin'] = "left" should set the property value +Pass e.style['transform-origin'] = "center" should set the property value +Pass e.style['transform-origin'] = "right" should set the property value +Pass e.style['transform-origin'] = "top" should set the property value +Pass e.style['transform-origin'] = "bottom" should set the property value +Pass e.style['transform-origin'] = "-1px" should set the property value +Pass e.style['transform-origin'] = "calc(2em + 3ex)" should set the property value +Pass e.style['transform-origin'] = "-4%" should set the property value +Pass e.style['transform-origin'] = "left center" should set the property value +Pass e.style['transform-origin'] = "center top" should set the property value +Pass e.style['transform-origin'] = "right -4%" should set the property value +Fail e.style['transform-origin'] = "-1px bottom 5px" should set the property value +Fail e.style['transform-origin'] = "center left 6px" should set the property value +Pass e.style['transform-origin'] = "top center" should set the property value +Fail e.style['transform-origin'] = "bottom right 7px" should set the property value +Fail e.style['transform-origin'] = "-1px -2px -3px" should set the property value \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/css/css-transforms/parsing/transform-origin-invalid.html b/Tests/LibWeb/Text/input/wpt-import/css/css-transforms/parsing/transform-origin-invalid.html new file mode 100644 index 00000000000..49ac358244e --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/css-transforms/parsing/transform-origin-invalid.html @@ -0,0 +1,27 @@ + + + + +CSS Transform Module Level 1: parsing transform-origin with invalid values + + + + + + + + + + diff --git a/Tests/LibWeb/Text/input/wpt-import/css/css-transforms/parsing/transform-origin-valid.html b/Tests/LibWeb/Text/input/wpt-import/css/css-transforms/parsing/transform-origin-valid.html new file mode 100644 index 00000000000..0eb80932919 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/css-transforms/parsing/transform-origin-valid.html @@ -0,0 +1,34 @@ + + + + +CSS Transform Module Level 1: parsing transform-origin with valid values + + + + + + + + + +