diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 2cb6e3ec13..1f4c04ec9f 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -7758,6 +7758,18 @@ const UnitInfo UnitData[] = { { STR_WITH_LEN("vh"), eCSSUnit_ViewportHeight, VARIANT_LENGTH }, { STR_WITH_LEN("vmin"), eCSSUnit_ViewportMin, VARIANT_LENGTH }, { STR_WITH_LEN("vmax"), eCSSUnit_ViewportMax, VARIANT_LENGTH }, + { STR_WITH_LEN("svw"), eCSSUnit_SmallViewportWidth, VARIANT_LENGTH }, + { STR_WITH_LEN("svh"), eCSSUnit_SmallViewportHeight, VARIANT_LENGTH }, + { STR_WITH_LEN("svmin"), eCSSUnit_SmallViewportMin, VARIANT_LENGTH }, + { STR_WITH_LEN("svmax"), eCSSUnit_SmallViewportMax, VARIANT_LENGTH }, + { STR_WITH_LEN("lvw"), eCSSUnit_LargeViewportWidth, VARIANT_LENGTH }, + { STR_WITH_LEN("lvh"), eCSSUnit_LargeViewportHeight, VARIANT_LENGTH }, + { STR_WITH_LEN("lvmin"), eCSSUnit_LargeViewportMin, VARIANT_LENGTH }, + { STR_WITH_LEN("lvmax"), eCSSUnit_LargeViewportMax, VARIANT_LENGTH }, + { STR_WITH_LEN("dvw"), eCSSUnit_DynamicViewportWidth, VARIANT_LENGTH }, + { 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("pc"), eCSSUnit_Pica, VARIANT_LENGTH }, { STR_WITH_LEN("q"), eCSSUnit_Quarter, VARIANT_LENGTH }, { STR_WITH_LEN("deg"), eCSSUnit_Degree, VARIANT_ANGLE }, @@ -7797,10 +7809,22 @@ CSSParserImpl::TranslateDimension(nsCSSValue& aValue, } if (!mViewportUnitsEnabled && - (eCSSUnit_ViewportWidth == units || + (eCSSUnit_ViewportWidth == units || eCSSUnit_ViewportHeight == units || - eCSSUnit_ViewportMin == units || - eCSSUnit_ViewportMax == units)) { + eCSSUnit_ViewportMin == units || + eCSSUnit_ViewportMax == units || + eCSSUnit_SmallViewportWidth == units || + eCSSUnit_SmallViewportHeight == units || + eCSSUnit_SmallViewportMin == units || + eCSSUnit_SmallViewportMax == units || + eCSSUnit_LargeViewportWidth == units || + eCSSUnit_LargeViewportHeight == units || + eCSSUnit_LargeViewportMin == units || + eCSSUnit_LargeViewportMax == units || + eCSSUnit_DynamicViewportWidth == units || + eCSSUnit_DynamicViewportHeight == units || + eCSSUnit_DynamicViewportMin == units || + eCSSUnit_DynamicViewportMax == 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 40d804b028..79c2b39d1e 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -2002,6 +2002,19 @@ nsCSSValue::AppendToString(nsCSSPropertyID aProperty, nsAString& aResult, case eCSSUnit_ViewportMin: aResult.AppendLiteral("vmin"); break; case eCSSUnit_ViewportMax: aResult.AppendLiteral("vmax"); break; + case eCSSUnit_SmallViewportWidth: aResult.AppendLiteral("svw"); break; + case eCSSUnit_SmallViewportHeight: aResult.AppendLiteral("svh"); break; + case eCSSUnit_SmallViewportMin: aResult.AppendLiteral("svmin"); break; + case eCSSUnit_SmallViewportMax: aResult.AppendLiteral("svmax"); break; + case eCSSUnit_LargeViewportWidth: aResult.AppendLiteral("lvw"); break; + case eCSSUnit_LargeViewportHeight: aResult.AppendLiteral("lvh"); break; + case eCSSUnit_LargeViewportMin: aResult.AppendLiteral("lvmin"); break; + case eCSSUnit_LargeViewportMax: aResult.AppendLiteral("lvmax"); break; + case eCSSUnit_DynamicViewportWidth: aResult.AppendLiteral("dvw"); break; + case eCSSUnit_DynamicViewportHeight: aResult.AppendLiteral("dvh"); break; + case eCSSUnit_DynamicViewportMin: aResult.AppendLiteral("dvmin"); break; + case eCSSUnit_DynamicViewportMax: aResult.AppendLiteral("dvmax"); break; + case eCSSUnit_EM: aResult.AppendLiteral("em"); break; case eCSSUnit_XHeight: aResult.AppendLiteral("ex"); break; case eCSSUnit_Char: aResult.AppendLiteral("ch"); break; @@ -2175,6 +2188,18 @@ nsCSSValue::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const case eCSSUnit_ViewportHeight: case eCSSUnit_ViewportMin: case eCSSUnit_ViewportMax: + case eCSSUnit_SmallViewportWidth: + case eCSSUnit_SmallViewportHeight: + case eCSSUnit_SmallViewportMin: + case eCSSUnit_SmallViewportMax: + case eCSSUnit_LargeViewportWidth: + case eCSSUnit_LargeViewportHeight: + case eCSSUnit_LargeViewportMin: + case eCSSUnit_LargeViewportMax: + case eCSSUnit_DynamicViewportWidth: + case eCSSUnit_DynamicViewportHeight: + case eCSSUnit_DynamicViewportMin: + case eCSSUnit_DynamicViewportMax: case eCSSUnit_EM: case eCSSUnit_XHeight: case eCSSUnit_Char: diff --git a/layout/style/nsCSSValue.h b/layout/style/nsCSSValue.h index 1721cc8ee6..c0b3b0cac7 100644 --- a/layout/style/nsCSSValue.h +++ b/layout/style/nsCSSValue.h @@ -534,6 +534,19 @@ enum nsCSSUnit { eCSSUnit_ViewportMin = 702, // (float) smaller of ViewportWidth and ViewportHeight eCSSUnit_ViewportMax = 703, // (float) larger of ViewportWidth and ViewportHeight + eCSSUnit_SmallViewportWidth = 704, // (float) 1% of the width of the small viewport + eCSSUnit_SmallViewportHeight = 705, // (float) 1% of the height of the small viewport + eCSSUnit_SmallViewportMin = 706, // (float) smaller of SmallViewportWidth and SmallViewportHeight + eCSSUnit_SmallViewportMax = 707, // (float) larger of SmallViewportWidth and SmallViewportHeight + eCSSUnit_LargeViewportWidth = 708, // (float) 1% of the width of the large viewport + eCSSUnit_LargeViewportHeight = 709, // (float) 1% of the height of the large viewport + eCSSUnit_LargeViewportMin = 710, // (float) smaller of LargeViewportWidth and LargeViewportHeight + eCSSUnit_LargeViewportMax = 711, // (float) larger of LargeViewportWidth and LargeViewportHeight + eCSSUnit_DynamicViewportWidth = 712, // (float) 1% of the width of the dynamic viewport + eCSSUnit_DynamicViewportHeight = 713, // (float) 1% of the height of the dynamic viewport + eCSSUnit_DynamicViewportMin = 714, // (float) smaller of DynamicViewportWidth and DynamicViewportHeight + eCSSUnit_DynamicViewportMax = 715, // (float) larger of DynamicViewportWidth and DynamicViewportHeight + // 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 1bba07ce6b..fdd0c687f4 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -511,20 +511,32 @@ static nscoord CalcLengthWith(const nsCSSValue& aValue, // and allows us not to need an additional code path, in exchange // for an increased cost to dynamic changes to the viewport size // when viewport units are in use. - case eCSSUnit_ViewportWidth: { + case eCSSUnit_ViewportWidth: + case eCSSUnit_SmallViewportWidth: + case eCSSUnit_LargeViewportWidth: + case eCSSUnit_DynamicViewportWidth: { nscoord viewportWidth = CalcViewportUnitsScale(aPresContext).width; return ScaleViewportCoordTrunc(aValue, viewportWidth); } - case eCSSUnit_ViewportHeight: { + case eCSSUnit_ViewportHeight: + case eCSSUnit_SmallViewportHeight: + case eCSSUnit_LargeViewportHeight: + case eCSSUnit_DynamicViewportHeight: { nscoord viewportHeight = CalcViewportUnitsScale(aPresContext).height; return ScaleViewportCoordTrunc(aValue, viewportHeight); } - case eCSSUnit_ViewportMin: { + case eCSSUnit_ViewportMin: + case eCSSUnit_SmallViewportMin: + case eCSSUnit_LargeViewportMin: + case eCSSUnit_DynamicViewportMin: { nsSize vuScale(CalcViewportUnitsScale(aPresContext)); nscoord viewportMin = min(vuScale.width, vuScale.height); return ScaleViewportCoordTrunc(aValue, viewportMin); } - case eCSSUnit_ViewportMax: { + case eCSSUnit_ViewportMax: + case eCSSUnit_SmallViewportMax: + case eCSSUnit_LargeViewportMax: + case eCSSUnit_DynamicViewportMax: { nsSize vuScale(CalcViewportUnitsScale(aPresContext)); nscoord viewportMax = max(vuScale.width, vuScale.height); return ScaleViewportCoordTrunc(aValue, viewportMax);