Title: [285345] trunk
Revision
285345
Author
drou...@apple.com
Date
2021-11-05 10:43:33 -0700 (Fri, 05 Nov 2021)

Log Message

[css-values-4] viewport units should be floats
https://bugs.webkit.org/show_bug.cgi?id=231644
<rdar://problem/84172685>

Reviewed by Tim Horton.

Source/WebCore:

Views can be fractional pixels wide. We should not round, especially since viewport units
are used as percentage values (e.g. `50dvh` is "50% of the height of the current viewport").

Tests: CSSViewportUnits.EmptyUnobscuredSizeOverrides
       CSSViewportUnits.SameUnobscuredSizeOverrides
       CSSViewportUnits.DifferentUnobscuredSizeOverrides

* page/FrameView.h:
* page/FrameView.cpp:
(WebCore::FrameView::setSizeForCSSSmallViewportUnits):
(WebCore::FrameView::overrideWidthForCSSSmallViewportUnits):
(WebCore::FrameView::sizeForCSSSmallViewportUnits const):
(WebCore::FrameView::setSizeForCSSLargeViewportUnits):
(WebCore::FrameView::overrideWidthForCSSLargeViewportUnits):
(WebCore::FrameView::sizeForCSSLargeViewportUnits const):
(WebCore::FrameView::calculateSizeForCSSViewportUnitsOverride const):
(WebCore::FrameView::sizeForCSSDynamicViewportUnits const):
(WebCore::FrameView::sizeForCSSDefaultViewportUnits const):

* rendering/RenderView.h:
* rendering/RenderView.cpp:
(WebCore::RenderView::sizeForCSSSmallViewportUnits const):
(WebCore::RenderView::sizeForCSSLargeViewportUnits const):
(WebCore::RenderView::sizeForCSSDynamicViewportUnits const):
(WebCore::RenderView::sizeForCSSDefaultViewportUnits const):

Source/WebKit:

Views can be fractional pixels wide. We should not round, especially since viewport units
are used as percentage values (e.g. `50dvh` is "50% of the height of the current viewport").

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _setViewportSizeForCSSViewportUnits:]):

* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::setViewportSizeForCSSViewportUnits):

* Shared/WebPageCreationParameters.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::setViewportSizeForCSSViewportUnits):
(WebKit::WebPage::viewportSizeForCSSViewportUnits const):
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::updateViewportSizeForCSSViewportUnits):

Tools:

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

* TestWebKitAPI/Tests/WebKit/ViewportSizeForViewportUnits.mm:
(TEST.WebKit.ViewportSizeForViewportUnits):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (285344 => 285345)


--- trunk/Source/WebCore/ChangeLog	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebCore/ChangeLog	2021-11-05 17:43:33 UTC (rev 285345)
@@ -1,3 +1,37 @@
+2021-11-05  Devin Rousso  <drou...@apple.com>
+
+        [css-values-4] viewport units should be floats
+        https://bugs.webkit.org/show_bug.cgi?id=231644
+        <rdar://problem/84172685>
+
+        Reviewed by Tim Horton.
+
+        Views can be fractional pixels wide. We should not round, especially since viewport units
+        are used as percentage values (e.g. `50dvh` is "50% of the height of the current viewport").
+
+        Tests: CSSViewportUnits.EmptyUnobscuredSizeOverrides
+               CSSViewportUnits.SameUnobscuredSizeOverrides
+               CSSViewportUnits.DifferentUnobscuredSizeOverrides
+
+        * page/FrameView.h:
+        * page/FrameView.cpp:
+        (WebCore::FrameView::setSizeForCSSSmallViewportUnits):
+        (WebCore::FrameView::overrideWidthForCSSSmallViewportUnits):
+        (WebCore::FrameView::sizeForCSSSmallViewportUnits const):
+        (WebCore::FrameView::setSizeForCSSLargeViewportUnits):
+        (WebCore::FrameView::overrideWidthForCSSLargeViewportUnits):
+        (WebCore::FrameView::sizeForCSSLargeViewportUnits const):
+        (WebCore::FrameView::calculateSizeForCSSViewportUnitsOverride const):
+        (WebCore::FrameView::sizeForCSSDynamicViewportUnits const):
+        (WebCore::FrameView::sizeForCSSDefaultViewportUnits const):
+
+        * rendering/RenderView.h:
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::sizeForCSSSmallViewportUnits const):
+        (WebCore::RenderView::sizeForCSSLargeViewportUnits const):
+        (WebCore::RenderView::sizeForCSSDynamicViewportUnits const):
+        (WebCore::RenderView::sizeForCSSDefaultViewportUnits const):
+
 2021-11-05  Antoine Quint  <grao...@webkit.org>
 
         [Media Controls] Volume button orientation is always stuck to right-to-left

Modified: trunk/Source/WebCore/page/FrameView.cpp (285344 => 285345)


--- trunk/Source/WebCore/page/FrameView.cpp	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebCore/page/FrameView.cpp	2021-11-05 17:43:33 UTC (rev 285345)
@@ -5557,12 +5557,12 @@
         document->styleScope().didChangeStyleSheetEnvironment();
 }
 
-void FrameView::setSizeForCSSSmallViewportUnits(IntSize size)
+void FrameView::setSizeForCSSSmallViewportUnits(FloatSize size)
 {
     overrideSizeForCSSSmallViewportUnits({ size.width(), size.height() });
 }
 
-void FrameView::overrideWidthForCSSSmallViewportUnits(int width)
+void FrameView::overrideWidthForCSSSmallViewportUnits(float width)
 {
     overrideSizeForCSSSmallViewportUnits({ width, m_smallViewportSizeOverride ? m_smallViewportSizeOverride->height : std::nullopt });
 }
@@ -5583,7 +5583,7 @@
         document->styleScope().didChangeStyleSheetEnvironment();
 }
 
-IntSize FrameView::sizeForCSSSmallViewportUnits() const
+FloatSize FrameView::sizeForCSSSmallViewportUnits() const
 {
     return calculateSizeForCSSViewportUnitsOverride(m_smallViewportSizeOverride);
 }
@@ -5598,12 +5598,12 @@
         document->styleScope().didChangeStyleSheetEnvironment();
 }
 
-void FrameView::setSizeForCSSLargeViewportUnits(IntSize size)
+void FrameView::setSizeForCSSLargeViewportUnits(FloatSize size)
 {
     overrideSizeForCSSLargeViewportUnits({ size.width(), size.height() });
 }
 
-void FrameView::overrideWidthForCSSLargeViewportUnits(int width)
+void FrameView::overrideWidthForCSSLargeViewportUnits(float width)
 {
     overrideSizeForCSSLargeViewportUnits({ width, m_largeViewportSizeOverride ? m_largeViewportSizeOverride->height : std::nullopt });
 }
@@ -5624,31 +5624,23 @@
         document->styleScope().didChangeStyleSheetEnvironment();
 }
 
-IntSize FrameView::sizeForCSSLargeViewportUnits() const
+FloatSize FrameView::sizeForCSSLargeViewportUnits() const
 {
     return calculateSizeForCSSViewportUnitsOverride(m_largeViewportSizeOverride);
 }
 
-IntSize FrameView::calculateSizeForCSSViewportUnitsOverride(std::optional<OverrideViewportSize> override) const
+FloatSize FrameView::calculateSizeForCSSViewportUnitsOverride(std::optional<OverrideViewportSize> override) const
 {
     OverrideViewportSize viewportSize;
 
-    if (override)
+    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;
+        // 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 (!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());
@@ -5664,12 +5656,12 @@
     return { *viewportSize.width, *viewportSize.height };
 }
 
-IntSize FrameView::sizeForCSSDynamicViewportUnits() const
+FloatSize FrameView::sizeForCSSDynamicViewportUnits() const
 {
     return unobscuredContentRectIncludingScrollbars().size();
 }
 
-IntSize FrameView::sizeForCSSDefaultViewportUnits() const
+FloatSize FrameView::sizeForCSSDefaultViewportUnits() const
 {
     return sizeForCSSLargeViewportUnits();
 }

Modified: trunk/Source/WebCore/page/FrameView.h (285344 => 285345)


--- trunk/Source/WebCore/page/FrameView.h	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebCore/page/FrameView.h	2021-11-05 17:43:33 UTC (rev 285345)
@@ -228,17 +228,17 @@
 
     WEBCORE_EXPORT void adjustViewSize();
 
-    WEBCORE_EXPORT void setSizeForCSSSmallViewportUnits(IntSize);
+    WEBCORE_EXPORT void setSizeForCSSSmallViewportUnits(FloatSize);
     void clearSizeOverrideForCSSSmallViewportUnits();
-    IntSize sizeForCSSSmallViewportUnits() const;
+    FloatSize sizeForCSSSmallViewportUnits() const;
 
-    WEBCORE_EXPORT void setSizeForCSSLargeViewportUnits(IntSize);
+    WEBCORE_EXPORT void setSizeForCSSLargeViewportUnits(FloatSize);
     void clearSizeOverrideForCSSLargeViewportUnits();
-    IntSize sizeForCSSLargeViewportUnits() const;
+    FloatSize sizeForCSSLargeViewportUnits() const;
 
-    IntSize sizeForCSSDynamicViewportUnits() const;
+    FloatSize sizeForCSSDynamicViewportUnits() const;
 
-    IntSize sizeForCSSDefaultViewportUnits() const;
+    FloatSize sizeForCSSDefaultViewportUnits() const;
 
     IntRect windowClipRect() const final;
     WEBCORE_EXPORT IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*, bool clipToLayerContents) const;
@@ -857,19 +857,19 @@
     void didLayout(WeakPtr<RenderElement> layoutRoot);
 
     struct OverrideViewportSize {
-        std::optional<int> width;
-        std::optional<int> height;
+        std::optional<float> width;
+        std::optional<float> height;
 
         bool operator==(const OverrideViewportSize& rhs) const { return rhs.width == width && rhs.height == height; }
     };
-    IntSize calculateSizeForCSSViewportUnitsOverride(std::optional<OverrideViewportSize>) const;
+    FloatSize calculateSizeForCSSViewportUnitsOverride(std::optional<OverrideViewportSize>) const;
 
     void overrideSizeForCSSSmallViewportUnits(OverrideViewportSize);
-    void overrideWidthForCSSSmallViewportUnits(int);
+    void overrideWidthForCSSSmallViewportUnits(float);
     void resetOverriddenWidthForCSSSmallViewportUnits();
 
     void overrideSizeForCSSLargeViewportUnits(OverrideViewportSize);
-    void overrideWidthForCSSLargeViewportUnits(int);
+    void overrideWidthForCSSLargeViewportUnits(float);
     void resetOverriddenWidthForCSSLargeViewportUnits();
 
     void didFinishProhibitingScrollingWhenChangingContentSize() final;

Modified: trunk/Source/WebCore/rendering/RenderView.cpp (285344 => 285345)


--- trunk/Source/WebCore/rendering/RenderView.cpp	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebCore/rendering/RenderView.cpp	2021-11-05 17:43:33 UTC (rev 285345)
@@ -697,22 +697,22 @@
     return frameView().frame().pageZoomFactor();
 }
 
-IntSize RenderView::sizeForCSSSmallViewportUnits() const
+FloatSize RenderView::sizeForCSSSmallViewportUnits() const
 {
     return frameView().sizeForCSSSmallViewportUnits();
 }
 
-IntSize RenderView::sizeForCSSLargeViewportUnits() const
+FloatSize RenderView::sizeForCSSLargeViewportUnits() const
 {
     return frameView().sizeForCSSLargeViewportUnits();
 }
 
-IntSize RenderView::sizeForCSSDynamicViewportUnits() const
+FloatSize RenderView::sizeForCSSDynamicViewportUnits() const
 {
     return frameView().sizeForCSSDynamicViewportUnits();
 }
 
-IntSize RenderView::sizeForCSSDefaultViewportUnits() const
+FloatSize RenderView::sizeForCSSDefaultViewportUnits() const
 {
     return frameView().sizeForCSSDefaultViewportUnits();
 }

Modified: trunk/Source/WebCore/rendering/RenderView.h (285344 => 285345)


--- trunk/Source/WebCore/rendering/RenderView.h	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebCore/rendering/RenderView.h	2021-11-05 17:43:33 UTC (rev 285345)
@@ -143,10 +143,10 @@
 
     bool shouldPaintBaseBackground() const;
 
-    IntSize sizeForCSSSmallViewportUnits() const;
-    IntSize sizeForCSSLargeViewportUnits() const;
-    IntSize sizeForCSSDynamicViewportUnits() const;
-    IntSize sizeForCSSDefaultViewportUnits() const;
+    FloatSize sizeForCSSSmallViewportUnits() const;
+    FloatSize sizeForCSSLargeViewportUnits() const;
+    FloatSize sizeForCSSDynamicViewportUnits() const;
+    FloatSize sizeForCSSDefaultViewportUnits() const;
 
     bool hasQuotesNeedingUpdate() const { return m_hasQuotesNeedingUpdate; }
     void setHasQuotesNeedingUpdate(bool b) { m_hasQuotesNeedingUpdate = b; }

Modified: trunk/Source/WebKit/ChangeLog (285344 => 285345)


--- trunk/Source/WebKit/ChangeLog	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/ChangeLog	2021-11-05 17:43:33 UTC (rev 285345)
@@ -1,3 +1,30 @@
+2021-11-05  Devin Rousso  <drou...@apple.com>
+
+        [css-values-4] viewport units should be floats
+        https://bugs.webkit.org/show_bug.cgi?id=231644
+        <rdar://problem/84172685>
+
+        Reviewed by Tim Horton.
+
+        Views can be fractional pixels wide. We should not round, especially since viewport units
+        are used as percentage values (e.g. `50dvh` is "50% of the height of the current viewport").
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _setViewportSizeForCSSViewportUnits:]):
+
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::setViewportSizeForCSSViewportUnits):
+
+        * Shared/WebPageCreationParameters.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::setViewportSizeForCSSViewportUnits):
+        (WebKit::WebPage::viewportSizeForCSSViewportUnits const):
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::updateViewportSizeForCSSViewportUnits):
+
 2021-11-04  Jean-Yves Avenard  <j...@apple.com>
 
         Have RemoteMediaResource use SharedMemory

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.h (285344 => 285345)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2021-11-05 17:43:33 UTC (rev 285345)
@@ -127,7 +127,7 @@
     WebCore::IntSize minimumSizeForAutoLayout;
     WebCore::IntSize sizeToContentAutoSizeMaximumSize;
     bool autoSizingShouldExpandToViewHeight;
-    std::optional<WebCore::IntSize> viewportSizeForCSSViewportUnits;
+    std::optional<WebCore::FloatSize> viewportSizeForCSSViewportUnits;
     
     WebCore::ScrollPinningBehavior scrollPinningBehavior;
 

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (285344 => 285345)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-11-05 17:43:33 UTC (rev 285345)
@@ -1891,7 +1891,7 @@
 - (void)_setViewportSizeForCSSViewportUnits:(CGSize)viewportSize
 {
     THROW_IF_SUSPENDED;
-    auto viewportSizeForViewportUnits = WebCore::IntSize(viewportSize);
+    auto viewportSizeForViewportUnits = WebCore::FloatSize(viewportSize);
     if (viewportSizeForViewportUnits.isEmpty())
         [NSException raise:NSInvalidArgumentException format:@"Viewport size should not be empty"];
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (285344 => 285345)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-11-05 17:43:33 UTC (rev 285345)
@@ -8981,7 +8981,7 @@
     send(Messages::WebPage::SetAutoSizingShouldExpandToViewHeight(shouldExpand));
 }
 
-void WebPageProxy::setViewportSizeForCSSViewportUnits(const IntSize& viewportSize)
+void WebPageProxy::setViewportSizeForCSSViewportUnits(const FloatSize& viewportSize)
 {
     if (m_viewportSizeForCSSViewportUnits && *m_viewportSizeForCSSViewportUnits == viewportSize)
         return;

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (285344 => 285345)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-11-05 17:43:33 UTC (rev 285345)
@@ -1460,8 +1460,8 @@
     bool autoSizingShouldExpandToViewHeight() const { return m_autoSizingShouldExpandToViewHeight; }
     void setAutoSizingShouldExpandToViewHeight(bool);
 
-    void setViewportSizeForCSSViewportUnits(const WebCore::IntSize&);
-    WebCore::IntSize viewportSizeForCSSViewportUnits() const { return m_viewportSizeForCSSViewportUnits.value_or(WebCore::IntSize()); }
+    void setViewportSizeForCSSViewportUnits(const WebCore::FloatSize&);
+    WebCore::FloatSize viewportSizeForCSSViewportUnits() const { return m_viewportSizeForCSSViewportUnits.value_or(WebCore::FloatSize()); }
 
     void didReceiveAuthenticationChallengeProxy(Ref<AuthenticationChallengeProxy>&&, NegotiatedLegacyTLS);
     void negotiatedLegacyTLS();
@@ -2903,7 +2903,7 @@
     WebCore::IntSize m_minimumSizeForAutoLayout;
     WebCore::IntSize m_sizeToContentAutoSizeMaximumSize;
 
-    std::optional<WebCore::IntSize> m_viewportSizeForCSSViewportUnits;
+    std::optional<WebCore::FloatSize> m_viewportSizeForCSSViewportUnits;
 
     // Visual viewports
     WebCore::LayoutSize m_baseLayoutViewportSize;

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (285344 => 285345)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-11-05 17:43:33 UTC (rev 285345)
@@ -6207,7 +6207,7 @@
     corePage()->mainFrame().view()->setAutoSizeFixedMinimumHeight(shouldExpand ? m_viewSize.height() : 0);
 }
 
-void WebPage::setViewportSizeForCSSViewportUnits(std::optional<WebCore::IntSize> viewportSize)
+void WebPage::setViewportSizeForCSSViewportUnits(std::optional<WebCore::FloatSize> viewportSize)
 {
     if (m_viewportSizeForCSSViewportUnits == viewportSize)
         return;

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (285344 => 285345)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-11-05 17:43:33 UTC (rev 285345)
@@ -1167,8 +1167,8 @@
     void setAutoSizingShouldExpandToViewHeight(bool shouldExpand);
     bool autoSizingShouldExpandToViewHeight() { return m_autoSizingShouldExpandToViewHeight; }
 
-    void setViewportSizeForCSSViewportUnits(std::optional<WebCore::IntSize>);
-    std::optional<WebCore::IntSize> viewportSizeForCSSViewportUnits() const { return m_viewportSizeForCSSViewportUnits; }
+    void setViewportSizeForCSSViewportUnits(std::optional<WebCore::FloatSize>);
+    std::optional<WebCore::FloatSize> viewportSizeForCSSViewportUnits() const { return m_viewportSizeForCSSViewportUnits; }
 
     bool canShowMIMEType(const String& MIMEType) const;
     bool canShowResponse(const WebCore::ResourceResponse&) const;
@@ -2188,7 +2188,7 @@
     WebCore::IntSize m_minimumSizeForAutoLayout;
     WebCore::IntSize m_sizeToContentAutoSizeMaximumSize;
     bool m_autoSizingShouldExpandToViewHeight { false };
-    std::optional<WebCore::IntSize> m_viewportSizeForCSSViewportUnits;
+    std::optional<WebCore::FloatSize> m_viewportSizeForCSSViewportUnits;
 
     bool m_userIsInteracting { false };
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (285344 => 285345)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2021-11-05 17:43:33 UTC (rev 285345)
@@ -480,7 +480,7 @@
     SetSizeToContentAutoSizeMaximumSize(WebCore::IntSize size)
     SetAutoSizingShouldExpandToViewHeight(bool shouldExpand)
 
-    SetViewportSizeForCSSViewportUnits(std::optional<WebCore::IntSize> viewportSize)
+    SetViewportSizeForCSSViewportUnits(std::optional<WebCore::FloatSize> viewportSize)
 
 #if PLATFORM(COCOA)
     HandleAlternativeTextUIResult(String result)

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


--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2021-11-05 17:43:33 UTC (rev 285345)
@@ -3880,8 +3880,8 @@
     FrameView& frameView = *mainFrameView();
     smallestUnobscuredSize.scale(1 / m_viewportConfiguration.initialScaleIgnoringContentSize());
     largestUnobscuredSize.scale(1 / m_viewportConfiguration.initialScaleIgnoringContentSize());
-    frameView.setSizeForCSSSmallViewportUnits(roundedIntSize(smallestUnobscuredSize));
-    frameView.setSizeForCSSLargeViewportUnits(roundedIntSize(largestUnobscuredSize));
+    frameView.setSizeForCSSSmallViewportUnits(smallestUnobscuredSize);
+    frameView.setSizeForCSSLargeViewportUnits(largestUnobscuredSize);
 }
 
 void WebPage::applicationWillResignActive()

Modified: trunk/Tools/ChangeLog (285344 => 285345)


--- trunk/Tools/ChangeLog	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Tools/ChangeLog	2021-11-05 17:43:33 UTC (rev 285345)
@@ -1,3 +1,22 @@
+2021-11-05  Devin Rousso  <drou...@apple.com>
+
+        [css-values-4] viewport units should be floats
+        https://bugs.webkit.org/show_bug.cgi?id=231644
+        <rdar://problem/84172685>
+
+        Reviewed by Tim Horton.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm:
+        (evaluateForNumber):
+        (getElementHeight):
+        (TEST.CSSViewportUnits.AllSame):
+        (TEST.CSSViewportUnits.EmptyUnobscuredSizeOverrides):
+        (TEST.CSSViewportUnits.SameUnobscuredSizeOverrides):
+        (TEST.CSSViewportUnits.DifferentUnobscuredSizeOverrides):
+
+        * TestWebKitAPI/Tests/WebKit/ViewportSizeForViewportUnits.mm:
+        (TEST.WebKit.ViewportSizeForViewportUnits):
+
 2021-11-05  Jonathan Bedard  <jbed...@apple.com>
 
         [ic-stats.py] Change shebang to Python 3

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/ViewportSizeForViewportUnits.mm (285344 => 285345)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/ViewportSizeForViewportUnits.mm	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/ViewportSizeForViewportUnits.mm	2021-11-05 17:43:33 UTC (rev 285345)
@@ -98,7 +98,7 @@
         EXPECT_WK_STREQ(NSInvalidArgumentException, exception.name);
         exceptionRaised = true;
     }
-    EXPECT_TRUE(exceptionRaised);
+    EXPECT_FALSE(exceptionRaised);
 
     exceptionRaised = false;
     @try {

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm (285344 => 285345)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm	2021-11-05 17:34:07 UTC (rev 285344)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm	2021-11-05 17:43:33 UTC (rev 285345)
@@ -30,14 +30,14 @@
 #import <WebKit/WKWebViewPrivate.h>
 #import <wtf/RetainPtr.h>
 
-static int evaluateForInt(WKWebView *webView, NSString *script)
+static double evaluateForNumber(WKWebView *webView, NSString *script)
 {
-    return [(NSNumber *)[webView objectByEvaluatingJavaScript:script] intValue];
+    return [(NSNumber *)[webView objectByEvaluatingJavaScript:script] doubleValue];
 }
 
-static int getElementHeight(WKWebView *webView, NSString *elementID)
+static double getElementHeight(WKWebView *webView, NSString *elementID)
 {
-    return evaluateForInt(webView, [NSString stringWithFormat:@"document.getElementById('%@').getBoundingClientRect().height", elementID]);
+    return evaluateForNumber(webView, [NSString stringWithFormat:@"document.getElementById('%@').getBoundingClientRect().height", elementID]);
 }
 
 TEST(CSSViewportUnits, AllSame)
@@ -45,25 +45,25 @@
     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_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_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_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_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"));
+    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_EQ(evaluateForInt(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
+    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"));
 }
 
 #if PLATFORM(IOS_FAMILY)
@@ -71,85 +71,85 @@
 TEST(CSSViewportUnits, EmptyUnobscuredSizeOverrides)
 {
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
-    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
+    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10.5, 20.5)
                               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_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_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_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_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"));
+    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_EQ(evaluateForInt(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
+    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"));
 }
 
 TEST(CSSViewportUnits, SameUnobscuredSizeOverrides)
 {
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
-    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
-                              maximumUnobscuredSizeOverride:CGSizeMake(10, 20)];
+    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10.5, 20.5)
+                              maximumUnobscuredSizeOverride:CGSizeMake(10.5, 20.5)];
     [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_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_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_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_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"));
+    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_EQ(evaluateForInt(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
+    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"));
 }
 
 TEST(CSSViewportUnits, DifferentUnobscuredSizeOverrides)
 {
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
-    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
-                              maximumUnobscuredSizeOverride:CGSizeMake(30, 40)];
+    [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10.5, 20.5)
+                              maximumUnobscuredSizeOverride:CGSizeMake(30.5, 40.5)];
     [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_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_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_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_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"));
+    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_EQ(evaluateForInt(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
-    EXPECT_EQ(evaluateForInt(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
+    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"));
 }
 
 #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