← All issues

Implement calc-mix()

0f31efd

LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-mix-computed.tentative-expected.txt

+PASS calc-mix(1 75%, 3 75%) should be used-value-equivalent to 2
+PASS calc-mix(1 25%, 3 25%) should be used-value-equivalent to 1
+PASS calc-mix(1 25%, 3 25%, 5, 7) should be used-value-equivalent to 4
+PASS calc-mix(1px 0%) should be used-value-equivalent to 0px
+PASS calc-mix(1% 0%, 3px 0%) should be used-value-equivalent to 0%
+PASS calc-mix(1px 0%, 3% 0%) should be used-value-equivalent to 0px
+PASS calc-mix(1 * sibling-index() 50%, 3 50%) should be used-value-equivalent to 2
+PASS calc-mix(1 calc(50% * sibling-index()), 3 50%) should be used-value-equivalent to 2

WebKit의 CSS calc 시스템은 두 가지 병렬 트리 표현을 사용합니다. CSSCalcTree는 파싱/CSS 수준의 형태로, 파싱·검증·직렬화 단계에서 활용됩니다. StyleCalculationTree는 해석된/스타일 수준의 형태로, cascade와 computed value 해석 단계에서 사용됩니다. 새로운 calc 함수를 추가할 때는 두 트리 모두에서 복사·단순화·평가·직렬화·computed-style 의존성 추적 등 전체 pass를 거쳐야 합니다.

이 commit은 CSS Values Level 5에 정의된 calc-mix() 함수를 구현합니다. calc-mix()는 calc 항목 목록에 대한 가중 평균을 계산하는 함수로, parser·단순화·평가·직렬화·type 해석·스타일 해석 등 전체 pipeline에 걸쳐 구현되었습니다. 구현은 새로 도입된 CSSCalcMixEnabled preference 플래그로 활성화를 제어합니다.

calc-mix()는 가중 평균 노드를 도입합니다. 이 노드의 의미론은 percentage weight를 정규화하는 과정을 요구합니다. 합이 100%가 되지 않거나, 완전히 생략되거나, 모두 0%인 경우까지 모두 처리해야 합니다. 또한 이질적인 피연산자에 걸쳐 결과 type을 해석하는 과정도 필요합니다. 이 commit은 csswg-drafts issue #13839를 명시적으로 참조하며, 미확정된 spec 영역에서 구현이 독자적으로 판단을 내려야 하는 부분이 있음을 인정하고 있습니다.

WebKit에서 가장 복잡한 CSS 서브시스템 전반에 상당한 규모의 새로운 attack surface가 추가되었습니다. spec에는 단순화 의미론에 관한 미결 사항도 남아 있습니다. Weight 정규화, 이질적인 type 혼합, weight 인자 내의 tree-context 함수는 각각 spec이 명확히 정의하지 않은 edge case를 만들어냅니다. 구현은 이를 독자적으로 처리해야 합니다.

🔒

New weighted-average math function with open spec questions, type-mixing edge cases, and tree-context functions in weight arguments — several implementation paths worth security investigation.

더 확인하려면 구독해 주세요