diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 1f4c04ec9f..de425eacb7 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -7770,6 +7770,14 @@ const UnitInfo UnitData[] = { { STR_WITH_LEN("dvh"), eCSSUnit_DynamicViewportHeight, VARIANT_LENGTH }, { STR_WITH_LEN("dvmin"), eCSSUnit_DynamicViewportMin, VARIANT_LENGTH }, { STR_WITH_LEN("dvmax"), eCSSUnit_DynamicViewportMax, VARIANT_LENGTH }, + { STR_WITH_LEN("vb"), eCSSUnit_ViewportBlock, VARIANT_LENGTH }, + { STR_WITH_LEN("vi"), eCSSUnit_ViewportInline, VARIANT_LENGTH }, + { STR_WITH_LEN("svb"), eCSSUnit_SmallViewportBlock, VARIANT_LENGTH }, + { STR_WITH_LEN("svi"), eCSSUnit_SmallViewportInline, VARIANT_LENGTH }, + { STR_WITH_LEN("lvb"), eCSSUnit_LargeViewportBlock, VARIANT_LENGTH }, + { STR_WITH_LEN("lvi"), eCSSUnit_LargeViewportInline, VARIANT_LENGTH }, + { STR_WITH_LEN("dvb"), eCSSUnit_DynamicViewportBlock, VARIANT_LENGTH }, + { STR_WITH_LEN("dvi"), eCSSUnit_DynamicViewportInline, VARIANT_LENGTH }, { STR_WITH_LEN("pc"), eCSSUnit_Pica, VARIANT_LENGTH }, { STR_WITH_LEN("q"), eCSSUnit_Quarter, VARIANT_LENGTH }, { STR_WITH_LEN("deg"), eCSSUnit_Degree, VARIANT_ANGLE }, @@ -7824,7 +7832,15 @@ CSSParserImpl::TranslateDimension(nsCSSValue& aValue, eCSSUnit_DynamicViewportWidth == units || eCSSUnit_DynamicViewportHeight == units || eCSSUnit_DynamicViewportMin == units || - eCSSUnit_DynamicViewportMax == units)) { + eCSSUnit_DynamicViewportMax == units || + eCSSUnit_ViewportBlock == units || + eCSSUnit_ViewportInline == units || + eCSSUnit_SmallViewportInline == units || + eCSSUnit_SmallViewportBlock == units || + eCSSUnit_LargeViewportBlock == units || + eCSSUnit_LargeViewportInline == units || + eCSSUnit_DynamicViewportBlock == units || + eCSSUnit_DynamicViewportInline == units )) { // Viewport units aren't allowed right now, probably because we're // inside an @page declaration. Fail. return false; diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index 79c2b39d1e..db2374c68f 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -2015,6 +2015,15 @@ nsCSSValue::AppendToString(nsCSSPropertyID aProperty, nsAString& aResult, case eCSSUnit_DynamicViewportMin: aResult.AppendLiteral("dvmin"); break; case eCSSUnit_DynamicViewportMax: aResult.AppendLiteral("dvmax"); break; + case eCSSUnit_ViewportBlock: aResult.AppendLiteral("vb"); break; + case eCSSUnit_ViewportInline: aResult.AppendLiteral("vi"); break; + case eCSSUnit_SmallViewportBlock: aResult.AppendLiteral("svb"); break; + case eCSSUnit_SmallViewportInline: aResult.AppendLiteral("svi"); break; + case eCSSUnit_LargeViewportBlock: aResult.AppendLiteral("lvb"); break; + case eCSSUnit_LargeViewportInline: aResult.AppendLiteral("lvi"); break; + case eCSSUnit_DynamicViewportBlock: aResult.AppendLiteral("dvb"); break; + case eCSSUnit_DynamicViewportInline: aResult.AppendLiteral("dvi"); break; + case eCSSUnit_EM: aResult.AppendLiteral("em"); break; case eCSSUnit_XHeight: aResult.AppendLiteral("ex"); break; case eCSSUnit_Char: aResult.AppendLiteral("ch"); break; @@ -2200,6 +2209,14 @@ nsCSSValue::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const case eCSSUnit_DynamicViewportHeight: case eCSSUnit_DynamicViewportMin: case eCSSUnit_DynamicViewportMax: + case eCSSUnit_ViewportBlock: + case eCSSUnit_ViewportInline: + case eCSSUnit_SmallViewportBlock: + case eCSSUnit_SmallViewportInline: + case eCSSUnit_LargeViewportBlock: + case eCSSUnit_LargeViewportInline: + case eCSSUnit_DynamicViewportBlock: + case eCSSUnit_DynamicViewportInline: case eCSSUnit_EM: case eCSSUnit_XHeight: case eCSSUnit_Char: diff --git a/layout/style/nsCSSValue.h b/layout/style/nsCSSValue.h index c0b3b0cac7..7d0556046b 100644 --- a/layout/style/nsCSSValue.h +++ b/layout/style/nsCSSValue.h @@ -547,6 +547,16 @@ enum nsCSSUnit { eCSSUnit_DynamicViewportMin = 714, // (float) smaller of DynamicViewportWidth and DynamicViewportHeight eCSSUnit_DynamicViewportMax = 715, // (float) larger of DynamicViewportWidth and DynamicViewportHeight + // Logical viewport units + eCSSUnit_ViewportBlock = 716, // (float) 1% of the size of the initial containing block in the box's block axis + eCSSUnit_ViewportInline = 717, // (float) 1% of the size of the initial containing block in the box's inline axis + eCSSUnit_SmallViewportBlock = 718, // (float) 1% of the size of the small viewport in the box's block axis + eCSSUnit_SmallViewportInline = 719, // (float) 1% of the size of the small viewport in the box's inline axis + eCSSUnit_LargeViewportBlock = 720, // (float) 1% of the size of the large viewport in the box's block axis + eCSSUnit_LargeViewportInline = 721, // (float) 1% of the size of the small viewport in the box's inline axis + eCSSUnit_DynamicViewportBlock = 722, // (float) 1% of the size of the dynamic viewport in the box's block axis + eCSSUnit_DynamicViewportInline = 723, // (float) 1% of the size of the small viewport in the box's inline axis + // Font relative measure eCSSUnit_EM = 800, // (float) == current font size eCSSUnit_XHeight = 801, // (float) distance from top of lower case x to baseline diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index fdd0c687f4..349669959c 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -541,6 +541,40 @@ static nscoord CalcLengthWith(const nsCSSValue& aValue, nscoord viewportMax = max(vuScale.width, vuScale.height); return ScaleViewportCoordTrunc(aValue, viewportMax); } + case eCSSUnit_ViewportBlock: + case eCSSUnit_SmallViewportBlock: + case eCSSUnit_LargeViewportBlock: + case eCSSUnit_DynamicViewportBlock: { + // Assume non-vertical writing mode if the style context is unavailable. + if (aStyleContext) { + WritingMode wm(aStyleContext); + bool vertical = wm.IsVertical(); + aConditions.SetWritingModeDependency(wm.GetBits()); + if (vertical) { + nscoord viewportWidth = CalcViewportUnitsScale(aPresContext).width; + return ScaleViewportCoordTrunc(aValue, viewportWidth); + } + } + nscoord viewportHeight = CalcViewportUnitsScale(aPresContext).height; + return ScaleViewportCoordTrunc(aValue, viewportHeight); + } + case eCSSUnit_ViewportInline: + case eCSSUnit_SmallViewportInline: + case eCSSUnit_LargeViewportInline: + case eCSSUnit_DynamicViewportInline: { + // Assume non-vertical writing mode if the style context is unavailable. + if (aStyleContext) { + WritingMode wm(aStyleContext); + bool vertical = wm.IsVertical(); + aConditions.SetWritingModeDependency(wm.GetBits()); + if (vertical) { + nscoord viewportHeight = CalcViewportUnitsScale(aPresContext).height; + return ScaleViewportCoordTrunc(aValue, viewportHeight); + } + } + nscoord viewportWidth = CalcViewportUnitsScale(aPresContext).width; + return ScaleViewportCoordTrunc(aValue, viewportWidth); + } // While we could deal with 'rem' units correctly by simply not // caching any data that uses them in the rule tree, it's valuable // to store them in the rule tree (for faster dynamic changes of