Title: [284628] trunk
Revision
284628
Author
drou...@apple.com
Date
2021-10-21 11:17:59 -0700 (Thu, 21 Oct 2021)

Log Message

[css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
https://bugs.webkit.org/show_bug.cgi?id=219287
<rdar://problem/71857370>

Reviewed by Simon Fraser.

Source/WebCore:

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

Tests: CSSViewportUnits.AllSame
       CSSViewportUnits.EmptyUnobscuredSizeOverrides
       CSSViewportUnits.SameUnobscuredSizeOverrides
       CSSViewportUnits.DifferentUnobscuredSizeOverrides

* css/CSSUnits.h:
* css/CSSUnits.cpp:
(WebCore::operator<<):
* css/CSSPrimitiveValue.h:
(WebCore::CSSPrimitiveValue::isViewportPercentageLength):
(WebCore::CSSPrimitiveValue::isViewportPercentageWidth): Deleted.
(WebCore::CSSPrimitiveValue::isViewportPercentageHeight): Deleted.
(WebCore::CSSPrimitiveValue::isViewportPercentageMax): Deleted.
(WebCore::CSSPrimitiveValue::isViewportPercentageMin): Deleted.
* css/CSSPrimitiveValue.cpp:
(WebCore::isValidCSSUnitTypeForDoubleConversion):
(WebCore::isStringType):
(WebCore::CSSPrimitiveValue::cleanup):
(WebCore::CSSPrimitiveValue::computeUnzoomedNonCalcLengthDouble):
(WebCore::CSSPrimitiveValue::computeNonCalcLengthDouble):
(WebCore::CSSPrimitiveValue::unitTypeString):
(WebCore::CSSPrimitiveValue::formatNumberForCustomCSSText const):
(WebCore::CSSPrimitiveValue::equals const):
* css/CSSToLengthConversionData.h:
* css/CSSToLengthConversionData.cpp:
(WebCore::CSSToLengthConversionData::defaultViewportFactor const): Added.
(WebCore::CSSToLengthConversionData::smallViewportFactor const): Added.
(WebCore::CSSToLengthConversionData::largeViewportFactor const): Added.
(WebCore::CSSToLengthConversionData::dynamicViewportFactor const): Added.
(WebCore::CSSToLengthConversionData::viewportWidthFactor const): Deleted.
(WebCore::CSSToLengthConversionData::viewportHeightFactor const): Deleted.
(WebCore::CSSToLengthConversionData::viewportMinFactor const): Deleted.
(WebCore::CSSToLengthConversionData::viewportMaxFactor const): Deleted.
* css/parser/CSSParserToken.cpp:
(WebCore::cssPrimitiveValueUnitFromTrie):
* css/parser/CSSPropertyParserHelpers.cpp:
(WebCore::CSSPropertyParserHelpers::consumeLengthRawWithKnownTokenTypeDimension):
* css/calc/CSSCalcCategoryMapping.cpp:
(WebCore::calcUnitCategory):
(WebCore::calculationCategoryForCombination):
(WebCore::hasDoubleValue):
Add support for parsing the following and converting them to their underlying value:
- `svw` "small viewport width" is the width of the viewport if all UA interfaces are maximized
- `svh` "small viewport height" is the height of the viewport if all UA interfaces are maximized
- `svmin` "small viewport small dimension" is `min(svw, svh)`
- `svmax` "small viewport large dimension" is `max(svw, svh)`
- `lvw` "large viewport width" is the width of the viewport if all UA interfaces are minimized
- `lvh` "large viewport height" is the height of the viewport if all UA interfaces are minimized
- `lvmin` "large viewport small dimension" is `min(lvw, lvh)`
- `lvmax` "large viewport large dimension" is `max(lvw, lvh)`
- `dvw` "dynamic viewport width" is the width of the viewport with all UA interfaces being in whatever state they are currently in
- `dvh` "dynamic viewport height" is the height of the viewport with all UA interfaces being in whatever state they are currently in
- `dvmin` "dynamic viewport small dimension" is `min(dvw, dvh)`
- `dvmax` "dynamic viewport large dimension" is `max(dvw, dvh)`
The existing `vw`/`vh`/`vmin`/`vmax` correspond to the "UA-default viewport", which WebKit
considers equivalent to the "large viewport" `lvw`/`lvh`/`lvmin`/`lvmax`.

* page/FrameView.h:
* page/FrameView.cpp:
(WebCore::FrameView::unobscuredContentSizeChanged):
(WebCore::FrameView::performSizeToContentAutoSize):
(WebCore::FrameView::enableAutoSizeMode):
(WebCore::FrameView::clearSizeOverrideForCSSSmallViewportUnits): Added.
(WebCore::FrameView::setSizeForCSSSmallViewportUnits): Added.
(WebCore::FrameView::overrideWidthForCSSSmallViewportUnits): Added.
(WebCore::FrameView::resetOverriddenWidthForCSSSmallViewportUnits): Added.
(WebCore::FrameView::overrideSizeForCSSSmallViewportUnits): Added.
(WebCore::FrameView::sizeForCSSSmallViewportUnits const): Added.
(WebCore::FrameView::clearSizeOverrideForCSSLargeViewportUnits): Renamed from `clearViewportSizeOverrideForCSSViewportUnits`.
(WebCore::FrameView::setSizeForCSSLargeViewportUnits): Renamed from `setViewportSizeForCSSViewportUnits`.
(WebCore::FrameView::overrideWidthForCSSLargeViewportUnits): Renamed from `overrideViewportWidthForCSSViewportUnits`.
(WebCore::FrameView::resetOverriddenWidthForCSSLargeViewportUnits): Renamed from `resetOverriddenViewportWidthForCSSViewportUnits`.
(WebCore::FrameView::overrideSizeForCSSLargeViewportUnits): Renamed from `overrideViewportSizeForCSSViewportUnits`.
(WebCore::FrameView::sizeForCSSLargeViewportUnits const): Renamed from `viewportSizeForCSSViewportUnits`.
(WebCore::FrameView::calculateSizeForCSSViewportUnitsOverride const): Added.
(WebCore::FrameView::sizeForCSSDynamicViewportUnits const): Added.
(WebCore::FrameView::sizeForCSSDefaultViewportUnits const): Added.
* rendering/RenderView.h:
* rendering/RenderView.cpp:
(WebCore::RenderView::sizeForCSSSmallViewportUnits const): Added.
(WebCore::RenderView::sizeForCSSLargeViewportUnits const): Renamed from `viewportSizeForCSSViewportUnits`.
(WebCore::RenderView::sizeForCSSDynamicViewportUnits const): Added.
(WebCore::RenderView::sizeForCSSDefaultViewportUnits const): Added.
For "small viewport" `svw`/`svh`/`svmin`/`svmax`, add support for a new `IntSize` member
that is propagated from the UIProcess. If not set, fall back to "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`.
For "large viewport" `lvw`/`lvh`/`lvmin`/`lvmax`, use the same value as "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`.
For "dynamic viewport" `dvw`/`dvh`/`dvmin`/`dvmax`, use the same value as `window.inner*`.
Drive-by: Rename `viewportSizeForCSSViewportUnits` to `sizeForCSSLargeViewportUnits` for clarity.

* platform/graphics/FloatSize.h:
(WebCore::FloatSize::minDimension const): Added.
(WebCore::FloatSize::maxDimension const): Added.
* platform/graphics/IntSize.h:
(WebCore::IntSize::minDimension const): Added.
(WebCore::IntSize::maxDimension const): Added.
Add utility/helper methods for returning the minimum/maximum of the width vs height.

* css/DeprecatedCSSOMPrimitiveValue.cpp:
(WebCore::DeprecatedCSSOMPrimitiveValue::primitiveType const):
Don't `ASSERT_NOT_REACHED` now that there are new unit types.

Source/WebInspectorUI:

* UserInterface/Models/CSSCompletions.js:

Source/WebKit:

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

Tests: CSSViewportUnits.AllSame
       CSSViewportUnits.EmptyUnobscuredSizeOverrides
       CSSViewportUnits.SameUnobscuredSizeOverrides
       CSSViewportUnits.DifferentUnobscuredSizeOverrides

* UIProcess/API/Cocoa/WKWebViewInternal.h:
* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/API/ios/WKWebViewIOS.mm:
(-[WKWebView _processWillSwapOrDidExit]):
(-[WKWebView _dispatchSetMinimumUnobscuredSize:]): Added.
(-[WKWebView _frameOrBoundsChanged]):
(activeMinimumUnobscuredSize): Added.
(-[WKWebView _didCompleteAnimatedResize]):
(-[WKWebView _minimumUnobscuredSizeOverride]): Added.
(-[WKWebView _setMinimumUnobscuredSizeOverride:]): Added.
(-[WKWebView _beginAnimatedResizeWithUpdates:]):
(-[WKWebView _overrideLayoutParametersWithMinimumLayoutSize:maximumUnobscuredSizeOverride:]):
(-[WKWebView _clearOverrideLayoutParameters]):
When this value is set from `-[WKWebView _overrideLayoutParametersWithMinimumLayoutSize:maximumUnobscuredSizeOverride:]`
it should be used as the value for "small viewport" `svw`/`svh`/`svmin`/`svmax`, but only
from that codepath. Dynamic viewport changes should not update it as they don't necessarily
represent a change in the minimum/maximum viewport size, just the current size.
"large viewport" `lvw`/`lvh`/`lvmin`/`lvmax` and "dynamic viewport" `dvw`/`dvh`/`dvmin`/`dvmax`
(as well as the existing "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`) can be derived from
existing logic.
See the WebCore ChangeLog for more information.

* Shared/WebPageCreationParameters.h:
* Shared/WebPageCreationParameters.cpp:
(WebKit::WebPageCreationParameters::encode):
(WebKit::WebPageCreationParameters::decode):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::creationParameters):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::dynamicViewportSizeUpdate):
(WebKit::WebPageProxy::setMinimumUnobscuredSize): Added.
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::WebPage):
(WebKit::WebPage::setViewportSizeForCSSViewportUnits):
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::setMinimumUnobscuredSize): Added.
(WebKit::WebPage::dynamicViewportSizeUpdate):
(WebKit::WebPage::updateViewportSizeForCSSViewportUnits):
Add piping from the UIProcess to the WebProcess for the new minimum unobscured size override.

* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::transitionToCommittedForNewPage):
Drive-by: Rename `setViewportSizeForCSSViewportUnits` to `setSizeForCSSLargeViewportUnits` for clarity.

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm: Added.
(evaluateForInt):
(getElementHeight):
(TEST.CSSViewportUnits.AllSame):
(TEST.CSSViewportUnits.EmptyUnobscuredSizeOverrides):
(TEST.CSSViewportUnits.SameUnobscuredSizeOverrides):
(TEST.CSSViewportUnits.DifferentUnobscuredSizeOverrides):
* TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html: Added.

* TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp:
(TEST.FloatSize.MinDimension): Added.
(TEST.FloatSize.MaxDimension): Added.
* TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp:
(TEST.IntSize.MinDimension): Added.
(TEST.IntSize.MaxDimension): Added.
Add utility/helper methods for returning the minimum/maximum of the width vs height.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (284627 => 284628)


--- trunk/Source/WebCore/ChangeLog	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/ChangeLog	2021-10-21 18:17:59 UTC (rev 284628)
@@ -1,3 +1,114 @@
+2021-10-21  Devin Rousso  <drou...@apple.com>
+
+        [css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
+        https://bugs.webkit.org/show_bug.cgi?id=219287
+        <rdar://problem/71857370>
+
+        Reviewed by Simon Fraser.
+
+        Spec: <https://drafts.csswg.org/css-values-4/#viewport-variants>
+
+        Tests: CSSViewportUnits.AllSame
+               CSSViewportUnits.EmptyUnobscuredSizeOverrides
+               CSSViewportUnits.SameUnobscuredSizeOverrides
+               CSSViewportUnits.DifferentUnobscuredSizeOverrides
+
+        * css/CSSUnits.h:
+        * css/CSSUnits.cpp:
+        (WebCore::operator<<):
+        * css/CSSPrimitiveValue.h:
+        (WebCore::CSSPrimitiveValue::isViewportPercentageLength):
+        (WebCore::CSSPrimitiveValue::isViewportPercentageWidth): Deleted.
+        (WebCore::CSSPrimitiveValue::isViewportPercentageHeight): Deleted.
+        (WebCore::CSSPrimitiveValue::isViewportPercentageMax): Deleted.
+        (WebCore::CSSPrimitiveValue::isViewportPercentageMin): Deleted.
+        * css/CSSPrimitiveValue.cpp:
+        (WebCore::isValidCSSUnitTypeForDoubleConversion):
+        (WebCore::isStringType):
+        (WebCore::CSSPrimitiveValue::cleanup):
+        (WebCore::CSSPrimitiveValue::computeUnzoomedNonCalcLengthDouble):
+        (WebCore::CSSPrimitiveValue::computeNonCalcLengthDouble):
+        (WebCore::CSSPrimitiveValue::unitTypeString):
+        (WebCore::CSSPrimitiveValue::formatNumberForCustomCSSText const):
+        (WebCore::CSSPrimitiveValue::equals const):
+        * css/CSSToLengthConversionData.h:
+        * css/CSSToLengthConversionData.cpp:
+        (WebCore::CSSToLengthConversionData::defaultViewportFactor const): Added.
+        (WebCore::CSSToLengthConversionData::smallViewportFactor const): Added.
+        (WebCore::CSSToLengthConversionData::largeViewportFactor const): Added.
+        (WebCore::CSSToLengthConversionData::dynamicViewportFactor const): Added.
+        (WebCore::CSSToLengthConversionData::viewportWidthFactor const): Deleted.
+        (WebCore::CSSToLengthConversionData::viewportHeightFactor const): Deleted.
+        (WebCore::CSSToLengthConversionData::viewportMinFactor const): Deleted.
+        (WebCore::CSSToLengthConversionData::viewportMaxFactor const): Deleted.
+        * css/parser/CSSParserToken.cpp:
+        (WebCore::cssPrimitiveValueUnitFromTrie):
+        * css/parser/CSSPropertyParserHelpers.cpp:
+        (WebCore::CSSPropertyParserHelpers::consumeLengthRawWithKnownTokenTypeDimension):
+        * css/calc/CSSCalcCategoryMapping.cpp:
+        (WebCore::calcUnitCategory):
+        (WebCore::calculationCategoryForCombination):
+        (WebCore::hasDoubleValue):
+        Add support for parsing the following and converting them to their underlying value:
+        - `svw` "small viewport width" is the width of the viewport if all UA interfaces are maximized
+        - `svh` "small viewport height" is the height of the viewport if all UA interfaces are maximized
+        - `svmin` "small viewport small dimension" is `min(svw, svh)`
+        - `svmax` "small viewport large dimension" is `max(svw, svh)`
+        - `lvw` "large viewport width" is the width of the viewport if all UA interfaces are minimized
+        - `lvh` "large viewport height" is the height of the viewport if all UA interfaces are minimized
+        - `lvmin` "large viewport small dimension" is `min(lvw, lvh)`
+        - `lvmax` "large viewport large dimension" is `max(lvw, lvh)`
+        - `dvw` "dynamic viewport width" is the width of the viewport with all UA interfaces being in whatever state they are currently in
+        - `dvh` "dynamic viewport height" is the height of the viewport with all UA interfaces being in whatever state they are currently in
+        - `dvmin` "dynamic viewport small dimension" is `min(dvw, dvh)`
+        - `dvmax` "dynamic viewport large dimension" is `max(dvw, dvh)`
+        The existing `vw`/`vh`/`vmin`/`vmax` correspond to the "UA-default viewport", which WebKit
+        considers equivalent to the "large viewport" `lvw`/`lvh`/`lvmin`/`lvmax`.
+
+        * page/FrameView.h:
+        * page/FrameView.cpp:
+        (WebCore::FrameView::unobscuredContentSizeChanged):
+        (WebCore::FrameView::performSizeToContentAutoSize):
+        (WebCore::FrameView::enableAutoSizeMode):
+        (WebCore::FrameView::clearSizeOverrideForCSSSmallViewportUnits): Added.
+        (WebCore::FrameView::setSizeForCSSSmallViewportUnits): Added.
+        (WebCore::FrameView::overrideWidthForCSSSmallViewportUnits): Added.
+        (WebCore::FrameView::resetOverriddenWidthForCSSSmallViewportUnits): Added.
+        (WebCore::FrameView::overrideSizeForCSSSmallViewportUnits): Added.
+        (WebCore::FrameView::sizeForCSSSmallViewportUnits const): Added.
+        (WebCore::FrameView::clearSizeOverrideForCSSLargeViewportUnits): Renamed from `clearViewportSizeOverrideForCSSViewportUnits`.
+        (WebCore::FrameView::setSizeForCSSLargeViewportUnits): Renamed from `setViewportSizeForCSSViewportUnits`.
+        (WebCore::FrameView::overrideWidthForCSSLargeViewportUnits): Renamed from `overrideViewportWidthForCSSViewportUnits`.
+        (WebCore::FrameView::resetOverriddenWidthForCSSLargeViewportUnits): Renamed from `resetOverriddenViewportWidthForCSSViewportUnits`.
+        (WebCore::FrameView::overrideSizeForCSSLargeViewportUnits): Renamed from `overrideViewportSizeForCSSViewportUnits`.
+        (WebCore::FrameView::sizeForCSSLargeViewportUnits const): Renamed from `viewportSizeForCSSViewportUnits`.
+        (WebCore::FrameView::calculateSizeForCSSViewportUnitsOverride const): Added.
+        (WebCore::FrameView::sizeForCSSDynamicViewportUnits const): Added.
+        (WebCore::FrameView::sizeForCSSDefaultViewportUnits const): Added.
+        * rendering/RenderView.h:
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::sizeForCSSSmallViewportUnits const): Added.
+        (WebCore::RenderView::sizeForCSSLargeViewportUnits const): Renamed from `viewportSizeForCSSViewportUnits`.
+        (WebCore::RenderView::sizeForCSSDynamicViewportUnits const): Added.
+        (WebCore::RenderView::sizeForCSSDefaultViewportUnits const): Added.
+        For "small viewport" `svw`/`svh`/`svmin`/`svmax`, add support for a new `IntSize` member
+        that is propagated from the UIProcess. If not set, fall back to "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`.
+        For "large viewport" `lvw`/`lvh`/`lvmin`/`lvmax`, use the same value as "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`.
+        For "dynamic viewport" `dvw`/`dvh`/`dvmin`/`dvmax`, use the same value as `window.inner*`.
+        Drive-by: Rename `viewportSizeForCSSViewportUnits` to `sizeForCSSLargeViewportUnits` for clarity.
+
+        * platform/graphics/FloatSize.h:
+        (WebCore::FloatSize::minDimension const): Added.
+        (WebCore::FloatSize::maxDimension const): Added.
+        * platform/graphics/IntSize.h:
+        (WebCore::IntSize::minDimension const): Added.
+        (WebCore::IntSize::maxDimension const): Added.
+        Add utility/helper methods for returning the minimum/maximum of the width vs height.
+
+        * css/DeprecatedCSSOMPrimitiveValue.cpp:
+        (WebCore::DeprecatedCSSOMPrimitiveValue::primitiveType const):
+        Don't `ASSERT_NOT_REACHED` now that there are new unit types.
+
 2021-10-21  Aditya Keerthi  <akeer...@apple.com>
 
         [macOS] Update appearance of <datalist> indicator

Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.cpp (284627 => 284628)


--- trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -61,6 +61,10 @@
     case CSSUnitType::CSS_CM:
     case CSSUnitType::CSS_DEG:
     case CSSUnitType::CSS_DIMENSION:
+    case CSSUnitType::CSS_DVH:
+    case CSSUnitType::CSS_DVMAX:
+    case CSSUnitType::CSS_DVMIN:
+    case CSSUnitType::CSS_DVW:
     case CSSUnitType::CSS_EMS:
     case CSSUnitType::CSS_EXS:
     case CSSUnitType::CSS_FR:
@@ -77,11 +81,19 @@
     case CSSUnitType::CSS_PX:
     case CSSUnitType::CSS_Q:
     case CSSUnitType::CSS_LHS:
+    case CSSUnitType::CSS_LVH:
+    case CSSUnitType::CSS_LVMAX:
+    case CSSUnitType::CSS_LVMIN:
+    case CSSUnitType::CSS_LVW:
     case CSSUnitType::CSS_RLHS:
     case CSSUnitType::CSS_QUIRKY_EMS:
     case CSSUnitType::CSS_RAD:
     case CSSUnitType::CSS_REMS:
     case CSSUnitType::CSS_S:
+    case CSSUnitType::CSS_SVH:
+    case CSSUnitType::CSS_SVMAX:
+    case CSSUnitType::CSS_SVMIN:
+    case CSSUnitType::CSS_SVW:
     case CSSUnitType::CSS_TURN:
     case CSSUnitType::CSS_VH:
     case CSSUnitType::CSS_VMAX:
@@ -140,6 +152,10 @@
     case CSSUnitType::CSS_DPCM:
     case CSSUnitType::CSS_DPI:
     case CSSUnitType::CSS_DPPX:
+    case CSSUnitType::CSS_DVH:
+    case CSSUnitType::CSS_DVMAX:
+    case CSSUnitType::CSS_DVMIN:
+    case CSSUnitType::CSS_DVW:
     case CSSUnitType::CSS_X:
     case CSSUnitType::CSS_EMS:
     case CSSUnitType::CSS_EXS:
@@ -150,6 +166,10 @@
     case CSSUnitType::CSS_IDENT:
     case CSSUnitType::CSS_IN:
     case CSSUnitType::CSS_KHZ:
+    case CSSUnitType::CSS_LVH:
+    case CSSUnitType::CSS_LVMAX:
+    case CSSUnitType::CSS_LVMIN:
+    case CSSUnitType::CSS_LVW:
     case CSSUnitType::CSS_MM:
     case CSSUnitType::CSS_MS:
     case CSSUnitType::CSS_NUMBER:
@@ -169,6 +189,10 @@
     case CSSUnitType::CSS_REMS:
     case CSSUnitType::CSS_RGBCOLOR:
     case CSSUnitType::CSS_S:
+    case CSSUnitType::CSS_SVH:
+    case CSSUnitType::CSS_SVMAX:
+    case CSSUnitType::CSS_SVMIN:
+    case CSSUnitType::CSS_SVW:
     case CSSUnitType::CSS_SHAPE:
     case CSSUnitType::CSS_TURN:
     case CSSUnitType::CSS_UNICODE_RANGE:
@@ -522,6 +546,18 @@
     case CSSUnitType::CSS_VH:
     case CSSUnitType::CSS_VMIN:
     case CSSUnitType::CSS_VMAX:
+    case CSSUnitType::CSS_SVW:
+    case CSSUnitType::CSS_SVH:
+    case CSSUnitType::CSS_SVMIN:
+    case CSSUnitType::CSS_SVMAX:
+    case CSSUnitType::CSS_LVW:
+    case CSSUnitType::CSS_LVH:
+    case CSSUnitType::CSS_LVMIN:
+    case CSSUnitType::CSS_LVMAX:
+    case CSSUnitType::CSS_DVW:
+    case CSSUnitType::CSS_DVH:
+    case CSSUnitType::CSS_DVMIN:
+    case CSSUnitType::CSS_DVMAX:
     case CSSUnitType::CSS_DPPX:
     case CSSUnitType::CSS_X:
     case CSSUnitType::CSS_DPI:
@@ -651,21 +687,37 @@
         ASSERT_NOT_REACHED();
         return -1.0;
     case CSSUnitType::CSS_VH:
-        return renderView ? renderView->viewportSizeForCSSViewportUnits().height() / 100.0 * value : 0;
+        return renderView ? renderView->sizeForCSSDefaultViewportUnits().height() / 100.0 * value : 0;
     case CSSUnitType::CSS_VW:
-        return renderView ? renderView->viewportSizeForCSSViewportUnits().width() / 100.0 * value : 0;
+        return renderView ? renderView->sizeForCSSDefaultViewportUnits().width() / 100.0 * value : 0;
     case CSSUnitType::CSS_VMAX:
-        if (renderView) {
-            IntSize viewportSizeForCSSViewportUnits = renderView->viewportSizeForCSSViewportUnits();
-            return std::max(viewportSizeForCSSViewportUnits.width(), viewportSizeForCSSViewportUnits.height()) / 100.0 * value;
-        }
-        return value;
+        return renderView ? renderView->sizeForCSSDefaultViewportUnits().maxDimension() / 100.0 * value : value;
     case CSSUnitType::CSS_VMIN:
-        if (renderView) {
-            IntSize viewportSizeForCSSViewportUnits = renderView->viewportSizeForCSSViewportUnits();
-            return std::min(viewportSizeForCSSViewportUnits.width(), viewportSizeForCSSViewportUnits.height()) / 100.0 * value;
-        }
-        return value;
+        return renderView ? renderView->sizeForCSSDefaultViewportUnits().minDimension() / 100.0 * value : value;
+    case CSSUnitType::CSS_SVH:
+        return renderView ? renderView->sizeForCSSSmallViewportUnits().height() / 100.0 * value : 0;
+    case CSSUnitType::CSS_SVW:
+        return renderView ? renderView->sizeForCSSSmallViewportUnits().width() / 100.0 * value : 0;
+    case CSSUnitType::CSS_SVMAX:
+        return renderView ? renderView->sizeForCSSSmallViewportUnits().maxDimension() / 100.0 * value : value;
+    case CSSUnitType::CSS_SVMIN:
+        return renderView ? renderView->sizeForCSSSmallViewportUnits().minDimension() / 100.0 * value : value;
+    case CSSUnitType::CSS_LVH:
+        return renderView ? renderView->sizeForCSSLargeViewportUnits().height() / 100.0 * value : 0;
+    case CSSUnitType::CSS_LVW:
+        return renderView ? renderView->sizeForCSSLargeViewportUnits().width() / 100.0 * value : 0;
+    case CSSUnitType::CSS_LVMAX:
+        return renderView ? renderView->sizeForCSSLargeViewportUnits().maxDimension() / 100.0 * value : value;
+    case CSSUnitType::CSS_LVMIN:
+        return renderView ? renderView->sizeForCSSLargeViewportUnits().minDimension() / 100.0 * value : value;
+    case CSSUnitType::CSS_DVH:
+        return renderView ? renderView->sizeForCSSDynamicViewportUnits().height() / 100.0 * value : 0;
+    case CSSUnitType::CSS_DVW:
+        return renderView ? renderView->sizeForCSSDynamicViewportUnits().width() / 100.0 * value : 0;
+    case CSSUnitType::CSS_DVMAX:
+        return renderView ? renderView->sizeForCSSDynamicViewportUnits().maxDimension() / 100.0 * value : value;
+    case CSSUnitType::CSS_DVMIN:
+        return renderView ? renderView->sizeForCSSDynamicViewportUnits().minDimension() / 100.0 * value : value;
     default:
         ASSERT_NOT_REACHED();
         return -1.0;
@@ -712,17 +764,53 @@
         break;
 
     case CSSUnitType::CSS_VH:
-        return value * conversionData.viewportHeightFactor();
+        return value * conversionData.defaultViewportFactor().height();
 
     case CSSUnitType::CSS_VW:
-        return value * conversionData.viewportWidthFactor();
+        return value * conversionData.defaultViewportFactor().width();
 
     case CSSUnitType::CSS_VMAX:
-        return value * conversionData.viewportMaxFactor();
+        return value * conversionData.defaultViewportFactor().maxDimension();
 
     case CSSUnitType::CSS_VMIN:
-        return value * conversionData.viewportMinFactor();
+        return value * conversionData.defaultViewportFactor().minDimension();
 
+    case CSSUnitType::CSS_SVH:
+        return value * conversionData.smallViewportFactor().height();
+
+    case CSSUnitType::CSS_SVW:
+        return value * conversionData.smallViewportFactor().width();
+
+    case CSSUnitType::CSS_SVMAX:
+        return value * conversionData.smallViewportFactor().maxDimension();
+
+    case CSSUnitType::CSS_SVMIN:
+        return value * conversionData.smallViewportFactor().minDimension();
+
+    case CSSUnitType::CSS_LVH:
+        return value * conversionData.largeViewportFactor().height();
+
+    case CSSUnitType::CSS_LVW:
+        return value * conversionData.largeViewportFactor().width();
+
+    case CSSUnitType::CSS_LVMAX:
+        return value * conversionData.largeViewportFactor().maxDimension();
+
+    case CSSUnitType::CSS_LVMIN:
+        return value * conversionData.largeViewportFactor().minDimension();
+
+    case CSSUnitType::CSS_DVH:
+        return value * conversionData.dynamicViewportFactor().height();
+
+    case CSSUnitType::CSS_DVW:
+        return value * conversionData.dynamicViewportFactor().width();
+
+    case CSSUnitType::CSS_DVMAX:
+        return value * conversionData.dynamicViewportFactor().maxDimension();
+
+    case CSSUnitType::CSS_DVMIN:
+        return value * conversionData.dynamicViewportFactor().minDimension();
+
     case CSSUnitType::CSS_LHS:
         ASSERT(conversionData.style());
         if (conversionData.computingLineHeight() || conversionData.computingFontSize()) {
@@ -990,6 +1078,18 @@
         case CSSUnitType::CSS_VH: return "vh";
         case CSSUnitType::CSS_VMIN: return "vmin";
         case CSSUnitType::CSS_VMAX: return "vmax";
+        case CSSUnitType::CSS_SVW: return "svw";
+        case CSSUnitType::CSS_SVH: return "svh";
+        case CSSUnitType::CSS_SVMIN: return "svmin";
+        case CSSUnitType::CSS_SVMAX: return "svmax";
+        case CSSUnitType::CSS_LVW: return "lvw";
+        case CSSUnitType::CSS_LVH: return "lvh";
+        case CSSUnitType::CSS_LVMIN: return "lvmin";
+        case CSSUnitType::CSS_LVMAX: return "lvmax";
+        case CSSUnitType::CSS_DVW: return "dvw";
+        case CSSUnitType::CSS_DVH: return "dvh";
+        case CSSUnitType::CSS_DVMIN: return "dvmin";
+        case CSSUnitType::CSS_DVMAX: return "dvmax";
         case CSSUnitType::CSS_DPPX: return "dppx";
         case CSSUnitType::CSS_X: return "x";
         case CSSUnitType::CSS_DPI: return "dpi";
@@ -1152,6 +1252,30 @@
         return formatNumberValue("vmin");
     case CSSUnitType::CSS_VMAX:
         return formatNumberValue("vmax");
+    case CSSUnitType::CSS_SVW:
+        return formatNumberValue("svw");
+    case CSSUnitType::CSS_SVH:
+        return formatNumberValue("svh");
+    case CSSUnitType::CSS_SVMIN:
+        return formatNumberValue("svmin");
+    case CSSUnitType::CSS_SVMAX:
+        return formatNumberValue("svmax");
+    case CSSUnitType::CSS_LVW:
+        return formatNumberValue("lvw");
+    case CSSUnitType::CSS_LVH:
+        return formatNumberValue("lvh");
+    case CSSUnitType::CSS_LVMIN:
+        return formatNumberValue("lvmin");
+    case CSSUnitType::CSS_LVMAX:
+        return formatNumberValue("lvmax");
+    case CSSUnitType::CSS_DVW:
+        return formatNumberValue("dvw");
+    case CSSUnitType::CSS_DVH:
+        return formatNumberValue("dvh");
+    case CSSUnitType::CSS_DVMIN:
+        return formatNumberValue("dvmin");
+    case CSSUnitType::CSS_DVMAX:
+        return formatNumberValue("dvmax");
     case CSSUnitType::CSS_IDENT:
     case CSSUnitType::CSS_UNICODE_RANGE:
     case CSSUnitType::CSS_CALC_PERCENTAGE_WITH_NUMBER:
@@ -1219,6 +1343,18 @@
     case CSSUnitType::CSS_VH:
     case CSSUnitType::CSS_VMIN:
     case CSSUnitType::CSS_VMAX:
+    case CSSUnitType::CSS_SVW:
+    case CSSUnitType::CSS_SVH:
+    case CSSUnitType::CSS_SVMIN:
+    case CSSUnitType::CSS_SVMAX:
+    case CSSUnitType::CSS_LVW:
+    case CSSUnitType::CSS_LVH:
+    case CSSUnitType::CSS_LVMIN:
+    case CSSUnitType::CSS_LVMAX:
+    case CSSUnitType::CSS_DVW:
+    case CSSUnitType::CSS_DVH:
+    case CSSUnitType::CSS_DVMIN:
+    case CSSUnitType::CSS_DVMAX:
     case CSSUnitType::CSS_FR:
     case CSSUnitType::CSS_Q:
     case CSSUnitType::CSS_LHS:

Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.h (284627 => 284628)


--- trunk/Source/WebCore/css/CSSPrimitiveValue.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -111,10 +111,6 @@
     bool isX() const { return primitiveType() == CSSUnitType::CSS_X; }
     bool isResolution() const { return unitCategory(primitiveType()) == CSSUnitCategory::Resolution; }
     bool isViewportPercentageLength() const { return isViewportPercentageLength(primitiveUnitType()); }
-    bool isViewportPercentageWidth() const { return primitiveUnitType() == CSSUnitType::CSS_VW; }
-    bool isViewportPercentageHeight() const { return primitiveUnitType() == CSSUnitType::CSS_VH; }
-    bool isViewportPercentageMax() const { return primitiveUnitType() == CSSUnitType::CSS_VMAX; }
-    bool isViewportPercentageMin() const { return primitiveUnitType() == CSSUnitType::CSS_VMIN; }
     bool isValueID() const { return primitiveUnitType() == CSSUnitType::CSS_VALUE_ID; }
     bool isFlex() const { return primitiveType() == CSSUnitType::CSS_FR; }
     bool isCustomIdent() const { return primitiveUnitType() == CSSUnitType::CustomIdent; }
@@ -315,10 +311,7 @@
 
 constexpr bool CSSPrimitiveValue::isViewportPercentageLength(CSSUnitType type)
 {
-    return type == CSSUnitType::CSS_VW
-        || type == CSSUnitType::CSS_VH
-        || type == CSSUnitType::CSS_VMIN
-        || type == CSSUnitType::CSS_VMAX;
+    return type >= CSSUnitType::CSS_VW && type <= CSSUnitType::CSS_DVMAX;
 }
 
 template<typename T> inline Ref<CSSPrimitiveValue> CSSPrimitiveValue::create(T&& value)

Modified: trunk/Source/WebCore/css/CSSToLengthConversionData.cpp (284627 => 284628)


--- trunk/Source/WebCore/css/CSSToLengthConversionData.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSToLengthConversionData.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -31,6 +31,7 @@
 #include "config.h"
 #include "CSSToLengthConversionData.h"
 
+#include "FloatSize.h"
 #include "RenderStyle.h"
 #include "RenderView.h"
 
@@ -43,50 +44,48 @@
     return *m_zoom;
 }
 
-double CSSToLengthConversionData::viewportWidthFactor() const
+FloatSize CSSToLengthConversionData::defaultViewportFactor() const
 {
     if (m_viewportDependencyDetectionStyle)
         m_viewportDependencyDetectionStyle->setHasViewportUnits();
 
     if (!m_renderView)
-        return 0;
+        return { };
 
-    return m_renderView->viewportSizeForCSSViewportUnits().width() / 100.0;
+    return m_renderView->sizeForCSSDefaultViewportUnits() / 100.0;
 }
 
-double CSSToLengthConversionData::viewportHeightFactor() const
+FloatSize CSSToLengthConversionData::smallViewportFactor() const
 {
     if (m_viewportDependencyDetectionStyle)
         m_viewportDependencyDetectionStyle->setHasViewportUnits();
 
     if (!m_renderView)
-        return 0;
+        return { };
 
-    return m_renderView->viewportSizeForCSSViewportUnits().height() / 100.0;
+    return m_renderView->sizeForCSSSmallViewportUnits() / 100.0;
 }
 
-double CSSToLengthConversionData::viewportMinFactor() const
+FloatSize CSSToLengthConversionData::largeViewportFactor() const
 {
     if (m_viewportDependencyDetectionStyle)
         m_viewportDependencyDetectionStyle->setHasViewportUnits();
 
     if (!m_renderView)
-        return 0;
+        return { };
 
-    IntSize viewportSizeForCSSViewportUnits = m_renderView->viewportSizeForCSSViewportUnits();
-    return std::min(viewportSizeForCSSViewportUnits.width(), viewportSizeForCSSViewportUnits.height()) / 100.0;
+    return m_renderView->sizeForCSSLargeViewportUnits() / 100.0;
 }
 
-double CSSToLengthConversionData::viewportMaxFactor() const
+FloatSize CSSToLengthConversionData::dynamicViewportFactor() const
 {
     if (m_viewportDependencyDetectionStyle)
         m_viewportDependencyDetectionStyle->setHasViewportUnits();
 
     if (!m_renderView)
-        return 0;
+        return { };
 
-    IntSize viewportSizeForCSSViewportUnits = m_renderView->viewportSizeForCSSViewportUnits();
-    return std::max(viewportSizeForCSSViewportUnits.width(), viewportSizeForCSSViewportUnits.height()) / 100.0;
+    return m_renderView->sizeForCSSDynamicViewportUnits() / 100.0;
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/css/CSSToLengthConversionData.h (284627 => 284628)


--- trunk/Source/WebCore/css/CSSToLengthConversionData.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSToLengthConversionData.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -36,6 +36,7 @@
 
 namespace WebCore {
 
+class FloatSize;
 class RenderStyle;
 class RenderView;
 
@@ -74,10 +75,10 @@
     CSSPropertyID propertyToCompute() const { return m_propertyToCompute.value_or(CSSPropertyInvalid); }
     const RenderView* renderView() const { return m_renderView; }
 
-    double viewportWidthFactor() const;
-    double viewportHeightFactor() const;
-    double viewportMinFactor() const;
-    double viewportMaxFactor() const;
+    FloatSize defaultViewportFactor() const;
+    FloatSize smallViewportFactor() const;
+    FloatSize largeViewportFactor() const;
+    FloatSize dynamicViewportFactor() const;
 
     CSSToLengthConversionData copyWithAdjustedZoom(float newZoom) const
     {

Modified: trunk/Source/WebCore/css/CSSUnits.cpp (284627 => 284628)


--- trunk/Source/WebCore/css/CSSUnits.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSUnits.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -138,6 +138,18 @@
     case CSSUnitType::CSS_VH: ts << "vh"; break;
     case CSSUnitType::CSS_VMIN: ts << "vmin"; break;
     case CSSUnitType::CSS_VMAX: ts << "vmax"; break;
+    case CSSUnitType::CSS_SVW: ts << "svw"; break;
+    case CSSUnitType::CSS_SVH: ts << "svh"; break;
+    case CSSUnitType::CSS_SVMIN: ts << "svmin"; break;
+    case CSSUnitType::CSS_SVMAX: ts << "svmax"; break;
+    case CSSUnitType::CSS_LVW: ts << "lvw"; break;
+    case CSSUnitType::CSS_LVH: ts << "lvh"; break;
+    case CSSUnitType::CSS_LVMIN: ts << "lvmin"; break;
+    case CSSUnitType::CSS_LVMAX: ts << "lvmax"; break;
+    case CSSUnitType::CSS_DVW: ts << "dvw"; break;
+    case CSSUnitType::CSS_DVH: ts << "dvh"; break;
+    case CSSUnitType::CSS_DVMIN: ts << "dvmin"; break;
+    case CSSUnitType::CSS_DVMAX: ts << "dvmax"; break;
     case CSSUnitType::CSS_DPPX: ts << "dppx"; break;
     case CSSUnitType::CSS_X: ts << "x"; break;
     case CSSUnitType::CSS_DPI: ts << "dpi"; break;

Modified: trunk/Source/WebCore/css/CSSUnits.h (284627 => 284628)


--- trunk/Source/WebCore/css/CSSUnits.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSUnits.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -59,6 +59,18 @@
     CSS_VH,
     CSS_VMIN,
     CSS_VMAX,
+    CSS_SVW,
+    CSS_SVH,
+    CSS_SVMIN,
+    CSS_SVMAX,
+    CSS_LVW,
+    CSS_LVH,
+    CSS_LVMIN,
+    CSS_LVMAX,
+    CSS_DVW,
+    CSS_DVH,
+    CSS_DVMIN,
+    CSS_DVMAX,
     CSS_DPPX,
     CSS_X,
     CSS_DPI,

Modified: trunk/Source/WebCore/css/DeprecatedCSSOMPrimitiveValue.cpp (284627 => 284628)


--- trunk/Source/WebCore/css/DeprecatedCSSOMPrimitiveValue.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/DeprecatedCSSOMPrimitiveValue.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -93,10 +93,9 @@
     case CSSUnitType::CSS_VMIN:                         return CSS_VMIN;
     case CSSUnitType::CSS_VW:                           return CSS_VW;
     case CSSUnitType::CSS_X:                            return 37;
+
+    default:                                            return CSS_UNKNOWN;
     }
-
-    ASSERT_NOT_REACHED();
-    return CSS_UNKNOWN;
 }
 
 ExceptionOr<float> DeprecatedCSSOMPrimitiveValue::getFloatValue(unsigned short unitType) const

Modified: trunk/Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp (284627 => 284628)


--- trunk/Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -54,6 +54,18 @@
     case CSSUnitType::CSS_VH:
     case CSSUnitType::CSS_VMIN:
     case CSSUnitType::CSS_VMAX:
+    case CSSUnitType::CSS_SVW:
+    case CSSUnitType::CSS_SVH:
+    case CSSUnitType::CSS_SVMIN:
+    case CSSUnitType::CSS_SVMAX:
+    case CSSUnitType::CSS_LVW:
+    case CSSUnitType::CSS_LVH:
+    case CSSUnitType::CSS_LVMIN:
+    case CSSUnitType::CSS_LVMAX:
+    case CSSUnitType::CSS_DVW:
+    case CSSUnitType::CSS_DVH:
+    case CSSUnitType::CSS_DVMIN:
+    case CSSUnitType::CSS_DVMAX:
         return CalculationCategory::Length;
     case CSSUnitType::CSS_PERCENTAGE:
         return CalculationCategory::Percent;
@@ -110,6 +122,18 @@
     case CSSUnitType::CSS_VH:
     case CSSUnitType::CSS_VMIN:
     case CSSUnitType::CSS_VMAX:
+    case CSSUnitType::CSS_SVW:
+    case CSSUnitType::CSS_SVH:
+    case CSSUnitType::CSS_SVMIN:
+    case CSSUnitType::CSS_SVMAX:
+    case CSSUnitType::CSS_LVW:
+    case CSSUnitType::CSS_LVH:
+    case CSSUnitType::CSS_LVMIN:
+    case CSSUnitType::CSS_LVMAX:
+    case CSSUnitType::CSS_DVW:
+    case CSSUnitType::CSS_DVH:
+    case CSSUnitType::CSS_DVMIN:
+    case CSSUnitType::CSS_DVMAX:
     default:
         return CalculationCategory::Other;
     }
@@ -162,6 +186,18 @@
     case CSSUnitType::CSS_VH:
     case CSSUnitType::CSS_VMIN:
     case CSSUnitType::CSS_VMAX:
+    case CSSUnitType::CSS_SVW:
+    case CSSUnitType::CSS_SVH:
+    case CSSUnitType::CSS_SVMIN:
+    case CSSUnitType::CSS_SVMAX:
+    case CSSUnitType::CSS_LVW:
+    case CSSUnitType::CSS_LVH:
+    case CSSUnitType::CSS_LVMIN:
+    case CSSUnitType::CSS_LVMAX:
+    case CSSUnitType::CSS_DVW:
+    case CSSUnitType::CSS_DVH:
+    case CSSUnitType::CSS_DVMIN:
+    case CSSUnitType::CSS_DVMAX:
     case CSSUnitType::CSS_DPPX:
     case CSSUnitType::CSS_X:
     case CSSUnitType::CSS_DPI:

Modified: trunk/Source/WebCore/css/parser/CSSParserToken.cpp (284627 => 284628)


--- trunk/Source/WebCore/css/parser/CSSParserToken.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/parser/CSSParserToken.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -134,8 +134,26 @@
                 if (toASCIILower(data[2]) == 'i')
                     return CSSUnitType::CSS_DPI;
                 break;
+            case 'v':
+                switch (toASCIILower(data[2])) {
+                case 'h':
+                    return CSSUnitType::CSS_DVH;
+                case 'w':
+                    return CSSUnitType::CSS_DVW;
+                }
+                break;
             }
-        break;
+            break;
+        case 'l':
+            if (toASCIILower(data[1]) == 'v') {
+                switch (toASCIILower(data[2])) {
+                case 'h':
+                    return CSSUnitType::CSS_LVH;
+                case 'w':
+                    return CSSUnitType::CSS_LVW;
+                }
+            }
+            break;
         case 'k':
             if (toASCIILower(data[1]) == 'h' && toASCIILower(data[2]) == 'z')
                 return CSSUnitType::CSS_KHZ;
@@ -155,9 +173,19 @@
                     return CSSUnitType::CSS_RLHS;
                 break;
             }
+            break;
+        case 's':
+            if (toASCIILower(data[1]) == 'v') {
+                switch (toASCIILower(data[2])) {
+                case 'h':
+                    return CSSUnitType::CSS_SVH;
+                case 'w':
+                    return CSSUnitType::CSS_SVW;
+                }
+            }
+            break;
+        }
         break;
-    }
-    break;
     case 4:
         switch (toASCIILower(data[0])) {
         case 'd':
@@ -173,9 +201,9 @@
                         return CSSUnitType::CSS_DPPX;
                     break;
                 }
+                break;
+            }
             break;
-        }
-        break;
         case 'g':
             if (toASCIILower(data[1]) == 'r' && toASCIILower(data[2]) == 'a' && toASCIILower(data[3]) == 'd')
                 return CSSUnitType::CSS_GRAD;
@@ -208,6 +236,48 @@
             if (toASCIILower(data[1]) == '_' && toASCIILower(data[2]) == 'q' && toASCIILower(data[3]) == 'e' && toASCIILower(data[4]) == 'm')
                 return CSSUnitType::CSS_QUIRKY_EMS;
             break;
+        case 'd':
+            if (toASCIILower(data[1]) == 'v' && toASCIILower(data[2]) == 'm') {
+                switch (toASCIILower(data[3])) {
+                case 'a':
+                    if (toASCIILower(data[4]) == 'x')
+                        return CSSUnitType::CSS_DVMAX;
+                    break;
+                case 'i':
+                    if (toASCIILower(data[4]) == 'n')
+                        return CSSUnitType::CSS_DVMIN;
+                    break;
+                }
+            }
+            break;
+        case 'l':
+            if (toASCIILower(data[1]) == 'v' && toASCIILower(data[2]) == 'm') {
+                switch (toASCIILower(data[3])) {
+                case 'a':
+                    if (toASCIILower(data[4]) == 'x')
+                        return CSSUnitType::CSS_LVMAX;
+                    break;
+                case 'i':
+                    if (toASCIILower(data[4]) == 'n')
+                        return CSSUnitType::CSS_LVMIN;
+                    break;
+                }
+            }
+            break;
+        case 's':
+            if (toASCIILower(data[1]) == 'v' && toASCIILower(data[2]) == 'm') {
+                switch (toASCIILower(data[3])) {
+                case 'a':
+                    if (toASCIILower(data[4]) == 'x')
+                        return CSSUnitType::CSS_SVMAX;
+                    break;
+                case 'i':
+                    if (toASCIILower(data[4]) == 'n')
+                        return CSSUnitType::CSS_SVMIN;
+                    break;
+                }
+            }
+            break;
         }
         break;
     }

Modified: trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp (284627 => 284628)


--- trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -492,6 +492,18 @@
     case CSSUnitType::CSS_VH:
     case CSSUnitType::CSS_VMIN:
     case CSSUnitType::CSS_VMAX:
+    case CSSUnitType::CSS_SVW:
+    case CSSUnitType::CSS_SVH:
+    case CSSUnitType::CSS_SVMIN:
+    case CSSUnitType::CSS_SVMAX:
+    case CSSUnitType::CSS_LVW:
+    case CSSUnitType::CSS_LVH:
+    case CSSUnitType::CSS_LVMIN:
+    case CSSUnitType::CSS_LVMAX:
+    case CSSUnitType::CSS_DVW:
+    case CSSUnitType::CSS_DVH:
+    case CSSUnitType::CSS_DVMIN:
+    case CSSUnitType::CSS_DVMAX:
     case CSSUnitType::CSS_Q:
         break;
     default:

Modified: trunk/Source/WebCore/page/FrameView.cpp (284627 => 284628)


--- trunk/Source/WebCore/page/FrameView.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/page/FrameView.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -2892,6 +2892,9 @@
 #if PLATFORM(IOS_FAMILY)
     updateTiledBackingAdaptiveSizing();
 #endif
+
+    if (auto* document = frame().document())
+        document->updateViewportUnitsOnResize();
 }
 
 void FrameView::loadProgressingStatusChanged()
@@ -3566,7 +3569,9 @@
         document.updateLayout();
     };
 
-    resetOverriddenViewportWidthForCSSViewportUnits();
+    resetOverriddenWidthForCSSSmallViewportUnits();
+    resetOverriddenWidthForCSSLargeViewportUnits();
+
     // Start from the minimum size and allow it to grow.
     auto minAutoSize = IntSize { 1, 1 };
     resize(minAutoSize);
@@ -3626,7 +3631,8 @@
         resize(newSize.width(), i ? newSize.height() : minAutoSize.height());
         // Protect the content from evergrowing layout.
         auto preferredViewportWidth = std::min(newSize.width(), m_autoSizeConstraint.width());
-        overrideViewportWidthForCSSViewportUnits(preferredViewportWidth);
+        overrideWidthForCSSSmallViewportUnits(preferredViewportWidth);
+        overrideWidthForCSSLargeViewportUnits(preferredViewportWidth);
         // Force the scrollbar state to avoid the scrollbar code adding them and causing them to be needed. For example,
         // a vertical scrollbar may cause text to wrap and thus increase the height (which is the only reason the scollbar is needed).
         setVerticalScrollbarLock(false);
@@ -4706,11 +4712,13 @@
     setNeedsLayoutAfterViewConfigurationChange();
     layoutContext().scheduleLayout();
     if (m_shouldAutoSize) {
-        overrideViewportWidthForCSSViewportUnits(m_autoSizeConstraint.width());
+        overrideWidthForCSSSmallViewportUnits(m_autoSizeConstraint.width());
+        overrideWidthForCSSLargeViewportUnits(m_autoSizeConstraint.width());
         return;
     }
 
-    clearViewportSizeOverrideForCSSViewportUnits();
+    clearSizeOverrideForCSSSmallViewportUnits();
+    clearSizeOverrideForCSSLargeViewportUnits();
     // Since autosize mode forces the scrollbar mode, change them to being auto.
     setVerticalScrollbarLock(false);
     setHorizontalScrollbarLock(false);
@@ -5539,53 +5547,108 @@
     }
 }
 
-void FrameView::clearViewportSizeOverrideForCSSViewportUnits()
+void FrameView::clearSizeOverrideForCSSSmallViewportUnits()
 {
-    if (!m_overrideViewportSize)
+    if (!m_smallViewportSizeOverride)
         return;
 
-    m_overrideViewportSize = std::nullopt;
+    m_smallViewportSizeOverride = std::nullopt;
     if (auto* document = frame().document())
         document->styleScope().didChangeStyleSheetEnvironment();
 }
 
-void FrameView::setViewportSizeForCSSViewportUnits(IntSize size)
+void FrameView::setSizeForCSSSmallViewportUnits(IntSize size)
 {
-    overrideViewportSizeForCSSViewportUnits({ size.width(), size.height() });
+    overrideSizeForCSSSmallViewportUnits({ size.width(), size.height() });
 }
 
-void FrameView::overrideViewportWidthForCSSViewportUnits(int width)
+void FrameView::overrideWidthForCSSSmallViewportUnits(int width)
 {
-    overrideViewportSizeForCSSViewportUnits({ width, m_overrideViewportSize ? m_overrideViewportSize->height : std::nullopt });
+    overrideSizeForCSSSmallViewportUnits({ width, m_smallViewportSizeOverride ? m_smallViewportSizeOverride->height : std::nullopt });
 }
 
-void FrameView::resetOverriddenViewportWidthForCSSViewportUnits()
+void FrameView::resetOverriddenWidthForCSSSmallViewportUnits()
 {
-    overrideViewportSizeForCSSViewportUnits({ { }, m_overrideViewportSize ? m_overrideViewportSize->height : std::nullopt });
+    overrideSizeForCSSSmallViewportUnits({ { }, m_smallViewportSizeOverride ? m_smallViewportSizeOverride->height : std::nullopt });
 }
 
-void FrameView::overrideViewportSizeForCSSViewportUnits(OverrideViewportSize size)
+void FrameView::overrideSizeForCSSSmallViewportUnits(OverrideViewportSize size)
 {
-    if (m_overrideViewportSize && *m_overrideViewportSize == size)
+    if (m_smallViewportSizeOverride && *m_smallViewportSizeOverride == size)
         return;
 
-    m_overrideViewportSize = size;
+    m_smallViewportSizeOverride = size;
 
     if (auto* document = frame().document())
         document->styleScope().didChangeStyleSheetEnvironment();
 }
 
-IntSize FrameView::viewportSizeForCSSViewportUnits() const
+IntSize FrameView::sizeForCSSSmallViewportUnits() const
 {
+    return calculateSizeForCSSViewportUnitsOverride(m_smallViewportSizeOverride);
+}
+
+void FrameView::clearSizeOverrideForCSSLargeViewportUnits()
+{
+    if (!m_largeViewportSizeOverride)
+        return;
+
+    m_largeViewportSizeOverride = std::nullopt;
+    if (auto* document = frame().document())
+        document->styleScope().didChangeStyleSheetEnvironment();
+}
+
+void FrameView::setSizeForCSSLargeViewportUnits(IntSize size)
+{
+    overrideSizeForCSSLargeViewportUnits({ size.width(), size.height() });
+}
+
+void FrameView::overrideWidthForCSSLargeViewportUnits(int width)
+{
+    overrideSizeForCSSLargeViewportUnits({ width, m_largeViewportSizeOverride ? m_largeViewportSizeOverride->height : std::nullopt });
+}
+
+void FrameView::resetOverriddenWidthForCSSLargeViewportUnits()
+{
+    overrideSizeForCSSLargeViewportUnits({ { }, m_largeViewportSizeOverride ? m_largeViewportSizeOverride->height : std::nullopt });
+}
+
+void FrameView::overrideSizeForCSSLargeViewportUnits(OverrideViewportSize size)
+{
+    if (m_largeViewportSizeOverride && *m_largeViewportSizeOverride == size)
+        return;
+
+    m_largeViewportSizeOverride = size;
+
+    if (auto* document = frame().document())
+        document->styleScope().didChangeStyleSheetEnvironment();
+}
+
+IntSize FrameView::sizeForCSSLargeViewportUnits() const
+{
+    return calculateSizeForCSSViewportUnitsOverride(m_largeViewportSizeOverride);
+}
+
+IntSize FrameView::calculateSizeForCSSViewportUnitsOverride(std::optional<OverrideViewportSize> override) const
+{
     OverrideViewportSize viewportSize;
 
-    if (m_overrideViewportSize) {
-        viewportSize = *m_overrideViewportSize;
-        // auto-size overrides the width only, so we can't always bail out early here.
-        if (viewportSize.width && viewportSize.height)
-            return { *viewportSize.width, *viewportSize.height };
-    }
+    if (override)
+        viewportSize = *override;
 
+    // Use the large size if no override is given since it's considered the default size.
+    // if (m_largeViewportSizeOverride) {
+    //     if (!viewportSize.width)
+    //         viewportSize.width = m_largeViewportSizeOverride->width;
+
+    //     if (!viewportSize.height)
+    //         viewportSize.height = m_largeViewportSizeOverride->height;
+    // }
+
+    // auto-size overrides the width only, so we can't always bail out early here.
+    if (viewportSize.width && viewportSize.height)
+        return { *viewportSize.width, *viewportSize.height };
+
     if (useFixedLayout()) {
         auto fixedLayoutSize = this->fixedLayoutSize();
         viewportSize.width = viewportSize.width.value_or(fixedLayoutSize.width());
@@ -5601,6 +5664,16 @@
     return { *viewportSize.width, *viewportSize.height };
 }
 
+IntSize FrameView::sizeForCSSDynamicViewportUnits() const
+{
+    return visibleContentRectIncludingScrollbars().size();
+}
+
+IntSize FrameView::sizeForCSSDefaultViewportUnits() const
+{
+    return sizeForCSSLargeViewportUnits();
+}
+
 bool FrameView::shouldPlaceVerticalScrollbarOnLeft() const
 {
     return renderView() && renderView()->shouldPlaceVerticalScrollbarOnLeft();

Modified: trunk/Source/WebCore/page/FrameView.h (284627 => 284628)


--- trunk/Source/WebCore/page/FrameView.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/page/FrameView.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -228,10 +228,18 @@
 
     WEBCORE_EXPORT void adjustViewSize();
 
-    WEBCORE_EXPORT void setViewportSizeForCSSViewportUnits(IntSize);
-    void clearViewportSizeOverrideForCSSViewportUnits();
-    IntSize viewportSizeForCSSViewportUnits() const;
+    WEBCORE_EXPORT void setSizeForCSSSmallViewportUnits(IntSize);
+    void clearSizeOverrideForCSSSmallViewportUnits();
+    IntSize sizeForCSSSmallViewportUnits() const;
 
+    WEBCORE_EXPORT void setSizeForCSSLargeViewportUnits(IntSize);
+    void clearSizeOverrideForCSSLargeViewportUnits();
+    IntSize sizeForCSSLargeViewportUnits() const;
+
+    IntSize sizeForCSSDynamicViewportUnits() const;
+
+    IntSize sizeForCSSDefaultViewportUnits() const;
+
     IntRect windowClipRect() const final;
     WEBCORE_EXPORT IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*, bool clipToLayerContents) const;
 
@@ -854,10 +862,16 @@
 
         bool operator==(const OverrideViewportSize& rhs) const { return rhs.width == width && rhs.height == height; }
     };
-    void overrideViewportSizeForCSSViewportUnits(OverrideViewportSize);
-    void overrideViewportWidthForCSSViewportUnits(int);
-    void resetOverriddenViewportWidthForCSSViewportUnits();
+    IntSize calculateSizeForCSSViewportUnitsOverride(std::optional<OverrideViewportSize>) const;
 
+    void overrideSizeForCSSSmallViewportUnits(OverrideViewportSize);
+    void overrideWidthForCSSSmallViewportUnits(int);
+    void resetOverriddenWidthForCSSSmallViewportUnits();
+
+    void overrideSizeForCSSLargeViewportUnits(OverrideViewportSize);
+    void overrideWidthForCSSLargeViewportUnits(int);
+    void resetOverriddenWidthForCSSLargeViewportUnits();
+
     void didFinishProhibitingScrollingWhenChangingContentSize() final;
 
     // ScrollableArea.
@@ -925,7 +939,8 @@
     std::optional<IntSize> m_customSizeForResizeEvent;
 #endif
 
-    std::optional<OverrideViewportSize> m_overrideViewportSize;
+    std::optional<OverrideViewportSize> m_smallViewportSizeOverride;
+    std::optional<OverrideViewportSize> m_largeViewportSizeOverride;
 
     // The view size when autosizing.
     IntSize m_autoSizeConstraint;

Modified: trunk/Source/WebCore/platform/graphics/FloatSize.h (284627 => 284628)


--- trunk/Source/WebCore/platform/graphics/FloatSize.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/platform/graphics/FloatSize.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -72,6 +72,9 @@
     float width() const { return m_width; }
     float height() const { return m_height; }
 
+    float minDimension() const { return std::min(m_width, m_height); }
+    float maxDimension() const { return std::max(m_width, m_height); }
+
     bool hasIntrinsicWidth = false;
     bool hasIntrinsicHeight = false;
 

Modified: trunk/Source/WebCore/platform/graphics/IntSize.h (284627 => 284628)


--- trunk/Source/WebCore/platform/graphics/IntSize.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/platform/graphics/IntSize.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -74,6 +74,9 @@
     int width() const { return m_width; }
     int height() const { return m_height; }
 
+    float minDimension() const { return std::min(m_width, m_height); }
+    float maxDimension() const { return std::max(m_width, m_height); }
+
     void setWidth(int width) { m_width = width; }
     void setHeight(int height) { m_height = height; }
 

Modified: trunk/Source/WebCore/rendering/RenderView.cpp (284627 => 284628)


--- trunk/Source/WebCore/rendering/RenderView.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/rendering/RenderView.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -697,11 +697,26 @@
     return frameView().frame().pageZoomFactor();
 }
 
-IntSize RenderView::viewportSizeForCSSViewportUnits() const
+IntSize RenderView::sizeForCSSSmallViewportUnits() const
 {
-    return frameView().viewportSizeForCSSViewportUnits();
+    return frameView().sizeForCSSSmallViewportUnits();
 }
 
+IntSize RenderView::sizeForCSSLargeViewportUnits() const
+{
+    return frameView().sizeForCSSLargeViewportUnits();
+}
+
+IntSize RenderView::sizeForCSSDynamicViewportUnits() const
+{
+    return frameView().sizeForCSSDynamicViewportUnits();
+}
+
+IntSize RenderView::sizeForCSSDefaultViewportUnits() const
+{
+    return frameView().sizeForCSSDefaultViewportUnits();
+}
+
 Node* RenderView::nodeForHitTest() const
 {
     return document().documentElement();

Modified: trunk/Source/WebCore/rendering/RenderView.h (284627 => 284628)


--- trunk/Source/WebCore/rendering/RenderView.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/rendering/RenderView.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -143,7 +143,10 @@
 
     bool shouldPaintBaseBackground() const;
 
-    IntSize viewportSizeForCSSViewportUnits() const;
+    IntSize sizeForCSSSmallViewportUnits() const;
+    IntSize sizeForCSSLargeViewportUnits() const;
+    IntSize sizeForCSSDynamicViewportUnits() const;
+    IntSize sizeForCSSDefaultViewportUnits() const;
 
     bool hasQuotesNeedingUpdate() const { return m_hasQuotesNeedingUpdate; }
     void setHasQuotesNeedingUpdate(bool b) { m_hasQuotesNeedingUpdate = b; }

Modified: trunk/Source/WebInspectorUI/ChangeLog (284627 => 284628)


--- trunk/Source/WebInspectorUI/ChangeLog	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebInspectorUI/ChangeLog	2021-10-21 18:17:59 UTC (rev 284628)
@@ -1,3 +1,13 @@
+2021-10-21  Devin Rousso  <drou...@apple.com>
+
+        [css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
+        https://bugs.webkit.org/show_bug.cgi?id=219287
+        <rdar://problem/71857370>
+
+        Reviewed by Simon Fraser.
+
+        * UserInterface/Models/CSSCompletions.js:
+
 2021-10-18  David Kilzer  <ddkil...@apple.com>
 
         Web Inspector: Remove Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js.orig

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js (284627 => 284628)


--- trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js	2021-10-21 18:17:59 UTC (rev 284628)
@@ -343,9 +343,17 @@
 WI.CSSCompletions.lengthUnits = new Set([
     "ch",
     "cm",
+    "dvh",
+    "dvmax",
+    "dvmin",
+    "dvw",
     "em",
     "ex",
     "in",
+    "lvh",
+    "lvmax",
+    "lvmin",
+    "lvw",
     "mm",
     "pc",
     "pt",
@@ -352,6 +360,10 @@
     "px",
     "q",
     "rem",
+    "svh",
+    "svmax",
+    "svmin",
+    "svw",
     "vh",
     "vmax",
     "vmin",

Modified: trunk/Source/WebKit/ChangeLog (284627 => 284628)


--- trunk/Source/WebKit/ChangeLog	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/ChangeLog	2021-10-21 18:17:59 UTC (rev 284628)
@@ -1,5 +1,66 @@
 2021-10-21  Devin Rousso  <drou...@apple.com>
 
+        [css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
+        https://bugs.webkit.org/show_bug.cgi?id=219287
+        <rdar://problem/71857370>
+
+        Reviewed by Simon Fraser.
+
+        Spec: <https://drafts.csswg.org/css-values-4/#viewport-variants>
+
+        Tests: CSSViewportUnits.AllSame
+               CSSViewportUnits.EmptyUnobscuredSizeOverrides
+               CSSViewportUnits.SameUnobscuredSizeOverrides
+               CSSViewportUnits.DifferentUnobscuredSizeOverrides
+
+        * UIProcess/API/Cocoa/WKWebViewInternal.h:
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/API/ios/WKWebViewIOS.mm:
+        (-[WKWebView _processWillSwapOrDidExit]):
+        (-[WKWebView _dispatchSetMinimumUnobscuredSize:]): Added.
+        (-[WKWebView _frameOrBoundsChanged]):
+        (activeMinimumUnobscuredSize): Added.
+        (-[WKWebView _didCompleteAnimatedResize]):
+        (-[WKWebView _minimumUnobscuredSizeOverride]): Added.
+        (-[WKWebView _setMinimumUnobscuredSizeOverride:]): Added.
+        (-[WKWebView _beginAnimatedResizeWithUpdates:]):
+        (-[WKWebView _overrideLayoutParametersWithMinimumLayoutSize:maximumUnobscuredSizeOverride:]):
+        (-[WKWebView _clearOverrideLayoutParameters]):
+        When this value is set from `-[WKWebView _overrideLayoutParametersWithMinimumLayoutSize:maximumUnobscuredSizeOverride:]`
+        it should be used as the value for "small viewport" `svw`/`svh`/`svmin`/`svmax`, but only
+        from that codepath. Dynamic viewport changes should not update it as they don't necessarily
+        represent a change in the minimum/maximum viewport size, just the current size.
+        "large viewport" `lvw`/`lvh`/`lvmin`/`lvmax` and "dynamic viewport" `dvw`/`dvh`/`dvmin`/`dvmax`
+        (as well as the existing "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`) can be derived from
+        existing logic.
+        See the WebCore ChangeLog for more information.
+
+        * Shared/WebPageCreationParameters.h:
+        * Shared/WebPageCreationParameters.cpp:
+        (WebKit::WebPageCreationParameters::encode):
+        (WebKit::WebPageCreationParameters::decode):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::creationParameters):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::dynamicViewportSizeUpdate):
+        (WebKit::WebPageProxy::setMinimumUnobscuredSize): Added.
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::WebPage):
+        (WebKit::WebPage::setViewportSizeForCSSViewportUnits):
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::setMinimumUnobscuredSize): Added.
+        (WebKit::WebPage::dynamicViewportSizeUpdate):
+        (WebKit::WebPage::updateViewportSizeForCSSViewportUnits):
+        Add piping from the UIProcess to the WebProcess for the new minimum unobscured size override.
+
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::transitionToCommittedForNewPage):
+        Drive-by: Rename `setViewportSizeForCSSViewportUnits` to `setSizeForCSSLargeViewportUnits` for clarity.
+
+2021-10-21  Devin Rousso  <drou...@apple.com>
+
         [iOS] Zooming out should use the page's background color instead of fading
         https://bugs.webkit.org/show_bug.cgi?id=232036
         <rdar://problem/81926190>

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp (284627 => 284628)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -106,6 +106,7 @@
     encoder << availableScreenSize;
     encoder << overrideScreenSize;
     encoder << textAutosizingWidth;
+    encoder << minimumUnobscuredSize;
     encoder << maximumUnobscuredSize;
     encoder << deviceOrientation;
     encoder << keyboardIsAttached;
@@ -380,6 +381,8 @@
         return std::nullopt;
     if (!decoder.decode(parameters.textAutosizingWidth))
         return std::nullopt;
+    if (!decoder.decode(parameters.minimumUnobscuredSize))
+        return std::nullopt;
     if (!decoder.decode(parameters.maximumUnobscuredSize))
         return std::nullopt;
     if (!decoder.decode(parameters.deviceOrientation))

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.h (284627 => 284628)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -169,6 +169,7 @@
     WebCore::FloatSize availableScreenSize;
     WebCore::FloatSize overrideScreenSize;
     float textAutosizingWidth;
+    WebCore::FloatSize minimumUnobscuredSize;
     WebCore::FloatSize maximumUnobscuredSize;
     int32_t deviceOrientation { 0 };
     bool keyboardIsAttached { false };

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h (284627 => 284628)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -155,6 +155,8 @@
 
     std::optional<CGSize> _viewLayoutSizeOverride;
     std::optional<WebCore::FloatSize> _lastSentViewLayoutSize;
+    std::optional<CGSize> _minimumUnobscuredSizeOverride;
+    std::optional<WebCore::FloatSize> _lastSentMinimumUnobscuredSize;
     std::optional<CGSize> _maximumUnobscuredSizeOverride;
     std::optional<WebCore::FloatSize> _lastSentMaximumUnobscuredSize;
     CGRect _inputViewBoundsInWindow;

Modified: trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm (284627 => 284628)


--- trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm	2021-10-21 18:17:59 UTC (rev 284628)
@@ -695,6 +695,7 @@
     _didDeferUpdateVisibleContentRectsForUnstableScrollView = NO;
     _currentlyAdjustingScrollViewInsetsForKeyboard = NO;
     _lastSentViewLayoutSize = std::nullopt;
+    _lastSentMinimumUnobscuredSize = std::nullopt;
     _lastSentMaximumUnobscuredSize = std::nullopt;
     _lastSentDeviceOrientation = std::nullopt;
 
@@ -1902,6 +1903,15 @@
     _lastSentViewLayoutSize = viewLayoutSize;
 }
 
+- (void)_dispatchSetMinimumUnobscuredSize:(WebCore::FloatSize)minimumUnobscuredSize
+{
+    if (_lastSentMinimumUnobscuredSize && CGSizeEqualToSize(_lastSentMinimumUnobscuredSize.value(), minimumUnobscuredSize))
+        return;
+
+    _page->setMinimumUnobscuredSize(minimumUnobscuredSize);
+    _lastSentMinimumUnobscuredSize = minimumUnobscuredSize;
+}
+
 - (void)_dispatchSetMaximumUnobscuredSize:(WebCore::FloatSize)maximumUnobscuredSize
 {
     if (_lastSentMaximumUnobscuredSize && CGSizeEqualToSize(_lastSentMaximumUnobscuredSize.value(), maximumUnobscuredSize))
@@ -1937,6 +1947,8 @@
     if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing) {
         if (!_viewLayoutSizeOverride)
             [self _dispatchSetViewLayoutSize:[self activeViewLayoutSize:self.bounds]];
+        if (!_minimumUnobscuredSizeOverride)
+            [self _dispatchSetMinimumUnobscuredSize:WebCore::FloatSize(bounds.size)];
         if (!_maximumUnobscuredSizeOverride)
             [self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(bounds.size)];
 
@@ -2257,6 +2269,11 @@
         _gestureController->didStartProvisionalLoadForMainFrame();
 }
 
+static WebCore::FloatSize activeMinimumUnobscuredSize(WKWebView *webView, const CGRect& bounds)
+{
+    return WebCore::FloatSize(webView->_minimumUnobscuredSizeOverride.value_or(bounds.size));
+}
+
 static WebCore::FloatSize activeMaximumUnobscuredSize(WKWebView *webView, const CGRect& bounds)
 {
     return WebCore::FloatSize(webView->_maximumUnobscuredSizeOverride.value_or(bounds.size));
@@ -2346,6 +2363,7 @@
 
     CGRect newBounds = self.bounds;
     auto newViewLayoutSize = [self activeViewLayoutSize:newBounds];
+    auto newMinimumUnobscuredSize = activeMinimumUnobscuredSize(self, newBounds);
     auto newMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, newBounds);
     int32_t newOrientation = activeOrientation(self);
 
@@ -2352,6 +2370,9 @@
     if (!_lastSentViewLayoutSize || newViewLayoutSize != _lastSentViewLayoutSize.value())
         [self _dispatchSetViewLayoutSize:newViewLayoutSize];
 
+    if (!_lastSentMinimumUnobscuredSize || newMinimumUnobscuredSize != _lastSentMinimumUnobscuredSize.value())
+        [self _dispatchSetMinimumUnobscuredSize:WebCore::FloatSize(newMinimumUnobscuredSize)];
+
     if (!_lastSentMaximumUnobscuredSize || newMaximumUnobscuredSize != _lastSentMaximumUnobscuredSize.value())
         [self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(newMaximumUnobscuredSize)];
 
@@ -2706,6 +2727,21 @@
         [self _dispatchSetViewLayoutSize:WebCore::FloatSize(viewLayoutSizeOverride)];
 }
 
+- (CGSize)_minimumUnobscuredSizeOverride
+{
+    ASSERT(_minimumUnobscuredSizeOverride);
+    return _minimumUnobscuredSizeOverride.value_or(CGSizeZero);
+}
+
+- (void)_setMinimumUnobscuredSizeOverride:(CGSize)size
+{
+    ASSERT(size.width <= self.bounds.size.width && size.height <= self.bounds.size.height);
+    _minimumUnobscuredSizeOverride = size;
+
+    if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing)
+        [self _dispatchSetMinimumUnobscuredSize:WebCore::FloatSize(size)];
+}
+
 // Deprecated SPI
 - (CGSize)_maximumUnobscuredSizeOverride
 {
@@ -3030,6 +3066,7 @@
         oldObscuredInsets = _obscuredInsets;
     }
     auto oldViewLayoutSize = [self activeViewLayoutSize:oldBounds];
+    auto oldMinimumUnobscuredSize = activeMinimumUnobscuredSize(self, oldBounds);
     auto oldMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, oldBounds);
 
     updateBlock();
@@ -3037,6 +3074,7 @@
     CGRect newBounds = self.bounds;
     auto newMinimumEffectiveDeviceWidth = [self _minimumEffectiveDeviceWidth];
     auto newViewLayoutSize = [self activeViewLayoutSize:newBounds];
+    auto newMinimumUnobscuredSize = activeMinimumUnobscuredSize(self, newBounds);
     auto newMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, newBounds);
     int32_t newOrientation = activeOrientation(self);
     UIEdgeInsets newObscuredInsets = _obscuredInsets;
@@ -3058,6 +3096,8 @@
         [self _frameOrBoundsChanged];
         if (_viewLayoutSizeOverride)
             [self _dispatchSetViewLayoutSize:newViewLayoutSize];
+        if (_minimumUnobscuredSizeOverride)
+            [self _dispatchSetMinimumUnobscuredSize:WebCore::FloatSize(newMinimumUnobscuredSize)];
         if (_maximumUnobscuredSizeOverride)
             [self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(newMaximumUnobscuredSize)];
         if (_overridesInterfaceOrientation)
@@ -3068,6 +3108,7 @@
 
     if (CGRectEqualToRect(oldBounds, newBounds)
         && oldViewLayoutSize == newViewLayoutSize
+        && oldMinimumUnobscuredSize == newMinimumUnobscuredSize
         && oldMaximumUnobscuredSize == newMaximumUnobscuredSize
         && oldOrientation == newOrientation
         && oldMinimumEffectiveDeviceWidth == newMinimumEffectiveDeviceWidth
@@ -3135,10 +3176,11 @@
     WebCore::FloatBoxExtent unobscuredSafeAreaInsetsExtent(unobscuredSafeAreaInsets.top, unobscuredSafeAreaInsets.right, unobscuredSafeAreaInsets.bottom, unobscuredSafeAreaInsets.left);
 
     _lastSentViewLayoutSize = newViewLayoutSize;
+    _lastSentMinimumUnobscuredSize = newMinimumUnobscuredSize;
     _lastSentMaximumUnobscuredSize = newMaximumUnobscuredSize;
     _lastSentDeviceOrientation = newOrientation;
 
-    _page->dynamicViewportSizeUpdate(newViewLayoutSize, newMaximumUnobscuredSize, visibleRectInContentCoordinates, unobscuredRectInContentCoordinates, futureUnobscuredRectInSelfCoordinates, unobscuredSafeAreaInsetsExtent, targetScale, newOrientation, newMinimumEffectiveDeviceWidth, ++_currentDynamicViewportSizeUpdateID);
+    _page->dynamicViewportSizeUpdate(newViewLayoutSize, newMinimumUnobscuredSize, newMaximumUnobscuredSize, visibleRectInContentCoordinates, unobscuredRectInContentCoordinates, futureUnobscuredRectInSelfCoordinates, unobscuredSafeAreaInsetsExtent, targetScale, newOrientation, newMinimumEffectiveDeviceWidth, ++_currentDynamicViewportSizeUpdateID);
     if (WebKit::DrawingAreaProxy* drawingArea = _page->drawingArea())
         drawingArea->setSize(WebCore::IntSize(newBounds.size));
 
@@ -3267,6 +3309,7 @@
         RELEASE_LOG_FAULT(VisibleRects, "%s: Error: attempting to override layout parameters with negative width or height: %@", __PRETTY_FUNCTION__, NSStringFromCGSize(minimumLayoutSize));
 
     [self _setViewLayoutSizeOverride:CGSizeMake(std::max<CGFloat>(0, minimumLayoutSize.width), std::max<CGFloat>(0, minimumLayoutSize.height))];
+    [self _setMinimumUnobscuredSizeOverride:minimumLayoutSize];
     [self _setMaximumUnobscuredSizeOverride:maximumUnobscuredSizeOverride];
 }
 
@@ -3273,6 +3316,7 @@
 - (void)_clearOverrideLayoutParameters
 {
     _viewLayoutSizeOverride = std::nullopt;
+    _minimumUnobscuredSizeOverride = std::nullopt;
     _maximumUnobscuredSizeOverride = std::nullopt;
 }
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (284627 => 284628)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -8259,6 +8259,7 @@
     parameters.overrideScreenSize = overrideScreenSize();
     parameters.textAutosizingWidth = textAutosizingWidth();
     parameters.mimeTypesWithCustomContentProviders = pageClient().mimeTypesWithCustomContentProviders();
+    parameters.minimumUnobscuredSize = m_minimumUnobscuredSize;
     parameters.maximumUnobscuredSize = m_maximumUnobscuredSize;
     parameters.deviceOrientation = m_deviceOrientation;
     parameters.keyboardIsAttached = isInHardwareKeyboardMode();

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (284627 => 284628)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -818,9 +818,11 @@
     void scrollingNodeScrollWillStartScroll();
     void scrollingNodeScrollDidEndScroll();
 
-    void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID);
+    void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& minimumUnobscuredSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID);
 
     void setViewportConfigurationViewLayoutSize(const WebCore::FloatSize&, double scaleFactor, double minimumEffectiveDeviceWidth);
+    void setMinimumUnobscuredSize(const WebCore::FloatSize&);
+    WebCore::FloatSize minimumUnobscuredSize() const { return m_minimumUnobscuredSize; }
     void setMaximumUnobscuredSize(const WebCore::FloatSize&);
     WebCore::FloatSize maximumUnobscuredSize() const { return m_maximumUnobscuredSize; }
     void setDeviceOrientation(int32_t);
@@ -2989,6 +2991,7 @@
 #if PLATFORM(IOS_FAMILY)
     Function<bool()> m_deviceOrientationUserPermissionHandlerForTesting;
     bool m_waitingForPostLayoutEditorStateUpdateAfterFocusingElement { false };
+    WebCore::FloatSize m_minimumUnobscuredSize;
     WebCore::FloatSize m_maximumUnobscuredSize;
     bool m_lastObservedStateWasBackground { false };
 #endif

Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (284627 => 284628)


--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2021-10-21 18:17:59 UTC (rev 284628)
@@ -264,7 +264,7 @@
     pageClient().scrollingNodeScrollDidEndScroll();
 }
 
-void WebPageProxy::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
+void WebPageProxy::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& minimumUnobscuredSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
 {
     if (!hasRunningProcess())
         return;
@@ -273,7 +273,7 @@
 
     m_viewportConfigurationViewLayoutSize = viewLayoutSize;
     m_process->send(Messages::WebPage::DynamicViewportSizeUpdate(viewLayoutSize,
-        maximumUnobscuredSize, targetExposedContentRect, targetUnobscuredRect,
+        minimumUnobscuredSize, maximumUnobscuredSize, targetExposedContentRect, targetUnobscuredRect,
         targetUnobscuredRectInScrollViewCoordinates, unobscuredSafeAreaInsets,
         targetScale, deviceOrientation, minimumEffectiveDeviceWidth, dynamicViewportSizeUpdateID), m_webPageID);
 
@@ -300,6 +300,14 @@
         m_process->send(Messages::WebPage::SetForceAlwaysUserScalable(userScalable), m_webPageID);
 }
 
+void WebPageProxy::setMinimumUnobscuredSize(const WebCore::FloatSize& size)
+{
+    m_minimumUnobscuredSize = size;
+
+    if (hasRunningProcess())
+        m_process->send(Messages::WebPage::SetMinimumUnobscuredSize(size), m_webPageID);
+}
+
 void WebPageProxy::setMaximumUnobscuredSize(const WebCore::FloatSize& size)
 {
     m_maximumUnobscuredSize = size;

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (284627 => 284628)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -1559,7 +1559,7 @@
     }
 
     if (auto viewportSizeForViewportUnits = webPage->viewportSizeForCSSViewportUnits())
-        view->setViewportSizeForCSSViewportUnits(*viewportSizeForViewportUnits);
+        view->setSizeForCSSLargeViewportUnits(*viewportSizeForViewportUnits);
     view->setProhibitsScrolling(shouldDisableScrolling);
     view->setVisualUpdatesAllowedByClient(!webPage->shouldExtendIncrementalRenderingSuppression());
 #if PLATFORM(COCOA)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (284627 => 284628)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -871,6 +871,7 @@
 
 #if PLATFORM(IOS_FAMILY)
     setViewportConfigurationViewLayoutSize(parameters.viewportConfigurationViewLayoutSize, parameters.viewportConfigurationLayoutSizeScaleFactor, parameters.viewportConfigurationMinimumEffectiveDeviceWidth);
+    setMinimumUnobscuredSize(parameters.minimumUnobscuredSize);
     setMaximumUnobscuredSize(parameters.maximumUnobscuredSize);
 #endif
 
@@ -6266,7 +6267,7 @@
 
     m_viewportSizeForCSSViewportUnits = viewportSize;
     if (m_viewportSizeForCSSViewportUnits)
-        corePage()->mainFrame().view()->setViewportSizeForCSSViewportUnits(*m_viewportSizeForCSSViewportUnits);
+        corePage()->mainFrame().view()->setSizeForCSSLargeViewportUnits(*m_viewportSizeForCSSViewportUnits);
 }
 
 bool WebPage::isSmartInsertDeleteEnabled()

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (284627 => 284628)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-10-21 18:17:59 UTC (rev 284628)
@@ -1081,9 +1081,10 @@
     void updateVisibilityState(bool isInitialState = false);
 
 #if PLATFORM(IOS_FAMILY)
+    void setMinimumUnobscuredSize(const WebCore::FloatSize&);
     void setMaximumUnobscuredSize(const WebCore::FloatSize&);
     void setDeviceOrientation(int32_t);
-    void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID);
+    void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& minimumUnobscuredSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID);
     bool scaleWasSetByUIProcess() const { return m_scaleWasSetByUIProcess; }
     void willStartUserTriggeredZooming();
     void applicationWillResignActive();
@@ -2258,6 +2259,7 @@
 
     std::optional<WebCore::SimpleRange> m_initialSelection;
     WebCore::VisibleSelection m_storedSelectionForAccessibility { WebCore::VisibleSelection() };
+    WebCore::FloatSize m_minimumUnobscuredSize;
     WebCore::FloatSize m_maximumUnobscuredSize;
     int32_t m_deviceOrientation { 0 };
     bool m_keyboardIsAttached { false };

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (284627 => 284628)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2021-10-21 18:17:59 UTC (rev 284628)
@@ -53,10 +53,11 @@
     MouseEvent(WebKit::WebMouseEvent event, std::optional<Vector<WebKit::SandboxExtension::Handle>> sandboxExtensions)
 #if PLATFORM(IOS_FAMILY)
     SetViewportConfigurationViewLayoutSize(WebCore::FloatSize size, double scaleFactor, double minimumEffectiveDeviceWidth)
+    SetMinimumUnobscuredSize(WebCore::FloatSize size)
     SetMaximumUnobscuredSize(WebCore::FloatSize size)
     SetDeviceOrientation(int32_t deviceOrientation)
     SetOverrideViewportArguments(std::optional<WebCore::ViewportArguments> arguments)
-    DynamicViewportSizeUpdate(WebCore::FloatSize viewLayoutSize, WebCore::FloatSize maximumUnobscuredSize, WebCore::FloatRect targetExposedContentRect, WebCore::FloatRect targetUnobscuredRect, WebCore::FloatRect targetUnobscuredRectInScrollViewCoordinates, WebCore::RectEdges<float> targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, uint64_t dynamicViewportSizeUpdateID)
+    DynamicViewportSizeUpdate(WebCore::FloatSize viewLayoutSize, WebCore::FloatSize minimumUnobscuredSize, WebCore::FloatSize maximumUnobscuredSize, WebCore::FloatRect targetExposedContentRect, WebCore::FloatRect targetUnobscuredRect, WebCore::FloatRect targetUnobscuredRectInScrollViewCoordinates, WebCore::RectEdges<float> targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, uint64_t dynamicViewportSizeUpdateID)
     
     SetScreenIsBeingCaptured(bool captured)
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (284627 => 284628)


--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2021-10-21 18:17:59 UTC (rev 284628)
@@ -3434,6 +3434,12 @@
     viewportConfigurationChanged(zoomToInitialScale);
 }
 
+void WebPage::setMinimumUnobscuredSize(const FloatSize& minimumUnobscuredSize)
+{
+    m_minimumUnobscuredSize = minimumUnobscuredSize;
+    updateViewportSizeForCSSViewportUnits();
+}
+
 void WebPage::setMaximumUnobscuredSize(const FloatSize& maximumUnobscuredSize)
 {
     m_maximumUnobscuredSize = maximumUnobscuredSize;
@@ -3453,7 +3459,7 @@
     m_page->setOverrideViewportArguments(arguments);
 }
 
-void WebPage::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
+void WebPage::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& minimumUnobscuredSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
 {
     SetForScope<bool> dynamicSizeUpdateGuard(m_inDynamicSizeUpdate, true);
     // FIXME: this does not handle the cases where the content would change the content size or scroll position from _javascript_.
@@ -3501,6 +3507,7 @@
     if (setFixedLayoutSize(newLayoutSize))
         resetTextAutosizing();
 
+    setMinimumUnobscuredSize(minimumUnobscuredSize);
     setMaximumUnobscuredSize(maximumUnobscuredSize);
     m_page->setUnobscuredSafeAreaInsets(targetUnobscuredSafeAreaInsets);
 
@@ -3847,13 +3854,19 @@
 
 void WebPage::updateViewportSizeForCSSViewportUnits()
 {
+    FloatSize smallestUnobscuredSize = m_minimumUnobscuredSize;
+    if (smallestUnobscuredSize.isEmpty())
+        smallestUnobscuredSize = m_viewportConfiguration.viewLayoutSize();
+
     FloatSize largestUnobscuredSize = m_maximumUnobscuredSize;
     if (largestUnobscuredSize.isEmpty())
         largestUnobscuredSize = m_viewportConfiguration.viewLayoutSize();
 
     FrameView& frameView = *mainFrameView();
+    smallestUnobscuredSize.scale(1 / m_viewportConfiguration.initialScaleIgnoringContentSize());
     largestUnobscuredSize.scale(1 / m_viewportConfiguration.initialScaleIgnoringContentSize());
-    frameView.setViewportSizeForCSSViewportUnits(roundedIntSize(largestUnobscuredSize));
+    frameView.setSizeForCSSSmallViewportUnits(roundedIntSize(smallestUnobscuredSize));
+    frameView.setSizeForCSSLargeViewportUnits(roundedIntSize(largestUnobscuredSize));
 }
 
 void WebPage::applicationWillResignActive()

Modified: trunk/Tools/ChangeLog (284627 => 284628)


--- trunk/Tools/ChangeLog	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Tools/ChangeLog	2021-10-21 18:17:59 UTC (rev 284628)
@@ -1,3 +1,30 @@
+2021-10-21  Devin Rousso  <drou...@apple.com>
+
+        [css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
+        https://bugs.webkit.org/show_bug.cgi?id=219287
+        <rdar://problem/71857370>
+
+        Reviewed by Simon Fraser.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm: Added.
+        (evaluateForInt):
+        (getElementHeight):
+        (TEST.CSSViewportUnits.AllSame):
+        (TEST.CSSViewportUnits.EmptyUnobscuredSizeOverrides):
+        (TEST.CSSViewportUnits.SameUnobscuredSizeOverrides):
+        (TEST.CSSViewportUnits.DifferentUnobscuredSizeOverrides):
+        * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html: Added.
+
+        * TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp:
+        (TEST.FloatSize.MinDimension): Added.
+        (TEST.FloatSize.MaxDimension): Added.
+        * TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp:
+        (TEST.IntSize.MinDimension): Added.
+        (TEST.IntSize.MaxDimension): Added.
+        Add utility/helper methods for returning the minimum/maximum of the width vs height.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+
 2021-10-21  Chris Dumez  <cdu...@apple.com>
 
         WebKit should process-swap for initial navigation of a popup if it has no opener

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (284627 => 284628)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2021-10-21 18:17:59 UTC (rev 284628)
@@ -893,6 +893,8 @@
 		93FCDB34263631560046DD7D /* SortedArrayMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93FCDB33263631560046DD7D /* SortedArrayMap.cpp */; };
 		95095F20262FFFA50000D920 /* SampledPageTopColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95095F1F262FFFA50000D920 /* SampledPageTopColor.mm */; };
 		950E4CC1252E75240071659F /* iOSStylusSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 950E4CC0252E75230071659F /* iOSStylusSupport.mm */; };
+		952F7165270BD97E00D00DCC /* CSSViewportUnits.mm in Sources */ = {isa = PBXBuildFile; fileRef = 952F7164270BD97E00D00DCC /* CSSViewportUnits.mm */; };
+		952F7167270BD9CB00D00DCC /* CSSViewportUnits.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 952F7166270BD99700D00DCC /* CSSViewportUnits.html */; };
 		953ABB3525C0D682004C8B73 /* WKWebViewUnderPageBackgroundColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 953ABB3425C0D681004C8B73 /* WKWebViewUnderPageBackgroundColor.mm */; };
 		958B70E126C46EDC00B2022B /* NSAttributedStringWebKitAdditions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 958B70E026C46EDC00B2022B /* NSAttributedStringWebKitAdditions.mm */; };
 		95A524952581A10D00461FE9 /* WKWebViewThemeColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A524942581A10D00461FE9 /* WKWebViewThemeColor.mm */; };
@@ -1466,6 +1468,7 @@
 				9B62630C1F8C25C8007EE29B /* copy-url.html in Copy Resources */,
 				7AEAD4811E20122700416EFE /* CrossPartitionFileSchemeAccess.html in Copy Resources */,
 				4995A6F025E8772000E5F0A9 /* csp-document-uri-report.html in Copy Resources */,
+				952F7167270BD9CB00D00DCC /* CSSViewportUnits.html in Copy Resources */,
 				2DDD4DA4270B8B3500659A61 /* cube.usdz in Copy Resources */,
 				F4AB578A1F65165400DB0DA1 /* custom-draggable-div.html in Copy Resources */,
 				290F4275172A221C00939FF0 /* custom-protocol-sync-xhr.html in Copy Resources */,
@@ -2641,6 +2644,8 @@
 		93FCDB33263631560046DD7D /* SortedArrayMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SortedArrayMap.cpp; sourceTree = "<group>"; };
 		95095F1F262FFFA50000D920 /* SampledPageTopColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SampledPageTopColor.mm; sourceTree = "<group>"; };
 		950E4CC0252E75230071659F /* iOSStylusSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iOSStylusSupport.mm; sourceTree = "<group>"; };
+		952F7164270BD97E00D00DCC /* CSSViewportUnits.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CSSViewportUnits.mm; sourceTree = "<group>"; };
+		952F7166270BD99700D00DCC /* CSSViewportUnits.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = CSSViewportUnits.html; sourceTree = "<group>"; };
 		953ABB3425C0D681004C8B73 /* WKWebViewUnderPageBackgroundColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewUnderPageBackgroundColor.mm; sourceTree = "<group>"; };
 		958B70E026C46EDC00B2022B /* NSAttributedStringWebKitAdditions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NSAttributedStringWebKitAdditions.mm; sourceTree = "<group>"; };
 		95A524942581A10D00461FE9 /* WKWebViewThemeColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewThemeColor.mm; sourceTree = "<group>"; };
@@ -3494,6 +3499,7 @@
 				1C79201B234BDD9B001EAF23 /* CopyRTF.mm */,
 				9B7A37C21F8AEBA5004AA228 /* CopyURL.mm */,
 				510A921D24DB38ED00BFD89C /* CreateWebArchive.mm */,
+				952F7164270BD97E00D00DCC /* CSSViewportUnits.mm */,
 				46A911582108E66B0078D40D /* CustomUserAgent.mm */,
 				2DC4CF761D2D9DD800ECCC94 /* DataDetection.mm */,
 				518EE51C20A78D3300E024F3 /* DecidePolicyForNavigationAction.mm */,
@@ -4057,6 +4063,7 @@
 				9B1056421F9047CC00D5583F /* copy-html.html */,
 				9B62630B1F8C2510007EE29B /* copy-url.html */,
 				4995A6EF25E876A300E5F0A9 /* csp-document-uri-report.html */,
+				952F7166270BD99700D00DCC /* CSSViewportUnits.html */,
 				F4AB57891F65164B00DB0DA1 /* custom-draggable-div.html */,
 				F47DFB2421A8704A00021FB6 /* data-detectors.html */,
 				F486B1CF1F6794FF00F34BDD /* DataTransfer-setDragImage.html */,
@@ -5506,6 +5513,7 @@
 				510A921E24DB38F300BFD89C /* CreateWebArchive.mm in Sources */,
 				7AEAD47F1E20116C00416EFE /* CrossPartitionFileSchemeAccess.mm in Sources */,
 				7CCE7EDB1A411A9200447C4C /* CSSParser.cpp in Sources */,
+				952F7165270BD97E00D00DCC /* CSSViewportUnits.mm in Sources */,
 				5758597F23A2527A00C74572 /* CtapPinTest.cpp in Sources */,
 				572B403421769A88000AD43E /* CtapRequestTest.cpp in Sources */,
 				572B404421781B43000AD43E /* CtapResponseTest.cpp in Sources */,

Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp (284627 => 284628)


--- trunk/Tools/TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -93,6 +93,28 @@
     testGetAndSet(test);
 }
 
+TEST(FloatSize, MinDimension)
+{
+    WebCore::FloatSize test(1024.0f, 768.0f);
+
+    EXPECT_FLOAT_EQ(768.0f, test.minDimension());
+
+    test.scale(1.0f, 2.0f);
+
+    EXPECT_FLOAT_EQ(1024.0f, test.minDimension());
+}
+
+TEST(FloatSize, MaxDimension)
+{
+    WebCore::FloatSize test(1024.0f, 768.0f);
+
+    EXPECT_FLOAT_EQ(1024.0f, test.maxDimension());
+
+    test.scale(1.0f, 2.0f);
+
+    EXPECT_FLOAT_EQ(1536.0f, test.maxDimension());
+}
+
 TEST(FloatSize, Scale)
 {
     WebCore::FloatSize test(1024.0f, 768.0f);

Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp (284627 => 284628)


--- trunk/Tools/TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp	2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp	2021-10-21 18:17:59 UTC (rev 284628)
@@ -93,6 +93,28 @@
     testGetAndSet(test);
 }
 
+TEST(IntSize, MinDimension)
+{
+    WebCore::IntSize test(1024, 768);
+
+    EXPECT_EQ(768, test.minDimension());
+
+    test.scale(1.0f, 2.0f);
+
+    EXPECT_EQ(1024, test.minDimension());
+}
+
+TEST(IntSize, MaxDimension)
+{
+    WebCore::IntSize test(1024, 768);
+
+    EXPECT_EQ(1024, test.maxDimension());
+
+    test.scale(1.0f, 2.0f);
+
+    EXPECT_EQ(1536, test.maxDimension());
+}
+
 TEST(IntSize, DiagonalLengthAndArea)
 {
     WebCore::IntSize test(1024, 768);

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html (0 => 284628)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html	2021-10-21 18:17:59 UTC (rev 284628)
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<head>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    <style>
+body {
+    margin: 0;
+}
+div {
+    display: inline-block;
+    width: 1px;
+}
+    </style>
+</head>
+<body>
+    <div id="vw" style="height: 100vw;"></div>
+    <div id="vh" style="height: 100vh;"></div>
+    <div id="vmin" style="height: 100vmin;"></div>
+    <div id="vmax" style="height: 100vmax;"></div>
+
+    <div id="svw" style="height: 100svw;"></div>
+    <div id="svh" style="height: 100svh;"></div>
+    <div id="svmin" style="height: 100svmin;"></div>
+    <div id="svmax" style="height: 100svmax;"></div>
+
+    <div id="lvw" style="height: 100lvw;"></div>
+    <div id="lvh" style="height: 100lvh;"></div>
+    <div id="lvmin" style="height: 100lvmin;"></div>
+    <div id="lvmax" style="height: 100lvmax;"></div>
+
+    <div id="dvw" style="height: 100dvw;"></div>
+    <div id="dvh" style="height: 100dvh;"></div>
+    <div id="dvmin" style="height: 100dvmin;"></div>
+    <div id="dvmax" style="height: 100dvmax;"></div>
+</body>

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm (0 => 284628)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm	2021-10-21 18:17:59 UTC (rev 284628)
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2021 Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#import "PlatformUtilities.h"
+#import "TestWKWebView.h"
+#import <WebKit/WKWebViewPrivate.h>
+#import <wtf/RetainPtr.h>
+
+static int evaluateForInt(WKWebView *webView, NSString *script)
+{
+    return [(NSNumber *)[webView objectByEvaluatingJavaScript:script] intValue];
+}
+
+static int getElementHeight(WKWebView *webView, NSString *elementID)
+{
+    return evaluateForInt(webView, [NSString stringWithFormat:@"document.getElementById('%@').getBoundingClientRect().height", elementID]);
+}
+
+TEST(CSSViewportUnits, AllSame)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+    [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+
+    EXPECT_EQ(320, getElementHeight(webView.get(), @"vw"));
+    EXPECT_EQ(500, getElementHeight(webView.get(), @"vh"));
+    EXPECT_EQ(320, getElementHeight(webView.get(), @"vmin"));
+    EXPECT_EQ(500, getElementHeight(webView.get(), @"vmax"));
+
+    EXPECT_EQ(320, getElementHeight(webView.get(), @"svw"));
+    EXPECT_EQ(500, getElementHeight(webView.get(), @"svh"));
+    EXPECT_EQ(320, getElementHeight(webView.get(), @"svmin"));
+    EXPECT_EQ(500, getElementHeight(webView.get(), @"svmax"));
+
+    EXPECT_EQ(320, getElementHeight(webView.get(), @"lvw"));
+    EXPECT_EQ(500, getElementHeight(webView.get(), @"lvh"));
+    EXPECT_EQ(320, getElementHeight(webView.get(), @"lvmin"));
+    EXPECT_EQ(500, getElementHeight(webView.get(), @"lvmax"));
+
+    int innerWidth = evaluateForInt(webView.get(), @"window.innerWidth");
+    int innerHeight = evaluateForInt(webView.get(), @"window.innerHeight");
+    EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvw"));
+    EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvh"));
+    EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvmin"));
+    EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvmax"));
+}
+
+#if PLATFORM(IOS_FAMILY)
+
+TEST(CSSViewportUnits, EmptyUnobscuredSizeOverrides)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
+                              maximumUnobscuredSizeOverride:CGSizeZero];
+    [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"vw"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"vh"));
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"vmin"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"vmax"));
+
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"svw"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"svh"));
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"svmin"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"svmax"));
+
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"lvw"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"lvh"));
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"lvmin"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"lvmax"));
+
+    int innerWidth = evaluateForInt(webView.get(), @"window.innerWidth");
+    int innerHeight = evaluateForInt(webView.get(), @"window.innerHeight");
+    EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvw"));
+    EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvh"));
+    EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvmin"));
+    EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvmax"));
+}
+
+TEST(CSSViewportUnits, SameUnobscuredSizeOverrides)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
+                              maximumUnobscuredSizeOverride:CGSizeMake(10, 20)];
+    [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"vw"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"vh"));
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"vmin"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"vmax"));
+
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"svw"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"svh"));
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"svmin"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"svmax"));
+
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"lvw"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"lvh"));
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"lvmin"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"lvmax"));
+
+    int innerWidth = evaluateForInt(webView.get(), @"window.innerWidth");
+    int innerHeight = evaluateForInt(webView.get(), @"window.innerHeight");
+    EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvw"));
+    EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvh"));
+    EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvmin"));
+    EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvmax"));
+}
+
+TEST(CSSViewportUnits, DifferentUnobscuredSizeOverrides)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
+                              maximumUnobscuredSizeOverride:CGSizeMake(30, 40)];
+    [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+
+    EXPECT_EQ(30, getElementHeight(webView.get(), @"vw"));
+    EXPECT_EQ(40, getElementHeight(webView.get(), @"vh"));
+    EXPECT_EQ(30, getElementHeight(webView.get(), @"vmin"));
+    EXPECT_EQ(40, getElementHeight(webView.get(), @"vmax"));
+
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"svw"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"svh"));
+    EXPECT_EQ(10, getElementHeight(webView.get(), @"svmin"));
+    EXPECT_EQ(20, getElementHeight(webView.get(), @"svmax"));
+
+    EXPECT_EQ(30, getElementHeight(webView.get(), @"lvw"));
+    EXPECT_EQ(40, getElementHeight(webView.get(), @"lvh"));
+    EXPECT_EQ(30, getElementHeight(webView.get(), @"lvmin"));
+    EXPECT_EQ(40, getElementHeight(webView.get(), @"lvmax"));
+
+    int innerWidth = evaluateForInt(webView.get(), @"window.innerWidth");
+    int innerHeight = evaluateForInt(webView.get(), @"window.innerHeight");
+    EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvw"));
+    EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvh"));
+    EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvmin"));
+    EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvmax"));
+}
+
+#endif // PLATFORM(IOS_FAMILY)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to