Content-Length: 460732 | pFad | http://github.com/movableink/webkit/commit/ec9a56a840606019ab5d3929520a53c02ad4f5ea

32 [CSS Container Queries] Use element writing mode for unit resolution · movableink/webkit@ec9a56a · GitHub
Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ec9a56a

Browse files
anttijkmnutt
authored andcommittedJul 15, 2023
[CSS Container Queries] Use element writing mode for unit resolution
https://bugs.webkit.org/show_bug.cgi?id=258722 rdar://111565488 Reviewed by Simon Fraser. Correct handling for vertical writing mode per w3c/csswg-drafts#6873 * LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-units-in-at-container-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-units-selection-expected.txt: * Source/WebCore/css/CSSPrimitiveValue.cpp: (WebCore::CSSPrimitiveValue::computeNonCalcLengthDouble): Resolve logical to to physical axis based on the element writing mode. Also explicitly fall back to small viewport units to guarantee consistency. Canonical link: https://commits.webkit.org/265654@main
1 parent b65435e commit ec9a56a

File tree

3 files changed

+30
-20
lines changed

3 files changed

+30
-20
lines changed
 

‎LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-units-in-at-container-expected.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ PASS cqmin unit resolves against appropriate container (vertical writing-mode on
1515
PASS cqmax unit resolves against appropriate container (vertical writing-mode on subject)
1616
PASS cqw unit resolves against appropriate container (vertical writing-mode on container)
1717
PASS cqh unit resolves against appropriate container (vertical writing-mode on container)
18-
FAIL cqi unit resolves against appropriate container (vertical writing-mode on container) assert_equals: expected "true" but got ""
19-
FAIL cqb unit resolves against appropriate container (vertical writing-mode on container) assert_equals: expected "true" but got ""
18+
PASS cqi unit resolves against appropriate container (vertical writing-mode on container)
19+
PASS cqb unit resolves against appropriate container (vertical writing-mode on container)
2020
PASS cqmin unit resolves against appropriate container (vertical writing-mode on container)
2121
PASS cqmax unit resolves against appropriate container (vertical writing-mode on container)
2222

Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Test
22

33
PASS Container units select the proper container
4-
FAIL Units respond to the writing-mode of the element assert_equals: expected "40px" but got "30px"
4+
PASS Units respond to the writing-mode of the element
55

‎Source/WebCore/css/CSSPrimitiveValue.cpp

+27-17
Original file line numberDiff line numberDiff line change
@@ -777,16 +777,26 @@ double CSSPrimitiveValue::computeUnzoomedNonCalcLengthDouble(CSSUnitType primiti
777777

778778
double CSSPrimitiveValue::computeNonCalcLengthDouble(const CSSToLengthConversionData& conversionData, CSSUnitType primitiveType, double value)
779779
{
780-
auto selectContainerRenderer = [&](CQ::Axis axis) -> const RenderBox* {
780+
auto resolveContainerUnit = [&](CQ::Axis physicalAxis) -> std::optional<double> {
781+
ASSERT(physicalAxis == CQ::Axis::Width || physicalAxis == CQ::Axis::Height);
782+
781783
conversionData.setUsesContainerUnits();
784+
782785
auto* element = conversionData.elementForContainerUnitResolution();
783786
if (!element)
784-
return nullptr;
787+
return { };
788+
785789
// FIXME: Use cached query containers when available.
786-
auto* container = Style::ContainerQueryEvaluator::selectContainer(axis, nullString(), *element);
790+
auto* container = Style::ContainerQueryEvaluator::selectContainer(physicalAxis, nullString(), *element);
787791
if (!container)
788-
return nullptr;
789-
return dynamicDowncast<RenderBox>(container->renderer());
792+
return { };
793+
794+
auto* containerRenderer = dynamicDowncast<RenderBox>(container->renderer());
795+
if (!containerRenderer)
796+
return { };
797+
798+
auto widthOrHeight = physicalAxis == CQ::Axis::Width ? containerRenderer->contentWidth() : containerRenderer->contentHeight();
799+
return widthOrHeight * value / 100;
790800
};
791801

792802
switch (primitiveType) {
@@ -904,27 +914,27 @@ double CSSPrimitiveValue::computeNonCalcLengthDouble(const CSSToLengthConversion
904914
break;
905915

906916
case CSSUnitType::CSS_CQW: {
907-
if (auto* containerRenderer = selectContainerRenderer(CQ::Axis::Width))
908-
return containerRenderer->contentWidth() * value / 100;
909-
return value * conversionData.smallViewportFactor().width();
917+
if (auto resolvedValue = resolveContainerUnit(CQ::Axis::Width))
918+
return *resolvedValue;
919+
return computeNonCalcLengthDouble(conversionData, CSSUnitType::CSS_SVW, value);
910920
}
911921

912922
case CSSUnitType::CSS_CQH: {
913-
if (auto* containerRenderer = selectContainerRenderer(CQ::Axis::Height))
914-
return containerRenderer->contentHeight() * value / 100;
915-
return value * conversionData.smallViewportFactor().height();
923+
if (auto resolvedValue = resolveContainerUnit(CQ::Axis::Height))
924+
return *resolvedValue;
925+
return computeNonCalcLengthDouble(conversionData, CSSUnitType::CSS_SVH, value);
916926
}
917927

918928
case CSSUnitType::CSS_CQI: {
919-
if (auto* containerRenderer = selectContainerRenderer(CQ::Axis::Inline))
920-
return containerRenderer->contentLogicalWidth() * value / 100;
921-
return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, conversionData.smallViewportFactor(), conversionData.rootStyle());
929+
if (auto resolvedValue = resolveContainerUnit(conversionData.style()->isHorizontalWritingMode() ? CQ::Axis::Width : CQ::Axis::Height))
930+
return *resolvedValue;
931+
return computeNonCalcLengthDouble(conversionData, CSSUnitType::CSS_SVI, value);
922932
}
923933

924934
case CSSUnitType::CSS_CQB: {
925-
if (auto* containerRenderer = selectContainerRenderer(CQ::Axis::Block))
926-
return containerRenderer->contentLogicalHeight() * value / 100;
927-
return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, conversionData.smallViewportFactor(), conversionData.rootStyle());
935+
if (auto resolvedValue = resolveContainerUnit(conversionData.style()->isHorizontalWritingMode() ? CQ::Axis::Height : CQ::Axis::Width))
936+
return *resolvedValue;
937+
return computeNonCalcLengthDouble(conversionData, CSSUnitType::CSS_SVB, value);
928938
}
929939

930940
case CSSUnitType::CSS_CQMAX:

0 commit comments

Comments
 (0)
Failed to load comments.








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/movableink/webkit/commit/ec9a56a840606019ab5d3929520a53c02ad4f5ea

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy