diff --git a/Libraries/LibWeb/CSS/MediaQuery.cpp b/Libraries/LibWeb/CSS/MediaQuery.cpp index d8ffbad6f42..6e8afb871b1 100644 --- a/Libraries/LibWeb/CSS/MediaQuery.cpp +++ b/Libraries/LibWeb/CSS/MediaQuery.cpp @@ -82,10 +82,14 @@ String MediaFeature::to_string() const return MUST(String::formatted("max-{}: {}", string_from_media_feature_id(m_id), value().to_string())); case Type::Range: { auto& range = this->range(); - if (!range.right_comparison.has_value()) - return MUST(String::formatted("{} {} {}", range.left_value.to_string(), comparison_string(range.left_comparison), string_from_media_feature_id(m_id))); + StringBuilder builder; + if (range.left_comparison.has_value()) + builder.appendff("{} {} ", range.left_value->to_string(), comparison_string(*range.left_comparison)); + builder.append(string_from_media_feature_id(m_id)); + if (range.right_comparison.has_value()) + builder.appendff(" {} {}", comparison_string(*range.right_comparison), range.right_value->to_string()); - return MUST(String::formatted("{} {} {} {} {}", range.left_value.to_string(), comparison_string(range.left_comparison), string_from_media_feature_id(m_id), comparison_string(*range.right_comparison), range.right_value->to_string())); + return builder.to_string_without_validation(); } } @@ -137,12 +141,15 @@ MatchResult MediaFeature::evaluate(HTML::Window const* window) const case Type::Range: { auto const& range = this->range(); - if (auto const left_result = compare(*window, range.left_value, range.left_comparison, queried_value); left_result != MatchResult::True) - return left_result; + if (range.left_comparison.has_value()) { + if (auto const left_result = compare(*window, *range.left_value, *range.left_comparison, queried_value); left_result != MatchResult::True) + return left_result; + } - if (range.right_comparison.has_value()) + if (range.right_comparison.has_value()) { if (auto const right_result = compare(*window, queried_value, *range.right_comparison, *range.right_value); right_result != MatchResult::True) return right_result; + } return MatchResult::True; } diff --git a/Libraries/LibWeb/CSS/MediaQuery.h b/Libraries/LibWeb/CSS/MediaQuery.h index 37a0199c9e2..9bcd12042f2 100644 --- a/Libraries/LibWeb/CSS/MediaQuery.h +++ b/Libraries/LibWeb/CSS/MediaQuery.h @@ -132,7 +132,6 @@ public: return adopt_own(*new MediaFeature(Type::MaxValue, id, move(value))); } - // Corresponds to `` grammar, with a single comparison static NonnullOwnPtr half_range(MediaFeatureValue value, Comparison comparison, MediaFeatureID id) { return adopt_own(*new MediaFeature(Type::Range, id, @@ -141,6 +140,14 @@ public: .left_comparison = comparison, })); } + static NonnullOwnPtr half_range(MediaFeatureID id, Comparison comparison, MediaFeatureValue value) + { + return adopt_own(*new MediaFeature(Type::Range, id, + Range { + .right_comparison = comparison, + .right_value = move(value), + })); + } // Corresponds to `` grammar, with two comparisons static NonnullOwnPtr range(MediaFeatureValue left_value, Comparison left_comparison, MediaFeatureID id, Comparison right_comparison, MediaFeatureValue right_value) @@ -168,8 +175,8 @@ private: }; struct Range { - MediaFeatureValue left_value; - Comparison left_comparison; + Optional left_value {}; + Optional left_comparison {}; Optional right_comparison {}; Optional right_value {}; }; diff --git a/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp b/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp index 7eef57891c0..56586fcaf07 100644 --- a/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp @@ -274,22 +274,6 @@ OwnPtr Parser::parse_media_feature(TokenStream& to return {}; }; - auto flip = [](MediaFeature::Comparison comparison) { - switch (comparison) { - case MediaFeature::Comparison::Equal: - return MediaFeature::Comparison::Equal; - case MediaFeature::Comparison::LessThan: - return MediaFeature::Comparison::GreaterThan; - case MediaFeature::Comparison::LessThanOrEqual: - return MediaFeature::Comparison::GreaterThanOrEqual; - case MediaFeature::Comparison::GreaterThan: - return MediaFeature::Comparison::LessThan; - case MediaFeature::Comparison::GreaterThanOrEqual: - return MediaFeature::Comparison::LessThanOrEqual; - } - VERIFY_NOT_REACHED(); - }; - auto comparisons_match = [](MediaFeature::Comparison a, MediaFeature::Comparison b) -> bool { switch (a) { case MediaFeature::Comparison::Equal: @@ -322,7 +306,7 @@ OwnPtr Parser::parse_media_feature(TokenStream& to tokens.discard_whitespace(); if (!tokens.has_next_token() && !maybe_value->is_ident()) { transaction.commit(); - return MediaFeature::half_range(maybe_value.release_value(), flip(maybe_comparison.release_value()), maybe_name->id); + return MediaFeature::half_range(maybe_name->id, maybe_comparison.release_value(), maybe_value.release_value()); } } } diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-nesting/nested-declarations-cssom-whitespace.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-nesting/nested-declarations-cssom-whitespace.txt index 2d94c4eb749..d3e36016400 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/css/css-nesting/nested-declarations-cssom-whitespace.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-nesting/nested-declarations-cssom-whitespace.txt @@ -2,7 +2,6 @@ Harness status: OK Found 2 tests -1 Pass -1 Fail +2 Pass Pass Empty CSSNestedDeclarations do not affect outer serialization -Fail Empty CSSNestedDeclarations do not affect outer serialization (nested grouping rule) \ No newline at end of file +Pass Empty CSSNestedDeclarations do not affect outer serialization (nested grouping rule) \ No newline at end of file diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/mediaqueries/prefers-contrast.txt b/Tests/LibWeb/Text/expected/wpt-import/css/mediaqueries/prefers-contrast.txt index 3a35ab8b0de..3ddf0ad63a0 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/css/mediaqueries/prefers-contrast.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/css/mediaqueries/prefers-contrast.txt @@ -2,8 +2,7 @@ Harness status: OK Found 26 tests -25 Pass -1 Fail +26 Pass Pass Should be known: '(prefers-contrast)' Pass Should be known: '(prefers-contrast: no-preference)' Pass Should be known: '(prefers-contrast: more)' @@ -17,7 +16,7 @@ Pass Should be parseable: '(prefers-contrast: forced high)' Pass Should be unknown: '(prefers-contrast: forced high)' Pass Should be parseable: '(prefers-contrast: forced low)' Pass Should be unknown: '(prefers-contrast: forced low)' -Fail Should be parseable: '(prefers-contrast > increase)' +Pass Should be parseable: '(prefers-contrast > increase)' Pass Should be unknown: '(prefers-contrast > increase)' Pass Should be parseable: '(prefers-increased-contrast)' Pass Should be unknown: '(prefers-increased-contrast)'