Changeset 286458 in webkit


Ignore:
Timestamp:
Dec 2, 2021 3:26:22 PM (8 months ago)
Author:
Devin Rousso
Message:

[css-values-4] Support *vi (inline) and *vb (block) viewport units
https://bugs.webkit.org/show_bug.cgi?id=232895
<rdar://problem/85179134>

Reviewed by Simon Fraser.

Source/WebCore:

*vi is equal to 1% of the size of the UA-default/large/small/dynamic viewport size in the direction of the root element’s inline axis.
*vb is equal to 1% of the size of the initial containing block UA-default/small/large/dynamic viewport size in the direction of the root element’s block axis.
As an example, on about:blank:

  • vi would be equal to vw
  • vb would be equal to vh
  • svi would be equal to svw
  • svb would be equal to svh
  • lvi would be equal to lvw
  • lvb would be equal to lvh
  • dvi would be equal to dvw
  • dvb would be equal to dvh

Spec: <https://drafts.csswg.org/css-values-4/#viewport-variants>

Tests: CSSViewportUnits.AllSame

CSSViewportUnits.EmptyUnobscuredSizeOverrides
CSSViewportUnits.SameUnobscuredSizeOverrides
CSSViewportUnits.DifferentUnobscuredSizeOverrides
CSSViewportUnits.SVGDocument

  • css/CSSUnits.h:
  • css/CSSUnits.cpp:

(WebCore::operator<<):

  • css/CSSPrimitiveValue.h:

(WebCore::CSSPrimitiveValue::isViewportPercentageLength):

  • css/CSSPrimitiveValue.cpp:

(WebCore::isValidCSSUnitTypeForDoubleConversion):
(WebCore::isStringType):
(WebCore::CSSPrimitiveValue::cleanup):
(WebCore::lengthOfViewportPhysicalAxisForLogicalAxis): Added.
(WebCore::CSSPrimitiveValue::computeUnzoomedNonCalcLengthDouble):
(WebCore::CSSPrimitiveValue::computeNonCalcLengthDouble):
(WebCore::CSSPrimitiveValue::unitTypeString):
(WebCore::CSSPrimitiveValue::formatNumberForCustomCSSText const):
(WebCore::CSSPrimitiveValue::equals const):

  • css/parser/CSSParserToken.cpp:

(WebCore::cssPrimitiveValueUnitFromTrie):

  • css/parser/CSSPropertyParserHelpers.cpp:

(WebCore::CSSPropertyParserHelpers::consumeLengthRawWithKnownTokenTypeDimension):

  • css/calc/CSSCalcCategoryMapping.cpp:

(WebCore::calcUnitCategory):
(WebCore::calculationCategoryForCombination):
(WebCore::hasDoubleValue):

Source/WebInspectorUI:

  • UserInterface/Models/CSSCompletions.js:

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html:
  • TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.svg: Added.
  • TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm:

(TEST.CSSViewportUnits.AllSame):
(TEST.CSSViewportUnits.EmptyUnobscuredSizeOverrides):
(TEST.CSSViewportUnits.SameUnobscuredSizeOverrides):
(TEST.CSSViewportUnits.DifferentUnobscuredSizeOverrides):
(TEST.CSSViewportUnits.SVGDocument): Added.

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
Location:
trunk
Files:
1 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286456 r286458  
     12021-12-02  Devin Rousso  <drousso@apple.com>
     2
     3        [css-values-4] Support `*vi` (inline) and `*vb` (block) viewport units
     4        https://bugs.webkit.org/show_bug.cgi?id=232895
     5        <rdar://problem/85179134>
     6
     7        Reviewed by Simon Fraser.
     8
     9        `*vi` is equal to 1% of the size of the UA-default/large/small/dynamic viewport size in the direction of the root element’s inline axis.
     10        `*vb` is equal to 1% of the size of the initial containing block UA-default/small/large/dynamic viewport size in the direction of the root element’s block axis.
     11        As an example, on `about:blank`:
     12        - `vi` would be equal to `vw`
     13        - `vb` would be equal to `vh`
     14        - `svi` would be equal to `svw`
     15        - `svb` would be equal to `svh`
     16        - `lvi` would be equal to `lvw`
     17        - `lvb` would be equal to `lvh`
     18        - `dvi` would be equal to `dvw`
     19        - `dvb` would be equal to `dvh`
     20
     21        Spec: <https://drafts.csswg.org/css-values-4/#viewport-variants>
     22
     23        Tests: CSSViewportUnits.AllSame
     24               CSSViewportUnits.EmptyUnobscuredSizeOverrides
     25               CSSViewportUnits.SameUnobscuredSizeOverrides
     26               CSSViewportUnits.DifferentUnobscuredSizeOverrides
     27               CSSViewportUnits.SVGDocument
     28
     29        * css/CSSUnits.h:
     30        * css/CSSUnits.cpp:
     31        (WebCore::operator<<):
     32        * css/CSSPrimitiveValue.h:
     33        (WebCore::CSSPrimitiveValue::isViewportPercentageLength):
     34        * css/CSSPrimitiveValue.cpp:
     35        (WebCore::isValidCSSUnitTypeForDoubleConversion):
     36        (WebCore::isStringType):
     37        (WebCore::CSSPrimitiveValue::cleanup):
     38        (WebCore::lengthOfViewportPhysicalAxisForLogicalAxis): Added.
     39        (WebCore::CSSPrimitiveValue::computeUnzoomedNonCalcLengthDouble):
     40        (WebCore::CSSPrimitiveValue::computeNonCalcLengthDouble):
     41        (WebCore::CSSPrimitiveValue::unitTypeString):
     42        (WebCore::CSSPrimitiveValue::formatNumberForCustomCSSText const):
     43        (WebCore::CSSPrimitiveValue::equals const):
     44        * css/parser/CSSParserToken.cpp:
     45        (WebCore::cssPrimitiveValueUnitFromTrie):
     46        * css/parser/CSSPropertyParserHelpers.cpp:
     47        (WebCore::CSSPropertyParserHelpers::consumeLengthRawWithKnownTokenTypeDimension):
     48        * css/calc/CSSCalcCategoryMapping.cpp:
     49        (WebCore::calcUnitCategory):
     50        (WebCore::calculationCategoryForCombination):
     51        (WebCore::hasDoubleValue):
     52
    1532021-12-02  Chris Dumez  <cdumez@apple.com>
    254
  • trunk/Source/WebCore/css/CSSPrimitiveValue.cpp

    r285709 r286458  
    4040#include "FontCascade.h"
    4141#include "Length.h"
    42 #include "Node.h"
     42#include "NodeRenderStyle.h"
    4343#include "Pair.h"
    4444#include "Rect.h"
     
    6363    case CSSUnitType::CSS_DEG:
    6464    case CSSUnitType::CSS_DIMENSION:
     65    case CSSUnitType::CSS_DVB:
    6566    case CSSUnitType::CSS_DVH:
     67    case CSSUnitType::CSS_DVI:
    6668    case CSSUnitType::CSS_DVMAX:
    6769    case CSSUnitType::CSS_DVMIN:
     
    8385    case CSSUnitType::CSS_Q:
    8486    case CSSUnitType::CSS_LHS:
     87    case CSSUnitType::CSS_LVB:
    8588    case CSSUnitType::CSS_LVH:
     89    case CSSUnitType::CSS_LVI:
    8690    case CSSUnitType::CSS_LVMAX:
    8791    case CSSUnitType::CSS_LVMIN:
     
    9296    case CSSUnitType::CSS_REMS:
    9397    case CSSUnitType::CSS_S:
     98    case CSSUnitType::CSS_SVB:
    9499    case CSSUnitType::CSS_SVH:
     100    case CSSUnitType::CSS_SVI:
    95101    case CSSUnitType::CSS_SVMAX:
    96102    case CSSUnitType::CSS_SVMIN:
    97103    case CSSUnitType::CSS_SVW:
    98104    case CSSUnitType::CSS_TURN:
     105    case CSSUnitType::CSS_VB:
    99106    case CSSUnitType::CSS_VH:
     107    case CSSUnitType::CSS_VI:
    100108    case CSSUnitType::CSS_VMAX:
    101109    case CSSUnitType::CSS_VMIN:
     
    154162    case CSSUnitType::CSS_DPI:
    155163    case CSSUnitType::CSS_DPPX:
     164    case CSSUnitType::CSS_DVB:
    156165    case CSSUnitType::CSS_DVH:
     166    case CSSUnitType::CSS_DVI:
    157167    case CSSUnitType::CSS_DVMAX:
    158168    case CSSUnitType::CSS_DVMIN:
     
    168178    case CSSUnitType::CSS_IN:
    169179    case CSSUnitType::CSS_KHZ:
     180    case CSSUnitType::CSS_LVB:
    170181    case CSSUnitType::CSS_LVH:
     182    case CSSUnitType::CSS_LVI:
    171183    case CSSUnitType::CSS_LVMAX:
    172184    case CSSUnitType::CSS_LVMIN:
     
    191203    case CSSUnitType::CSS_RGBCOLOR:
    192204    case CSSUnitType::CSS_S:
     205    case CSSUnitType::CSS_SVB:
    193206    case CSSUnitType::CSS_SVH:
     207    case CSSUnitType::CSS_SVI:
    194208    case CSSUnitType::CSS_SVMAX:
    195209    case CSSUnitType::CSS_SVMIN:
     
    200214    case CSSUnitType::CSS_UNKNOWN:
    201215    case CSSUnitType::CSS_VALUE_ID:
     216    case CSSUnitType::CSS_VB:
    202217    case CSSUnitType::CSS_VH:
     218    case CSSUnitType::CSS_VI:
    203219    case CSSUnitType::CSS_VMAX:
    204220    case CSSUnitType::CSS_VMIN:
     
    555571    case CSSUnitType::CSS_VMIN:
    556572    case CSSUnitType::CSS_VMAX:
     573    case CSSUnitType::CSS_VB:
     574    case CSSUnitType::CSS_VI:
    557575    case CSSUnitType::CSS_SVW:
    558576    case CSSUnitType::CSS_SVH:
    559577    case CSSUnitType::CSS_SVMIN:
    560578    case CSSUnitType::CSS_SVMAX:
     579    case CSSUnitType::CSS_SVB:
     580    case CSSUnitType::CSS_SVI:
    561581    case CSSUnitType::CSS_LVW:
    562582    case CSSUnitType::CSS_LVH:
    563583    case CSSUnitType::CSS_LVMIN:
    564584    case CSSUnitType::CSS_LVMAX:
     585    case CSSUnitType::CSS_LVB:
     586    case CSSUnitType::CSS_LVI:
    565587    case CSSUnitType::CSS_DVW:
    566588    case CSSUnitType::CSS_DVH:
    567589    case CSSUnitType::CSS_DVMIN:
    568590    case CSSUnitType::CSS_DVMAX:
     591    case CSSUnitType::CSS_DVB:
     592    case CSSUnitType::CSS_DVI:
    569593    case CSSUnitType::CSS_DPPX:
    570594    case CSSUnitType::CSS_X:
     
    648672static constexpr double cmPerInch = 2.54;
    649673static constexpr double QPerInch = 25.4 * 4.0;
     674
     675static double lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis logicalAxis, const FloatSize& size, const RenderStyle* rootElementStyle)
     676{
     677    if (!rootElementStyle)
     678        return 0;
     679
     680    switch (mapLogicalAxisToPhysicalAxis(makeTextFlow(rootElementStyle->writingMode(), rootElementStyle->direction()), logicalAxis)) {
     681    case BoxAxis::Horizontal:
     682        return size.width();
     683
     684    case BoxAxis::Vertical:
     685        return size.height();
     686    }
     687
     688    ASSERT_NOT_REACHED();
     689}
     690
     691static double lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis logicalAxis, const FloatSize& size, const RenderView& renderView)
     692{
     693    const auto* rootElement = renderView.document().documentElement();
     694    if (!rootElement)
     695        return 0;
     696
     697    return lengthOfViewportPhysicalAxisForLogicalAxis(logicalAxis, size, rootElement->renderStyle());
     698}
    650699
    651700double CSSPrimitiveValue::computeUnzoomedNonCalcLengthDouble(CSSUnitType primitiveType, double value, CSSPropertyID propertyToCompute, const FontMetrics* fontMetrics, const FontCascadeDescription* fontDescription, const FontCascadeDescription* rootFontDescription, const RenderView* renderView)
     
    703752    case CSSUnitType::CSS_VMIN:
    704753        return renderView ? renderView->sizeForCSSDefaultViewportUnits().minDimension() / 100.0 * value : value;
     754    case CSSUnitType::CSS_VB:
     755        return renderView ? lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, renderView->sizeForCSSDefaultViewportUnits(), *renderView) / 100.0 * value : 0;
     756    case CSSUnitType::CSS_VI:
     757        return renderView ? lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, renderView->sizeForCSSDefaultViewportUnits(), *renderView) / 100.0 * value : 0;
    705758    case CSSUnitType::CSS_SVH:
    706759        return renderView ? renderView->sizeForCSSSmallViewportUnits().height() / 100.0 * value : 0;
     
    711764    case CSSUnitType::CSS_SVMIN:
    712765        return renderView ? renderView->sizeForCSSSmallViewportUnits().minDimension() / 100.0 * value : value;
     766    case CSSUnitType::CSS_SVB:
     767        return renderView ? lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, renderView->sizeForCSSSmallViewportUnits(), *renderView) / 100.0 * value : 0;
     768    case CSSUnitType::CSS_SVI:
     769        return renderView ? lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, renderView->sizeForCSSSmallViewportUnits(), *renderView) / 100.0 * value : 0;
    713770    case CSSUnitType::CSS_LVH:
    714771        return renderView ? renderView->sizeForCSSLargeViewportUnits().height() / 100.0 * value : 0;
     
    719776    case CSSUnitType::CSS_LVMIN:
    720777        return renderView ? renderView->sizeForCSSLargeViewportUnits().minDimension() / 100.0 * value : value;
     778    case CSSUnitType::CSS_LVB:
     779        return renderView ? lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, renderView->sizeForCSSLargeViewportUnits(), *renderView) / 100.0 * value : 0;
     780    case CSSUnitType::CSS_LVI:
     781        return renderView ? lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, renderView->sizeForCSSLargeViewportUnits(), *renderView) / 100.0 * value : 0;
    721782    case CSSUnitType::CSS_DVH:
    722783        return renderView ? renderView->sizeForCSSDynamicViewportUnits().height() / 100.0 * value : 0;
     
    727788    case CSSUnitType::CSS_DVMIN:
    728789        return renderView ? renderView->sizeForCSSDynamicViewportUnits().minDimension() / 100.0 * value : value;
     790    case CSSUnitType::CSS_DVB:
     791        return renderView ? lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, renderView->sizeForCSSDynamicViewportUnits(), *renderView) / 100.0 * value : 0;
     792    case CSSUnitType::CSS_DVI:
     793        return renderView ? lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, renderView->sizeForCSSDynamicViewportUnits(), *renderView) / 100.0 * value : 0;
    729794    default:
    730795        ASSERT_NOT_REACHED();
     
    784849        return value * conversionData.defaultViewportFactor().minDimension();
    785850
     851    case CSSUnitType::CSS_VB:
     852        return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, conversionData.defaultViewportFactor(), conversionData.rootStyle());
     853
     854    case CSSUnitType::CSS_VI:
     855        return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, conversionData.defaultViewportFactor(), conversionData.rootStyle());
     856
    786857    case CSSUnitType::CSS_SVH:
    787858        return value * conversionData.smallViewportFactor().height();
     
    796867        return value * conversionData.smallViewportFactor().minDimension();
    797868
     869    case CSSUnitType::CSS_SVB:
     870        return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, conversionData.smallViewportFactor(), conversionData.rootStyle());
     871
     872    case CSSUnitType::CSS_SVI:
     873        return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, conversionData.smallViewportFactor(), conversionData.rootStyle());
     874
    798875    case CSSUnitType::CSS_LVH:
    799876        return value * conversionData.largeViewportFactor().height();
     
    808885        return value * conversionData.largeViewportFactor().minDimension();
    809886
     887    case CSSUnitType::CSS_LVB:
     888        return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, conversionData.largeViewportFactor(), conversionData.rootStyle());
     889
     890    case CSSUnitType::CSS_LVI:
     891        return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, conversionData.largeViewportFactor(), conversionData.rootStyle());
     892
    810893    case CSSUnitType::CSS_DVH:
    811894        return value * conversionData.dynamicViewportFactor().height();
     
    819902    case CSSUnitType::CSS_DVMIN:
    820903        return value * conversionData.dynamicViewportFactor().minDimension();
     904
     905    case CSSUnitType::CSS_DVB:
     906        return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Block, conversionData.dynamicViewportFactor(), conversionData.rootStyle());
     907
     908    case CSSUnitType::CSS_DVI:
     909        return value * lengthOfViewportPhysicalAxisForLogicalAxis(LogicalBoxAxis::Inline, conversionData.dynamicViewportFactor(), conversionData.rootStyle());
    821910
    822911    case CSSUnitType::CSS_LHS:
     
    10871176        case CSSUnitType::CSS_VMIN: return "vmin";
    10881177        case CSSUnitType::CSS_VMAX: return "vmax";
     1178        case CSSUnitType::CSS_VB: return "vb";
     1179        case CSSUnitType::CSS_VI: return "vi";
    10891180        case CSSUnitType::CSS_SVW: return "svw";
    10901181        case CSSUnitType::CSS_SVH: return "svh";
    10911182        case CSSUnitType::CSS_SVMIN: return "svmin";
    10921183        case CSSUnitType::CSS_SVMAX: return "svmax";
     1184        case CSSUnitType::CSS_SVB: return "svb";
     1185        case CSSUnitType::CSS_SVI: return "svi";
    10931186        case CSSUnitType::CSS_LVW: return "lvw";
    10941187        case CSSUnitType::CSS_LVH: return "lvh";
    10951188        case CSSUnitType::CSS_LVMIN: return "lvmin";
    10961189        case CSSUnitType::CSS_LVMAX: return "lvmax";
     1190        case CSSUnitType::CSS_LVB: return "lvb";
     1191        case CSSUnitType::CSS_LVI: return "lvi";
    10971192        case CSSUnitType::CSS_DVW: return "dvw";
    10981193        case CSSUnitType::CSS_DVH: return "dvh";
    10991194        case CSSUnitType::CSS_DVMIN: return "dvmin";
    11001195        case CSSUnitType::CSS_DVMAX: return "dvmax";
     1196        case CSSUnitType::CSS_DVB: return "dvb";
     1197        case CSSUnitType::CSS_DVI: return "dvi";
    11011198        case CSSUnitType::CSS_DPPX: return "dppx";
    11021199        case CSSUnitType::CSS_X: return "x";
     
    12611358    case CSSUnitType::CSS_VMAX:
    12621359        return formatNumberValue("vmax");
     1360    case CSSUnitType::CSS_VB:
     1361        return formatNumberValue("vb");
     1362    case CSSUnitType::CSS_VI:
     1363        return formatNumberValue("vi");
    12631364    case CSSUnitType::CSS_SVW:
    12641365        return formatNumberValue("svw");
     
    12691370    case CSSUnitType::CSS_SVMAX:
    12701371        return formatNumberValue("svmax");
     1372    case CSSUnitType::CSS_SVB:
     1373        return formatNumberValue("svb");
     1374    case CSSUnitType::CSS_SVI:
     1375        return formatNumberValue("svi");
    12711376    case CSSUnitType::CSS_LVW:
    12721377        return formatNumberValue("lvw");
     
    12771382    case CSSUnitType::CSS_LVMAX:
    12781383        return formatNumberValue("lvmax");
     1384    case CSSUnitType::CSS_LVB:
     1385        return formatNumberValue("lvb");
     1386    case CSSUnitType::CSS_LVI:
     1387        return formatNumberValue("lvi");
    12791388    case CSSUnitType::CSS_DVW:
    12801389        return formatNumberValue("dvw");
     
    12851394    case CSSUnitType::CSS_DVMAX:
    12861395        return formatNumberValue("dvmax");
     1396    case CSSUnitType::CSS_DVB:
     1397        return formatNumberValue("dvb");
     1398    case CSSUnitType::CSS_DVI:
     1399        return formatNumberValue("dvi");
    12871400    case CSSUnitType::CSS_IDENT:
    12881401    case CSSUnitType::CSS_UNICODE_RANGE:
     
    13521465    case CSSUnitType::CSS_VMIN:
    13531466    case CSSUnitType::CSS_VMAX:
     1467    case CSSUnitType::CSS_VB:
     1468    case CSSUnitType::CSS_VI:
    13541469    case CSSUnitType::CSS_SVW:
    13551470    case CSSUnitType::CSS_SVH:
    13561471    case CSSUnitType::CSS_SVMIN:
    13571472    case CSSUnitType::CSS_SVMAX:
     1473    case CSSUnitType::CSS_SVB:
     1474    case CSSUnitType::CSS_SVI:
    13581475    case CSSUnitType::CSS_LVW:
    13591476    case CSSUnitType::CSS_LVH:
    13601477    case CSSUnitType::CSS_LVMIN:
    13611478    case CSSUnitType::CSS_LVMAX:
     1479    case CSSUnitType::CSS_LVB:
     1480    case CSSUnitType::CSS_LVI:
    13621481    case CSSUnitType::CSS_DVW:
    13631482    case CSSUnitType::CSS_DVH:
    13641483    case CSSUnitType::CSS_DVMIN:
    13651484    case CSSUnitType::CSS_DVMAX:
     1485    case CSSUnitType::CSS_DVB:
     1486    case CSSUnitType::CSS_DVI:
    13661487    case CSSUnitType::CSS_FR:
    13671488    case CSSUnitType::CSS_Q:
  • trunk/Source/WebCore/css/CSSPrimitiveValue.h

    r285624 r286458  
    323323constexpr bool CSSPrimitiveValue::isViewportPercentageLength(CSSUnitType type)
    324324{
    325     return type >= CSSUnitType::CSS_VW && type <= CSSUnitType::CSS_DVMAX;
     325    return type >= CSSUnitType::FirstViewportCSSUnitType && type <= CSSUnitType::LastViewporCSSUnitType;
    326326}
    327327
  • trunk/Source/WebCore/css/CSSUnits.cpp

    r284628 r286458  
    139139    case CSSUnitType::CSS_VMIN: ts << "vmin"; break;
    140140    case CSSUnitType::CSS_VMAX: ts << "vmax"; break;
     141    case CSSUnitType::CSS_VB: ts << "vb"; break;
     142    case CSSUnitType::CSS_VI: ts << "vi"; break;
    141143    case CSSUnitType::CSS_SVW: ts << "svw"; break;
    142144    case CSSUnitType::CSS_SVH: ts << "svh"; break;
    143145    case CSSUnitType::CSS_SVMIN: ts << "svmin"; break;
    144146    case CSSUnitType::CSS_SVMAX: ts << "svmax"; break;
     147    case CSSUnitType::CSS_SVB: ts << "svb"; break;
     148    case CSSUnitType::CSS_SVI: ts << "svi"; break;
    145149    case CSSUnitType::CSS_LVW: ts << "lvw"; break;
    146150    case CSSUnitType::CSS_LVH: ts << "lvh"; break;
    147151    case CSSUnitType::CSS_LVMIN: ts << "lvmin"; break;
    148152    case CSSUnitType::CSS_LVMAX: ts << "lvmax"; break;
     153    case CSSUnitType::CSS_LVB: ts << "lvb"; break;
     154    case CSSUnitType::CSS_LVI: ts << "lvi"; break;
    149155    case CSSUnitType::CSS_DVW: ts << "dvw"; break;
    150156    case CSSUnitType::CSS_DVH: ts << "dvh"; break;
    151157    case CSSUnitType::CSS_DVMIN: ts << "dvmin"; break;
    152158    case CSSUnitType::CSS_DVMAX: ts << "dvmax"; break;
     159    case CSSUnitType::CSS_DVB: ts << "dvb"; break;
     160    case CSSUnitType::CSS_DVI: ts << "dvi"; break;
    153161    case CSSUnitType::CSS_DPPX: ts << "dppx"; break;
    154162    case CSSUnitType::CSS_X: ts << "x"; break;
  • trunk/Source/WebCore/css/CSSUnits.h

    r284628 r286458  
    5656    CSS_RECT,
    5757    CSS_RGBCOLOR,
     58
    5859    CSS_VW,
    5960    CSS_VH,
    6061    CSS_VMIN,
    6162    CSS_VMAX,
     63    CSS_VB,
     64    CSS_VI,
    6265    CSS_SVW,
    6366    CSS_SVH,
    6467    CSS_SVMIN,
    6568    CSS_SVMAX,
     69    CSS_SVB,
     70    CSS_SVI,
    6671    CSS_LVW,
    6772    CSS_LVH,
    6873    CSS_LVMIN,
    6974    CSS_LVMAX,
     75    CSS_LVB,
     76    CSS_LVI,
    7077    CSS_DVW,
    7178    CSS_DVH,
    7279    CSS_DVMIN,
    7380    CSS_DVMAX,
     81    CSS_DVB,
     82    CSS_DVI,
     83    FirstViewportCSSUnitType = CSS_VW,
     84    LastViewporCSSUnitType = CSS_DVI,
     85
    7486    CSS_DPPX,
    7587    CSS_X,
  • trunk/Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp

    r284628 r286458  
    5555    case CSSUnitType::CSS_VMIN:
    5656    case CSSUnitType::CSS_VMAX:
     57    case CSSUnitType::CSS_VB:
     58    case CSSUnitType::CSS_VI:
    5759    case CSSUnitType::CSS_SVW:
    5860    case CSSUnitType::CSS_SVH:
    5961    case CSSUnitType::CSS_SVMIN:
    6062    case CSSUnitType::CSS_SVMAX:
     63    case CSSUnitType::CSS_SVB:
     64    case CSSUnitType::CSS_SVI:
    6165    case CSSUnitType::CSS_LVW:
    6266    case CSSUnitType::CSS_LVH:
    6367    case CSSUnitType::CSS_LVMIN:
    6468    case CSSUnitType::CSS_LVMAX:
     69    case CSSUnitType::CSS_LVB:
     70    case CSSUnitType::CSS_LVI:
    6571    case CSSUnitType::CSS_DVW:
    6672    case CSSUnitType::CSS_DVH:
    6773    case CSSUnitType::CSS_DVMIN:
    6874    case CSSUnitType::CSS_DVMAX:
     75    case CSSUnitType::CSS_DVB:
     76    case CSSUnitType::CSS_DVI:
    6977        return CalculationCategory::Length;
    7078    case CSSUnitType::CSS_PERCENTAGE:
     
    123131    case CSSUnitType::CSS_VMIN:
    124132    case CSSUnitType::CSS_VMAX:
     133    case CSSUnitType::CSS_VB:
     134    case CSSUnitType::CSS_VI:
    125135    case CSSUnitType::CSS_SVW:
    126136    case CSSUnitType::CSS_SVH:
    127137    case CSSUnitType::CSS_SVMIN:
    128138    case CSSUnitType::CSS_SVMAX:
     139    case CSSUnitType::CSS_SVB:
     140    case CSSUnitType::CSS_SVI:
    129141    case CSSUnitType::CSS_LVW:
    130142    case CSSUnitType::CSS_LVH:
    131143    case CSSUnitType::CSS_LVMIN:
    132144    case CSSUnitType::CSS_LVMAX:
     145    case CSSUnitType::CSS_LVB:
     146    case CSSUnitType::CSS_LVI:
    133147    case CSSUnitType::CSS_DVW:
    134148    case CSSUnitType::CSS_DVH:
    135149    case CSSUnitType::CSS_DVMIN:
    136150    case CSSUnitType::CSS_DVMAX:
     151    case CSSUnitType::CSS_DVB:
     152    case CSSUnitType::CSS_DVI:
    137153    default:
    138154        return CalculationCategory::Other;
     
    187203    case CSSUnitType::CSS_VMIN:
    188204    case CSSUnitType::CSS_VMAX:
     205    case CSSUnitType::CSS_VB:
     206    case CSSUnitType::CSS_VI:
    189207    case CSSUnitType::CSS_SVW:
    190208    case CSSUnitType::CSS_SVH:
    191209    case CSSUnitType::CSS_SVMIN:
    192210    case CSSUnitType::CSS_SVMAX:
     211    case CSSUnitType::CSS_SVB:
     212    case CSSUnitType::CSS_SVI:
    193213    case CSSUnitType::CSS_LVW:
    194214    case CSSUnitType::CSS_LVH:
    195215    case CSSUnitType::CSS_LVMIN:
    196216    case CSSUnitType::CSS_LVMAX:
     217    case CSSUnitType::CSS_LVB:
     218    case CSSUnitType::CSS_LVI:
    197219    case CSSUnitType::CSS_DVW:
    198220    case CSSUnitType::CSS_DVH:
    199221    case CSSUnitType::CSS_DVMIN:
    200222    case CSSUnitType::CSS_DVMAX:
     223    case CSSUnitType::CSS_DVB:
     224    case CSSUnitType::CSS_DVI:
    201225    case CSSUnitType::CSS_DPPX:
    202226    case CSSUnitType::CSS_X:
  • trunk/Source/WebCore/css/parser/CSSParserToken.cpp

    r284628 r286458  
    115115        case 'v':
    116116            switch (toASCIILower(data[1])) {
     117            case 'b':
     118                return CSSUnitType::CSS_VB;
    117119            case 'h':
    118120                return CSSUnitType::CSS_VH;
     121            case 'i':
     122                return CSSUnitType::CSS_VI;
    119123            case 'w':
    120124                return CSSUnitType::CSS_VW;
     
    137141            case 'v':
    138142                switch (toASCIILower(data[2])) {
     143                case 'b':
     144                    return CSSUnitType::CSS_DVB;
    139145                case 'h':
    140146                    return CSSUnitType::CSS_DVH;
     147                case 'i':
     148                    return CSSUnitType::CSS_DVI;
    141149                case 'w':
    142150                    return CSSUnitType::CSS_DVW;
     
    148156            if (toASCIILower(data[1]) == 'v') {
    149157                switch (toASCIILower(data[2])) {
     158                case 'b':
     159                    return CSSUnitType::CSS_LVB;
    150160                case 'h':
    151161                    return CSSUnitType::CSS_LVH;
     162                case 'i':
     163                    return CSSUnitType::CSS_LVI;
    152164                case 'w':
    153165                    return CSSUnitType::CSS_LVW;
     
    178190            if (toASCIILower(data[1]) == 'v') {
    179191                switch (toASCIILower(data[2])) {
     192                case 'b':
     193                    return CSSUnitType::CSS_SVB;
    180194                case 'h':
    181195                    return CSSUnitType::CSS_SVH;
     196                case 'i':
     197                    return CSSUnitType::CSS_SVI;
    182198                case 'w':
    183199                    return CSSUnitType::CSS_SVW;
  • trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp

    r286196 r286458  
    489489    case CSSUnitType::CSS_VMIN:
    490490    case CSSUnitType::CSS_VMAX:
     491    case CSSUnitType::CSS_VB:
     492    case CSSUnitType::CSS_VI:
    491493    case CSSUnitType::CSS_SVW:
    492494    case CSSUnitType::CSS_SVH:
    493495    case CSSUnitType::CSS_SVMIN:
    494496    case CSSUnitType::CSS_SVMAX:
     497    case CSSUnitType::CSS_SVB:
     498    case CSSUnitType::CSS_SVI:
    495499    case CSSUnitType::CSS_LVW:
    496500    case CSSUnitType::CSS_LVH:
    497501    case CSSUnitType::CSS_LVMIN:
    498502    case CSSUnitType::CSS_LVMAX:
     503    case CSSUnitType::CSS_LVB:
     504    case CSSUnitType::CSS_LVI:
    499505    case CSSUnitType::CSS_DVW:
    500506    case CSSUnitType::CSS_DVH:
    501507    case CSSUnitType::CSS_DVMIN:
    502508    case CSSUnitType::CSS_DVMAX:
     509    case CSSUnitType::CSS_DVB:
     510    case CSSUnitType::CSS_DVI:
    503511    case CSSUnitType::CSS_Q:
    504512        break;
  • trunk/Source/WebInspectorUI/ChangeLog

    r286412 r286458  
     12021-12-02  Devin Rousso  <drousso@apple.com>
     2
     3        [css-values-4] Support `*vi` (inline) and `*vb` (block) viewport units
     4        https://bugs.webkit.org/show_bug.cgi?id=232895
     5        <rdar://problem/85179134>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * UserInterface/Models/CSSCompletions.js:
     10
    1112021-12-01  Patrick Angle  <pangle@apple.com>
    212
  • trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js

    r284628 r286458  
    344344    "ch",
    345345    "cm",
     346    "dvb",
    346347    "dvh",
     348    "dvi",
    347349    "dvmax",
    348350    "dvmin",
     
    351353    "ex",
    352354    "in",
     355    "lvb",
    353356    "lvh",
     357    "lvi",
    354358    "lvmax",
    355359    "lvmin",
     
    361365    "q",
    362366    "rem",
     367    "svb",
    363368    "svh",
     369    "svi",
    364370    "svmax",
    365371    "svmin",
    366372    "svw",
     373    "vb",
    367374    "vh",
     375    "vi",
    368376    "vmax",
    369377    "vmin",
  • trunk/Tools/ChangeLog

    r286455 r286458  
     12021-12-02  Devin Rousso  <drousso@apple.com>
     2
     3        [css-values-4] Support `*vi` (inline) and `*vb` (block) viewport units
     4        https://bugs.webkit.org/show_bug.cgi?id=232895
     5        <rdar://problem/85179134>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html:
     10        * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.svg: Added.
     11        * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm:
     12        (TEST.CSSViewportUnits.AllSame):
     13        (TEST.CSSViewportUnits.EmptyUnobscuredSizeOverrides):
     14        (TEST.CSSViewportUnits.SameUnobscuredSizeOverrides):
     15        (TEST.CSSViewportUnits.DifferentUnobscuredSizeOverrides):
     16        (TEST.CSSViewportUnits.SVGDocument): Added.
     17
     18        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     19
    1202021-12-02  Chris Dumez  <cdumez@apple.com>
    221
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r286455 r286458  
    764764                93FCDB34263631560046DD7D /* SortedArrayMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93FCDB33263631560046DD7D /* SortedArrayMap.cpp */; };
    765765                952F7167270BD9CB00D00DCC /* CSSViewportUnits.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 952F7166270BD99700D00DCC /* CSSViewportUnits.html */; };
     766                952F7167270BD9CB00D00DCD /* CSSViewportUnits.svg in Copy Resources */ = {isa = PBXBuildFile; fileRef = 952F7166270BD99700D00DCD /* CSSViewportUnits.svg */; };
    766767                996EDCCB270E70D7006DF175 /* InspectorExtension-basic-page.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 996EDCCA270E70AB006DF175 /* InspectorExtension-basic-page.html */; };
    767768                9984FACE1CFFB090008D198C /* editable-body.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9984FACD1CFFB038008D198C /* editable-body.html */; };
     
    12701271                                4995A6F025E8772000E5F0A9 /* csp-document-uri-report.html in Copy Resources */,
    12711272                                952F7167270BD9CB00D00DCC /* CSSViewportUnits.html in Copy Resources */,
     1273                                952F7167270BD9CB00D00DCD /* CSSViewportUnits.svg in Copy Resources */,
    12721274                                2DDD4DA4270B8B3500659A61 /* cube.usdz in Copy Resources */,
    12731275                                F4AB578A1F65165400DB0DA1 /* custom-draggable-div.html in Copy Resources */,
     
    25092511                952F7164270BD97E00D00DCC /* CSSViewportUnits.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CSSViewportUnits.mm; sourceTree = "<group>"; };
    25102512                952F7166270BD99700D00DCC /* CSSViewportUnits.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = CSSViewportUnits.html; sourceTree = "<group>"; };
     2513                952F7166270BD99700D00DCD /* CSSViewportUnits.svg */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = CSSViewportUnits.svg; sourceTree = "<group>"; };
    25112514                953ABB3425C0D681004C8B73 /* WKWebViewUnderPageBackgroundColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewUnderPageBackgroundColor.mm; sourceTree = "<group>"; };
    25122515                958B70E026C46EDC00B2022B /* NSAttributedStringWebKitAdditions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NSAttributedStringWebKitAdditions.mm; sourceTree = "<group>"; };
     
    39903993                                4995A6EF25E876A300E5F0A9 /* csp-document-uri-report.html */,
    39913994                                952F7166270BD99700D00DCC /* CSSViewportUnits.html */,
     3995                                952F7166270BD99700D00DCD /* CSSViewportUnits.svg */,
    39923996                                F4AB57891F65164B00DB0DA1 /* custom-draggable-div.html */,
    39933997                                F47DFB2421A8704A00021FB6 /* data-detectors.html */,
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html

    r286350 r286458  
    2020    <div id="vmin" style="height: 100vmin;"></div>
    2121    <div id="vmax" style="height: 100vmax;"></div>
     22    <div id="vb" style="height: 100vb;"></div>
     23    <div id="vi" style="height: 100vi;"></div>
    2224
    2325    <div id="svw" style="height: 100svw;"></div>
     
    2527    <div id="svmin" style="height: 100svmin;"></div>
    2628    <div id="svmax" style="height: 100svmax;"></div>
     29    <div id="svb" style="height: 100svb;"></div>
     30    <div id="svi" style="height: 100svi;"></div>
    2731
    2832    <div id="lvw" style="height: 100lvw;"></div>
     
    3034    <div id="lvmin" style="height: 100lvmin;"></div>
    3135    <div id="lvmax" style="height: 100lvmax;"></div>
     36    <div id="lvb" style="height: 100lvb;"></div>
     37    <div id="lvi" style="height: 100lvi;"></div>
    3238
    3339    <div id="dvw" style="height: 100dvw;"></div>
     
    3541    <div id="dvmin" style="height: 100dvmin;"></div>
    3642    <div id="dvmax" style="height: 100dvmax;"></div>
     43    <div id="dvb" style="height: 100dvb;"></div>
     44    <div id="dvi" style="height: 100dvi;"></div>
    3745</body>
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm

    r286350 r286458  
    6666    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vmin"));
    6767    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vmax"));
     68    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vb"));
     69    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vi"));
    6870
    6971    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svw"));
     
    7173    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svmin"));
    7274    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svmax"));
     75    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svb"));
     76    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svi"));
    7377
    7478    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvw"));
     
    7680    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvmin"));
    7781    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvmax"));
    78 
    79     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
    80     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
    81     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
    82     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
     82    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvb"));
     83    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvi"));
     84
     85    {
     86        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     87        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     88        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     89        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     90        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     91        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     92        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvb"));
     93        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvi"));
     94    }
    8395
    8496#if PLATFORM(IOS_FAMILY)
     
    94106    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vmin"));
    95107    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vmax"));
     108    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vb"));
     109    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vi"));
    96110
    97111    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svw"));
     
    99113    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svmin"));
    100114    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svmax"));
     115    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svb"));
     116    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svi"));
    101117
    102118    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvw"));
     
    104120    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvmin"));
    105121    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvmax"));
    106 
    107     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
    108     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
    109     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
    110     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
     122    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvb"));
     123    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvi"));
     124
     125    {
     126        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     127        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     128        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     129        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     130        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     131        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     132        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvb"));
     133        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvi"));
     134    }
     135
     136    [webView objectByEvaluatingJavaScript:@"document.documentElement.style.writingMode = 'vertical-lr'"];
     137    [webView waitForNextPresentationUpdate];
     138
     139    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vw"));
     140    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vh"));
     141    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vmin"));
     142    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vmax"));
     143    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vb"));
     144    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vi"));
     145
     146    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svw"));
     147    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svh"));
     148    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svmin"));
     149    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svmax"));
     150    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svb"));
     151    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svi"));
     152
     153    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvw"));
     154    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvh"));
     155    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvmin"));
     156    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvmax"));
     157    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvb"));
     158    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvi"));
     159
     160    {
     161        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     162        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     163        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     164        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     165        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     166        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     167        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvb"));
     168        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvi"));
     169    }
    111170}
    112171
     
    125184    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
    126185    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
    127 
    128     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
    129     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
    130     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
    131     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     186    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vb"));
     187    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vi"));
     188
     189    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     190    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     191    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     192    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     193    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svb"));
     194    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svi"));
    132195
    133196    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
     
    135198    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
    136199    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
    137 
    138     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
    139     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
    140     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
    141     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
     200    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvb"));
     201    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvi"));
     202
     203    {
     204        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     205        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     206        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     207        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     208        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     209        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     210        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvb"));
     211        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvi"));
     212    }
    142213
    143214    [webView scrollView].zoomScale = 2;
     
    148219    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
    149220    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
    150 
    151     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
    152     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
    153     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
    154     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     221    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vb"));
     222    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vi"));
     223
     224    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     225    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     226    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     227    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     228    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svb"));
     229    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svi"));
    155230
    156231    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
     
    158233    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
    159234    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
    160 
    161     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
    162     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
    163     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
    164     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
     235    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvb"));
     236    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvi"));
     237
     238    {
     239        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     240        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     241        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     242        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     243        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     244        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     245        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvb"));
     246        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvi"));
     247    }
     248
     249    [webView objectByEvaluatingJavaScript:@"document.documentElement.style.writingMode = 'vertical-lr'"];
     250    [webView waitForNextPresentationUpdate];
     251
     252    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vw"));
     253    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vh"));
     254    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
     255    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
     256    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vb"));
     257    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vi"));
     258
     259    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     260    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     261    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     262    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     263    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svb"));
     264    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svi"));
     265
     266    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
     267    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvh"));
     268    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
     269    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
     270    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvb"));
     271    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvi"));
     272
     273    {
     274        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     275        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     276        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     277        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     278        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     279        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     280        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvb"));
     281        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvi"));
     282    }
    165283}
    166284
     
    177295    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
    178296    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
    179 
    180     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
    181     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
    182     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
    183     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     297    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vb"));
     298    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vi"));
     299
     300    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     301    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     302    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     303    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     304    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svb"));
     305    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svi"));
    184306
    185307    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
     
    187309    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
    188310    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
    189 
    190     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
    191     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
    192     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
    193     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
     311    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvb"));
     312    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvi"));
     313
     314    {
     315        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     316        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     317        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     318        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     319        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     320        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     321        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvb"));
     322        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvi"));
     323    }
    194324
    195325    [webView scrollView].zoomScale = 2;
     
    200330    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
    201331    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
    202 
    203     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
    204     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
    205     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
    206     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     332    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vb"));
     333    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vi"));
     334
     335    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     336    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     337    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     338    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     339    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svb"));
     340    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svi"));
    207341
    208342    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
     
    210344    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
    211345    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
    212 
    213     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
    214     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
    215     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
    216     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
     346    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvb"));
     347    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvi"));
     348
     349    {
     350        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     351        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     352        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     353        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     354        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     355        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     356        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvb"));
     357        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvi"));
     358    }
     359
     360    [webView objectByEvaluatingJavaScript:@"document.documentElement.style.writingMode = 'vertical-lr'"];
     361    [webView waitForNextPresentationUpdate];
     362
     363    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vw"));
     364    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vh"));
     365    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
     366    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
     367    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vb"));
     368    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vi"));
     369
     370    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     371    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     372    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     373    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     374    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svb"));
     375    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svi"));
     376
     377    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
     378    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvh"));
     379    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
     380    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
     381    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvb"));
     382    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvi"));
     383
     384    {
     385        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     386        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     387        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     388        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     389        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     390        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     391        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvb"));
     392        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvi"));
     393    }
    217394}
    218395
     
    229406    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vmin"));
    230407    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vmax"));
    231 
    232     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
    233     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
    234     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
    235     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     408    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vb"));
     409    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vi"));
     410
     411    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     412    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     413    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     414    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     415    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svb"));
     416    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svi"));
    236417
    237418    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvw"));
     
    239420    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvmin"));
    240421    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvmax"));
    241 
    242     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
    243     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
    244     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
    245     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
     422    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvb"));
     423    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvi"));
     424
     425    {
     426        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     427        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     428        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     429        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     430        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     431        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     432        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvb"));
     433        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvi"));
     434    }
    246435
    247436    [webView scrollView].zoomScale = 2;
     
    252441    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vmin"));
    253442    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vmax"));
    254 
    255     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
    256     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
    257     EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
    258     EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     443    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vb"));
     444    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vi"));
     445
     446    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     447    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     448    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     449    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     450    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svb"));
     451    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svi"));
    259452
    260453    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvw"));
     
    262455    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvmin"));
    263456    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvmax"));
    264 
    265     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
    266     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
    267     EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
    268     EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
     457    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvb"));
     458    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvi"));
     459
     460    {
     461        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     462        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     463        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     464        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     465        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     466        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     467        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvb"));
     468        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvi"));
     469    }
     470
     471    [webView objectByEvaluatingJavaScript:@"document.documentElement.style.writingMode = 'vertical-lr'"];
     472    [webView waitForNextPresentationUpdate];
     473
     474    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vw"));
     475    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vh"));
     476    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vmin"));
     477    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vmax"));
     478    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vb"));
     479    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vi"));
     480
     481    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
     482    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
     483    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
     484    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
     485    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svb"));
     486    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svi"));
     487
     488    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvw"));
     489    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvh"));
     490    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvmin"));
     491    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvmax"));
     492    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvb"));
     493    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvi"));
     494
     495    {
     496        double fixedWidth = widthOfElementWithID(webView, @"fixed");
     497        double fixedHeight = heightOfElementWithID(webView, @"fixed");
     498        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvw"));
     499        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvh"));
     500        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvmin"));
     501        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvmax"));
     502        EXPECT_FLOAT_EQ(fixedWidth, viewportUnitLength(webView, @"dvb"));
     503        EXPECT_FLOAT_EQ(fixedHeight, viewportUnitLength(webView, @"dvi"));
     504    }
    269505}
    270506
    271507#endif // PLATFORM(IOS_FAMILY)
     508
     509TEST(CSSViewportUnits, SVGDocument)
     510{
     511    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
     512    [webView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"CSSViewportUnits" withExtension:@"svg" subdirectory:@"TestWebKitAPI.resources"]]];
     513    [webView _test_waitForDidFinishNavigation];
     514    [webView waitForNextPresentationUpdate];
     515
     516    {
     517        double vw = viewportUnitLength(webView, @"vw");
     518        double vh = viewportUnitLength(webView, @"vh");
     519        EXPECT_GE(vw, 320);
     520        EXPECT_GE(vh, 500);
     521        EXPECT_FLOAT_EQ(vw, viewportUnitLength(webView, @"vmin"));
     522        EXPECT_FLOAT_EQ(vh, viewportUnitLength(webView, @"vmax"));
     523        EXPECT_FLOAT_EQ(vh, viewportUnitLength(webView, @"vb"));
     524        EXPECT_FLOAT_EQ(vw, viewportUnitLength(webView, @"vi"));
     525
     526        double svw = viewportUnitLength(webView, @"svw");
     527        double svh = viewportUnitLength(webView, @"svh");
     528        EXPECT_FLOAT_EQ(vw, svw);
     529        EXPECT_FLOAT_EQ(vh, svh);
     530        EXPECT_FLOAT_EQ(svw, viewportUnitLength(webView, @"svmin"));
     531        EXPECT_FLOAT_EQ(svh, viewportUnitLength(webView, @"svmax"));
     532        EXPECT_FLOAT_EQ(svh, viewportUnitLength(webView, @"svb"));
     533        EXPECT_FLOAT_EQ(svw, viewportUnitLength(webView, @"svi"));
     534
     535        double lvw = viewportUnitLength(webView, @"lvw");
     536        double lvh = viewportUnitLength(webView, @"lvh");
     537        EXPECT_FLOAT_EQ(vw, lvw);
     538        EXPECT_FLOAT_EQ(vh, lvh);
     539        EXPECT_FLOAT_EQ(lvw, viewportUnitLength(webView, @"lvmin"));
     540        EXPECT_FLOAT_EQ(lvh, viewportUnitLength(webView, @"lvmax"));
     541        EXPECT_FLOAT_EQ(lvh, viewportUnitLength(webView, @"lvb"));
     542        EXPECT_FLOAT_EQ(lvw, viewportUnitLength(webView, @"lvi"));
     543
     544        double dvw = viewportUnitLength(webView, @"dvw");
     545        double dvh = viewportUnitLength(webView, @"dvh");
     546        EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), dvw);
     547        EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), dvh);
     548        EXPECT_FLOAT_EQ(dvw, viewportUnitLength(webView, @"dvmin"));
     549        EXPECT_FLOAT_EQ(dvh, viewportUnitLength(webView, @"dvmax"));
     550        EXPECT_FLOAT_EQ(dvh, viewportUnitLength(webView, @"dvb"));
     551        EXPECT_FLOAT_EQ(dvw, viewportUnitLength(webView, @"dvi"));
     552    };
     553
     554#if PLATFORM(IOS_FAMILY)
     555    [webView scrollView].zoomScale = 2;
     556#elif PLATFORM(MAC)
     557    [webView setAllowsMagnification:YES];
     558    [webView setMagnification:2];
     559#endif
     560    [webView waitForNextPresentationUpdate];
     561
     562    {
     563        double vw = viewportUnitLength(webView, @"vw");
     564        double vh = viewportUnitLength(webView, @"vh");
     565        EXPECT_GE(vw, 320);
     566        EXPECT_GE(vh, 500);
     567        EXPECT_FLOAT_EQ(vw, viewportUnitLength(webView, @"vmin"));
     568        EXPECT_FLOAT_EQ(vh, viewportUnitLength(webView, @"vmax"));
     569        EXPECT_FLOAT_EQ(vh, viewportUnitLength(webView, @"vb"));
     570        EXPECT_FLOAT_EQ(vw, viewportUnitLength(webView, @"vi"));
     571
     572        double svw = viewportUnitLength(webView, @"svw");
     573        double svh = viewportUnitLength(webView, @"svh");
     574        EXPECT_FLOAT_EQ(vw, svw);
     575        EXPECT_FLOAT_EQ(vh, svh);
     576        EXPECT_FLOAT_EQ(svw, viewportUnitLength(webView, @"svmin"));
     577        EXPECT_FLOAT_EQ(svh, viewportUnitLength(webView, @"svmax"));
     578        EXPECT_FLOAT_EQ(svh, viewportUnitLength(webView, @"svb"));
     579        EXPECT_FLOAT_EQ(svw, viewportUnitLength(webView, @"svi"));
     580
     581        double lvw = viewportUnitLength(webView, @"lvw");
     582        double lvh = viewportUnitLength(webView, @"lvh");
     583        EXPECT_FLOAT_EQ(vw, lvw);
     584        EXPECT_FLOAT_EQ(vh, lvh);
     585        EXPECT_FLOAT_EQ(lvw, viewportUnitLength(webView, @"lvmin"));
     586        EXPECT_FLOAT_EQ(lvh, viewportUnitLength(webView, @"lvmax"));
     587        EXPECT_FLOAT_EQ(lvh, viewportUnitLength(webView, @"lvb"));
     588        EXPECT_FLOAT_EQ(lvw, viewportUnitLength(webView, @"lvi"));
     589
     590        double dvw = viewportUnitLength(webView, @"dvw");
     591        double dvh = viewportUnitLength(webView, @"dvh");
     592        EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), dvw);
     593        EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), dvh);
     594        EXPECT_FLOAT_EQ(dvw, viewportUnitLength(webView, @"dvmin"));
     595        EXPECT_FLOAT_EQ(dvh, viewportUnitLength(webView, @"dvmax"));
     596        EXPECT_FLOAT_EQ(dvh, viewportUnitLength(webView, @"dvb"));
     597        EXPECT_FLOAT_EQ(dvw, viewportUnitLength(webView, @"dvi"));
     598    }
     599
     600    [webView objectByEvaluatingJavaScript:@"document.documentElement.style.writingMode = 'vertical-lr'"];
     601    [webView waitForNextPresentationUpdate];
     602
     603    {
     604        double vw = viewportUnitLength(webView, @"vw");
     605        double vh = viewportUnitLength(webView, @"vh");
     606        EXPECT_GE(vw, 320);
     607        EXPECT_GE(vh, 500);
     608        EXPECT_FLOAT_EQ(vw, viewportUnitLength(webView, @"vmin"));
     609        EXPECT_FLOAT_EQ(vh, viewportUnitLength(webView, @"vmax"));
     610        EXPECT_FLOAT_EQ(vw, viewportUnitLength(webView, @"vb"));
     611        EXPECT_FLOAT_EQ(vh, viewportUnitLength(webView, @"vi"));
     612
     613        double svw = viewportUnitLength(webView, @"svw");
     614        double svh = viewportUnitLength(webView, @"svh");
     615        EXPECT_FLOAT_EQ(vw, svw);
     616        EXPECT_FLOAT_EQ(vh, svh);
     617        EXPECT_FLOAT_EQ(svw, viewportUnitLength(webView, @"svmin"));
     618        EXPECT_FLOAT_EQ(svh, viewportUnitLength(webView, @"svmax"));
     619        EXPECT_FLOAT_EQ(svw, viewportUnitLength(webView, @"svb"));
     620        EXPECT_FLOAT_EQ(svh, viewportUnitLength(webView, @"svi"));
     621
     622        double lvw = viewportUnitLength(webView, @"lvw");
     623        double lvh = viewportUnitLength(webView, @"lvh");
     624        EXPECT_FLOAT_EQ(vw, lvw);
     625        EXPECT_FLOAT_EQ(vh, lvh);
     626        EXPECT_FLOAT_EQ(lvw, viewportUnitLength(webView, @"lvmin"));
     627        EXPECT_FLOAT_EQ(lvh, viewportUnitLength(webView, @"lvmax"));
     628        EXPECT_FLOAT_EQ(lvw, viewportUnitLength(webView, @"lvb"));
     629        EXPECT_FLOAT_EQ(lvh, viewportUnitLength(webView, @"lvi"));
     630
     631        double dvw = viewportUnitLength(webView, @"dvw");
     632        double dvh = viewportUnitLength(webView, @"dvh");
     633        EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), dvw);
     634        EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), dvh);
     635        EXPECT_FLOAT_EQ(dvw, viewportUnitLength(webView, @"dvmin"));
     636        EXPECT_FLOAT_EQ(dvh, viewportUnitLength(webView, @"dvmax"));
     637        EXPECT_FLOAT_EQ(dvw, viewportUnitLength(webView, @"dvb"));
     638        EXPECT_FLOAT_EQ(dvh, viewportUnitLength(webView, @"dvi"));
     639    }
     640}
Note: See TracChangeset for help on using the changeset viewer.