Title: [286350] trunk
Revision
286350
Author
[email protected]
Date
2021-11-30 22:32:24 -0800 (Tue, 30 Nov 2021)

Log Message

[css-values-4] Dynamic `dv*` viewport units should not respect the page scale
https://bugs.webkit.org/show_bug.cgi?id=233291

Reviewed by Simon Fraser.

Source/WebCore:

According to the spec (<https://drafts.csswg.org/css-values-4/#viewport-relative-lengths>):
> The viewport-percentage lengths are relative to the size of the initial containing block.
As such, we should really be using the layout viewport, not the visual viewport.

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

* page/FrameView.h:
* page/FrameView.cpp:
(WebCore::FrameView::availableContentSizeChanged):
(WebCore::FrameView::layoutOrVisualViewportChanged):
(WebCore::FrameView::unobscuredContentSizeChanged):
(WebCore::FrameView::sizeForCSSDynamicViewportUnits() const):
Make sure to notify elements using CSS viewport units of changes to the layout viewport.

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html:
* TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm:
(evaluateForNumber):
(dimensionOfElement): Added.
(widthOfElementWithID): Added.
(heightOfElementWithID): ADded.
(viewportUnitLength): Added.
(TEST.CSSViewportUnits.AllSame):
(TEST.CSSViewportUnits.EmptyUnobscuredSizeOverrides):
(TEST.CSSViewportUnits.SameUnobscuredSizeOverrides):
(TEST.CSSViewportUnits.DifferentUnobscuredSizeOverrides):
(getElementHeight): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (286349 => 286350)


--- trunk/Source/WebCore/ChangeLog	2021-12-01 06:11:56 UTC (rev 286349)
+++ trunk/Source/WebCore/ChangeLog	2021-12-01 06:32:24 UTC (rev 286350)
@@ -1,3 +1,27 @@
+2021-11-30  Devin Rousso  <[email protected]>
+
+        [css-values-4] Dynamic `dv*` viewport units should not respect the page scale
+        https://bugs.webkit.org/show_bug.cgi?id=233291
+
+        Reviewed by Simon Fraser.
+
+        According to the spec (<https://drafts.csswg.org/css-values-4/#viewport-relative-lengths>):
+        > The viewport-percentage lengths are relative to the size of the initial containing block.
+        As such, we should really be using the layout viewport, not the visual viewport.
+
+        Tests: CSSViewportUnits.AllSame
+               CSSViewportUnits.EmptyUnobscuredSizeOverrides
+               CSSViewportUnits.SameUnobscuredSizeOverrides
+               CSSViewportUnits.DifferentUnobscuredSizeOverrides
+
+        * page/FrameView.h:
+        * page/FrameView.cpp:
+        (WebCore::FrameView::availableContentSizeChanged):
+        (WebCore::FrameView::layoutOrVisualViewportChanged):
+        (WebCore::FrameView::unobscuredContentSizeChanged):
+        (WebCore::FrameView::sizeForCSSDynamicViewportUnits() const):
+        Make sure to notify elements using CSS viewport units of changes to the layout viewport.
+
 2021-11-30  Chris Dumez  <[email protected]>
 
         Null check value returned by WorkerOrWorkletGlobalScope::script()

Modified: trunk/Source/WebCore/page/FrameView.cpp (286349 => 286350)


--- trunk/Source/WebCore/page/FrameView.cpp	2021-12-01 06:11:56 UTC (rev 286349)
+++ trunk/Source/WebCore/page/FrameView.cpp	2021-12-01 06:32:24 UTC (rev 286350)
@@ -2792,7 +2792,7 @@
         // FIXME: Merge this logic with m_setNeedsLayoutWasDeferred and find a more appropriate
         // way of handling potential recursive layouts when the viewport is resized to accomodate
         // the content but the content always overflows the viewport. See webkit.org/b/165781.
-        if (!(layoutContext().layoutPhase() == FrameViewLayoutContext::LayoutPhase::InViewSizeAdjust && useFixedLayout()))
+        if (layoutContext().layoutPhase() == FrameViewLayoutContext::LayoutPhase::InViewSizeAdjust)
             document->updateViewportUnitsOnResize();
     }
 
@@ -2896,14 +2896,21 @@
 // FIXME: This shouldn't be called from outside; FrameView should call it when the relevant viewports change.
 void FrameView::layoutOrVisualViewportChanged()
 {
-    if (!frame().settings().visualViewportAPIEnabled())
-        return;
+    if (frame().settings().visualViewportAPIEnabled()) {
+        if (auto* window = frame().window())
+            window->visualViewport().update();
 
-    if (auto* window = frame().window())
-        window->visualViewport().update();
+        if (auto scrollingCoordinator = this->scrollingCoordinator())
+            scrollingCoordinator->frameViewVisualViewportChanged(*this);
+    }
 
-    if (auto scrollingCoordinator = this->scrollingCoordinator())
-        scrollingCoordinator->frameViewVisualViewportChanged(*this);
+    auto layoutViewportSize = layoutViewportRect().size();
+    if (layoutViewportSize != m_lastLayoutViewportSize) {
+        if (auto* document = frame().document())
+            document->updateViewportUnitsOnResize();
+
+        m_lastLayoutViewportSize = layoutViewportSize;
+    }
 }
 
 void FrameView::unobscuredContentSizeChanged()
@@ -2911,9 +2918,6 @@
 #if PLATFORM(IOS_FAMILY)
     updateTiledBackingAdaptiveSizing();
 #endif
-
-    if (auto* document = frame().document())
-        document->updateViewportUnitsOnResize();
 }
 
 void FrameView::loadProgressingStatusChanged()
@@ -5674,7 +5678,7 @@
 
 FloatSize FrameView::sizeForCSSDynamicViewportUnits() const
 {
-    return unobscuredContentRectIncludingScrollbars().size();
+    return rectForFixedPositionLayout().size();
 }
 
 FloatSize FrameView::sizeForCSSDefaultViewportUnits() const

Modified: trunk/Source/WebCore/page/FrameView.h (286349 => 286350)


--- trunk/Source/WebCore/page/FrameView.h	2021-12-01 06:11:56 UTC (rev 286349)
+++ trunk/Source/WebCore/page/FrameView.h	2021-12-01 06:32:24 UTC (rev 286350)
@@ -922,6 +922,7 @@
     Vector<Function<void()>> m_postLayoutCallbackQueue;
 
     LayoutPoint m_layoutViewportOrigin;
+    LayoutSize m_lastLayoutViewportSize;
     std::optional<LayoutRect> m_layoutViewportOverrideRect;
     std::optional<LayoutRect> m_visualViewportOverrideRect; // Used when the iOS keyboard is showing.
 

Modified: trunk/Tools/ChangeLog (286349 => 286350)


--- trunk/Tools/ChangeLog	2021-12-01 06:11:56 UTC (rev 286349)
+++ trunk/Tools/ChangeLog	2021-12-01 06:32:24 UTC (rev 286350)
@@ -1,3 +1,23 @@
+2021-11-30  Devin Rousso  <[email protected]>
+
+        [css-values-4] Dynamic `dv*` viewport units should not respect the page scale
+        https://bugs.webkit.org/show_bug.cgi?id=233291
+
+        Reviewed by Simon Fraser.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html:
+        * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm:
+        (evaluateForNumber):
+        (dimensionOfElement): Added.
+        (widthOfElementWithID): Added.
+        (heightOfElementWithID): ADded.
+        (viewportUnitLength): Added.
+        (TEST.CSSViewportUnits.AllSame):
+        (TEST.CSSViewportUnits.EmptyUnobscuredSizeOverrides):
+        (TEST.CSSViewportUnits.SameUnobscuredSizeOverrides):
+        (TEST.CSSViewportUnits.DifferentUnobscuredSizeOverrides):
+        (getElementHeight): Deleted.
+
 2021-11-30  BJ Burg  <[email protected]>
 
         Web Inspector: add ExtensionTabActivation diagnostic event

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html (286349 => 286350)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html	2021-12-01 06:11:56 UTC (rev 286349)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html	2021-12-01 06:32:24 UTC (rev 286350)
@@ -13,6 +13,8 @@
     </style>
 </head>
 <body>
+    <div id="fixed" style="position: fixed; width: 100%; height: 100%;"></div>
+
     <div id="vw" style="height: 100vw;"></div>
     <div id="vh" style="height: 100vh;"></div>
     <div id="vmin" style="height: 100vmin;"></div>

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm (286349 => 286350)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm	2021-12-01 06:11:56 UTC (rev 286349)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm	2021-12-01 06:32:24 UTC (rev 286350)
@@ -30,40 +30,84 @@
 #import <WebKit/WKWebViewPrivate.h>
 #import <wtf/RetainPtr.h>
 
-static double evaluateForNumber(WKWebView *webView, NSString *script)
+static double evaluateForNumber(RetainPtr<TestWKWebView>& webView, NSString *script)
 {
     return [(NSNumber *)[webView objectByEvaluatingJavaScript:script] doubleValue];
 }
 
-static double getElementHeight(WKWebView *webView, NSString *elementID)
+static double dimensionOfElement(RetainPtr<TestWKWebView>& webView, NSString *element, NSString *dimension)
 {
-    return evaluateForNumber(webView, [NSString stringWithFormat:@"document.getElementById('%@').getBoundingClientRect().height", elementID]);
+    return evaluateForNumber(webView, [NSString stringWithFormat:@"%@.getBoundingClientRect().%@", element, dimension]);
 }
 
+static double widthOfElementWithID(RetainPtr<TestWKWebView>& webView, NSString *elementID)
+{
+    return dimensionOfElement(webView, [NSString stringWithFormat:@"document.getElementById('%@')", elementID], @"width");
+}
+
+static double heightOfElementWithID(RetainPtr<TestWKWebView>& webView, NSString *elementID)
+{
+    return dimensionOfElement(webView, [NSString stringWithFormat:@"document.getElementById('%@')", elementID], @"height");
+}
+
+static double viewportUnitLength(RetainPtr<TestWKWebView>& webView, NSString *viewportUnit)
+{
+    return heightOfElementWithID(webView, viewportUnit);
+}
+
 TEST(CSSViewportUnits, AllSame)
 {
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
     [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+    [webView waitForNextPresentationUpdate];
 
-    EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"vw"));
-    EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"vh"));
-    EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"vmin"));
-    EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"vmax"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vw"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vh"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vmin"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vmax"));
 
-    EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"svw"));
-    EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"svh"));
-    EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"svmin"));
-    EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"svmax"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svw"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svh"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svmin"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svmax"));
 
-    EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"lvw"));
-    EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"lvh"));
-    EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"lvmin"));
-    EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"lvmax"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvw"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvh"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvmin"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvmax"));
 
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
+
+#if PLATFORM(IOS_FAMILY)
+    [webView scrollView].zoomScale = 2;
+#elif PLATFORM(MAC)
+    [webView setAllowsMagnification:YES];
+    [webView setMagnification:2];
+#endif
+    [webView waitForNextPresentationUpdate];
+
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vw"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vh"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"vmin"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"vmax"));
+
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svw"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svh"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"svmin"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"svmax"));
+
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvw"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvh"));
+    EXPECT_FLOAT_EQ(320, viewportUnitLength(webView, @"lvmin"));
+    EXPECT_FLOAT_EQ(500, viewportUnitLength(webView, @"lvmax"));
+
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
 }
 
 #if PLATFORM(IOS_FAMILY)
@@ -74,26 +118,50 @@
     [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10.5, 20.5)
                               maximumUnobscuredSizeOverride:CGSizeZero];
     [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+    [webView waitForNextPresentationUpdate];
 
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"vw"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"vh"));
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"vmin"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"vmax"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
 
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svw"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svh"));
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svmin"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svmax"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
 
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"lvw"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"lvh"));
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"lvmin"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"lvmax"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
 
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
+
+    [webView scrollView].zoomScale = 2;
+    [webView waitForNextPresentationUpdate];
+
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
+
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
+
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
+
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
 }
 
 TEST(CSSViewportUnits, SameUnobscuredSizeOverrides)
@@ -102,26 +170,50 @@
     [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10.5, 20.5)
                               maximumUnobscuredSizeOverride:CGSizeMake(10.5, 20.5)];
     [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+    [webView waitForNextPresentationUpdate];
 
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"vw"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"vh"));
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"vmin"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"vmax"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
 
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svw"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svh"));
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svmin"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svmax"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
 
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"lvw"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"lvh"));
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"lvmin"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"lvmax"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
 
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
+
+    [webView scrollView].zoomScale = 2;
+    [webView waitForNextPresentationUpdate];
+
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"vmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"vmax"));
+
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
+
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"lvmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"lvmax"));
+
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
 }
 
 TEST(CSSViewportUnits, DifferentUnobscuredSizeOverrides)
@@ -130,26 +222,50 @@
     [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10.5, 20.5)
                               maximumUnobscuredSizeOverride:CGSizeMake(30.5, 40.5)];
     [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+    [webView waitForNextPresentationUpdate];
 
-    EXPECT_FLOAT_EQ(30.5, getElementHeight(webView.get(), @"vw"));
-    EXPECT_FLOAT_EQ(40.5, getElementHeight(webView.get(), @"vh"));
-    EXPECT_FLOAT_EQ(30.5, getElementHeight(webView.get(), @"vmin"));
-    EXPECT_FLOAT_EQ(40.5, getElementHeight(webView.get(), @"vmax"));
+    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vw"));
+    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vh"));
+    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vmin"));
+    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vmax"));
 
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svw"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svh"));
-    EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svmin"));
-    EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svmax"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
 
-    EXPECT_FLOAT_EQ(30.5, getElementHeight(webView.get(), @"lvw"));
-    EXPECT_FLOAT_EQ(40.5, getElementHeight(webView.get(), @"lvh"));
-    EXPECT_FLOAT_EQ(30.5, getElementHeight(webView.get(), @"lvmin"));
-    EXPECT_FLOAT_EQ(40.5, getElementHeight(webView.get(), @"lvmax"));
+    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvw"));
+    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvh"));
+    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvmin"));
+    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvmax"));
 
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
-    EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
+
+    [webView scrollView].zoomScale = 2;
+    [webView waitForNextPresentationUpdate];
+
+    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vw"));
+    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vh"));
+    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"vmin"));
+    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"vmax"));
+
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svw"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svh"));
+    EXPECT_FLOAT_EQ(10.5, viewportUnitLength(webView, @"svmin"));
+    EXPECT_FLOAT_EQ(20.5, viewportUnitLength(webView, @"svmax"));
+
+    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvw"));
+    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvh"));
+    EXPECT_FLOAT_EQ(30.5, viewportUnitLength(webView, @"lvmin"));
+    EXPECT_FLOAT_EQ(40.5, viewportUnitLength(webView, @"lvmax"));
+
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvw"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvh"));
+    EXPECT_FLOAT_EQ(widthOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmin"));
+    EXPECT_FLOAT_EQ(heightOfElementWithID(webView, @"fixed"), viewportUnitLength(webView, @"dvmax"));
 }
 
 #endif // PLATFORM(IOS_FAMILY)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to