LibWeb/CSS: Pass Length::ResolutionContext to resolve_integer

The length resolution context might be needed even when resolving an
integer value, since it might contain a sign() function with length
values inside. This fixes a WPT subtest.
This commit is contained in:
Milo van der Tier 2024-11-29 16:41:40 +01:00 committed by Sam Atkins
commit 1882a2e19b
Notes: github-actions[bot] 2024-12-04 12:38:56 +00:00
7 changed files with 75 additions and 17 deletions

View file

@ -90,12 +90,12 @@ bool MediaFeature::evaluate(HTML::Window const& window) const
return false;
auto queried_value = maybe_queried_value.release_value();
auto resolution_context = Length::ResolutionContext::for_window(window);
switch (m_type) {
case Type::IsTrue:
if (queried_value.is_integer())
return queried_value.integer().resolved() != 0;
return queried_value.integer().resolved(resolution_context) != 0;
if (queried_value.is_length()) {
auto resolution_context = Length::ResolutionContext::for_window(window);
auto length = queried_value.length().resolved(resolution_context);
return length.raw_value() != 0;
}
@ -149,17 +149,18 @@ bool MediaFeature::compare(HTML::Window const& window, MediaFeatureValue left, C
}
if (left.is_integer()) {
auto resolution_context = Length::ResolutionContext::for_window(window);
switch (comparison) {
case Comparison::Equal:
return left.integer().resolved() == right.integer().resolved();
return left.integer().resolved(resolution_context) == right.integer().resolved(resolution_context);
case Comparison::LessThan:
return left.integer().resolved() < right.integer().resolved();
return left.integer().resolved(resolution_context) < right.integer().resolved(resolution_context);
case Comparison::LessThanOrEqual:
return left.integer().resolved() <= right.integer().resolved();
return left.integer().resolved(resolution_context) <= right.integer().resolved(resolution_context);
case Comparison::GreaterThan:
return left.integer().resolved() > right.integer().resolved();
return left.integer().resolved(resolution_context) > right.integer().resolved(resolution_context);
case Comparison::GreaterThanOrEqual:
return left.integer().resolved() >= right.integer().resolved();
return left.integer().resolved(resolution_context) >= right.integer().resolved(resolution_context);
}
VERIFY_NOT_REACHED();
}