Title: [232823] trunk
Revision
232823
Author
za...@apple.com
Date
2018-06-13 18:36:24 -0700 (Wed, 13 Jun 2018)

Log Message

[Mail] Use the Mail Viewer width as the base for resolving horizontal viewport units
https://bugs.webkit.org/show_bug.cgi?id=186585
<rdar://problem/30685325>

Reviewed by Tim Horton.

Source/WebCore:

Use the existing "override viewport size for viewport units" mechanism to compute the preferred
viewport unit values for the Mail Viewer html content.

Test: fast/dynamic/mail-autosize-viewport-unit.html

* page/FrameView.cpp:
(WebCore::FrameView::FrameView):
(WebCore::FrameView::enableAutoSizeMode):
(WebCore::FrameView::clearViewportSizeOverrideForCSSViewportUnits):
(WebCore::FrameView::setViewportSizeForCSSViewportUnits):
(WebCore::FrameView::overrideViewportSizeForCSSViewportUnits):
(WebCore::FrameView::viewportSizeForCSSViewportUnits const):
* page/FrameView.h:

LayoutTests:

* fast/dynamic/mail-autosize-viewport-unit-expected.txt: Added.
* fast/dynamic/mail-autosize-viewport-unit.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (232822 => 232823)


--- trunk/LayoutTests/ChangeLog	2018-06-14 01:23:26 UTC (rev 232822)
+++ trunk/LayoutTests/ChangeLog	2018-06-14 01:36:24 UTC (rev 232823)
@@ -1,3 +1,14 @@
+2018-06-13  Zalan Bujtas  <za...@apple.com>
+
+        [Mail] Use the Mail Viewer width as the base for resolving horizontal viewport units
+        https://bugs.webkit.org/show_bug.cgi?id=186585
+        <rdar://problem/30685325>
+
+        Reviewed by Tim Horton.
+
+        * fast/dynamic/mail-autosize-viewport-unit-expected.txt: Added.
+        * fast/dynamic/mail-autosize-viewport-unit.html: Added.
+
 2018-06-13  Chris Dumez  <cdu...@apple.com>
 
         PSON: http/tests/resourceLoadStatistics/classify-as-prevalent-based-on-top-frame-redirect-collusion.html ASSERTS with process swap enabled

Added: trunk/LayoutTests/fast/dynamic/mail-autosize-viewport-unit-expected.txt (0 => 232823)


--- trunk/LayoutTests/fast/dynamic/mail-autosize-viewport-unit-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/dynamic/mail-autosize-viewport-unit-expected.txt	2018-06-14 01:36:24 UTC (rev 232823)
@@ -0,0 +1,2 @@
+
+2000px 1000px 200px 0px

Added: trunk/LayoutTests/fast/dynamic/mail-autosize-viewport-unit.html (0 => 232823)


--- trunk/LayoutTests/fast/dynamic/mail-autosize-viewport-unit.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dynamic/mail-autosize-viewport-unit.html	2018-06-14 01:36:24 UTC (rev 232823)
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>This tests that autosize uses the min-width as the base for resolving viewport unit values</title>
+<style>
+#w100 {
+    width: 100vw;
+    height: 10px;
+}
+
+#w50 {
+    width: 50vw;
+    height: 10px;
+}
+
+#w10 {
+    width: 10vw;
+    height: 10px;
+}
+
+#w0 {
+    width: 0vw;
+    height: 10px;
+}
+</style>
+<script>
+if (window.internals)
+    internals.enableAutoSizeMode(true, 2000, 600, 4000, 1000);
+
+if (window.testRunner)
+    testRunner.dumpAsText();
+</script>
+</head>
+<body>
+<div id=w100></div>
+<div id=w50></div>
+<div id=w10></div>
+<div id=w0></div>
+<img src="" width=3000px height=100px>
+<pre id=result></pre>
+<script>
+document.body.offsetWidth;
+result.textContent = window.getComputedStyle(w100, null).getPropertyValue("width") + " "
+    + window.getComputedStyle(w50, null).getPropertyValue("width") + " "
+    + window.getComputedStyle(w10, null).getPropertyValue("width") + " "  
+	+ window.getComputedStyle(w0, null).getPropertyValue("width");  
+</script>
+</body>
+</html>

Modified: trunk/LayoutTests/platform/ios/TestExpectations (232822 => 232823)


--- trunk/LayoutTests/platform/ios/TestExpectations	2018-06-14 01:23:26 UTC (rev 232822)
+++ trunk/LayoutTests/platform/ios/TestExpectations	2018-06-14 01:36:24 UTC (rev 232823)
@@ -3305,3 +3305,6 @@
 webkit.org/b/183258 imported/w3c/web-platform-tests/css/css-text/i18n/css3-text-line-break-opclns-115.html [ ImageOnlyFailure ]
 webkit.org/b/183258 imported/w3c/web-platform-tests/css/css-text/i18n/css3-text-line-break-opclns-116.html [ ImageOnlyFailure ]
 webkit.org/b/183258 imported/w3c/web-platform-tests/css/css-text/word-break/word-break-break-all-006.html [ ImageOnlyFailure ]
+
+# unsupported
+fast/dynamic/mail-autosize-viewport-unit.html [ Failure ]

Modified: trunk/Source/WebCore/ChangeLog (232822 => 232823)


--- trunk/Source/WebCore/ChangeLog	2018-06-14 01:23:26 UTC (rev 232822)
+++ trunk/Source/WebCore/ChangeLog	2018-06-14 01:36:24 UTC (rev 232823)
@@ -1,3 +1,25 @@
+2018-06-13  Zalan Bujtas  <za...@apple.com>
+
+        [Mail] Use the Mail Viewer width as the base for resolving horizontal viewport units
+        https://bugs.webkit.org/show_bug.cgi?id=186585
+        <rdar://problem/30685325>
+
+        Reviewed by Tim Horton.
+
+        Use the existing "override viewport size for viewport units" mechanism to compute the preferred
+        viewport unit values for the Mail Viewer html content. 
+
+        Test: fast/dynamic/mail-autosize-viewport-unit.html
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::FrameView):
+        (WebCore::FrameView::enableAutoSizeMode):
+        (WebCore::FrameView::clearViewportSizeOverrideForCSSViewportUnits):
+        (WebCore::FrameView::setViewportSizeForCSSViewportUnits):
+        (WebCore::FrameView::overrideViewportSizeForCSSViewportUnits):
+        (WebCore::FrameView::viewportSizeForCSSViewportUnits const):
+        * page/FrameView.h:
+
 2018-06-13  Dean Jackson  <d...@apple.com>
 
         Disable AR support in WKWebView clients

Modified: trunk/Source/WebCore/page/FrameView.cpp (232822 => 232823)


--- trunk/Source/WebCore/page/FrameView.cpp	2018-06-14 01:23:26 UTC (rev 232822)
+++ trunk/Source/WebCore/page/FrameView.cpp	2018-06-14 01:36:24 UTC (rev 232823)
@@ -190,7 +190,6 @@
     , m_useCustomFixedPositionLayoutRect(false)
     , m_useCustomSizeForResizeEvent(false)
 #endif
-    , m_hasOverrideViewportSize(false)
     , m_shouldAutoSize(false)
     , m_inAutoSize(false)
     , m_didRunAutosize(false)
@@ -4375,9 +4374,13 @@
 
     setNeedsLayout();
     layoutContext().scheduleLayout();
-    if (m_shouldAutoSize)
+    if (m_shouldAutoSize) {
+        // We should consider overriding the height as well. See webkit.org/b/186586
+        overrideViewportSizeForCSSViewportUnits({ minSize.width(), std::nullopt });
         return;
+    }
 
+    clearViewportSizeOverrideForCSSViewportUnits();
     // Since autosize mode forces the scrollbar mode, change them to being auto.
     setVerticalScrollbarLock(false);
     setHorizontalScrollbarLock(false);
@@ -5088,30 +5091,57 @@
     if (auto* page = frame().page())
         page->pageOverlayController().didChangeViewExposedRect();
 }
-    
+
+void FrameView::clearViewportSizeOverrideForCSSViewportUnits()
+{
+    if (!m_overrideViewportSize)
+        return;
+
+    m_overrideViewportSize = std::nullopt;
+    if (auto* document = frame().document())
+        document->styleScope().didChangeStyleSheetEnvironment();
+}
+
 void FrameView::setViewportSizeForCSSViewportUnits(IntSize size)
 {
-    if (m_hasOverrideViewportSize && m_overrideViewportSize == size)
+    overrideViewportSizeForCSSViewportUnits({ size.width(), size.height() });
+}
+
+void FrameView::overrideViewportSizeForCSSViewportUnits(OverrideViewportSize size)
+{
+    if (m_overrideViewportSize && *m_overrideViewportSize == size)
         return;
-    
+
     m_overrideViewportSize = size;
-    m_hasOverrideViewportSize = true;
-    
-    if (Document* document = frame().document())
+
+    if (auto* document = frame().document())
         document->styleScope().didChangeStyleSheetEnvironment();
 }
-    
+
 IntSize FrameView::viewportSizeForCSSViewportUnits() const
 {
-    if (m_hasOverrideViewportSize)
-        return m_overrideViewportSize;
+    OverrideViewportSize viewportSize;
 
-    if (useFixedLayout())
-        return fixedLayoutSize();
+    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 (useFixedLayout()) {
+        auto fixedLayoutSize = this->fixedLayoutSize();
+        viewportSize.width = viewportSize.width.value_or(fixedLayoutSize.width());
+        viewportSize.height = viewportSize.height.value_or(fixedLayoutSize.height());
+        return { *viewportSize.width, *viewportSize.height };
+    }
     
     // FIXME: the value returned should take into account the value of the overflow
     // property on the root element.
-    return visibleContentRectIncludingScrollbars().size();
+    auto visibleContentSizeIncludingScrollbars = visibleContentRectIncludingScrollbars().size();
+    viewportSize.width = viewportSize.width.value_or(visibleContentSizeIncludingScrollbars.width());
+    viewportSize.height = viewportSize.height.value_or(visibleContentSizeIncludingScrollbars.height());
+    return { *viewportSize.width, *viewportSize.height };
 }
 
 bool FrameView::shouldPlaceBlockDirectionScrollbarOnLeft() const

Modified: trunk/Source/WebCore/page/FrameView.h (232822 => 232823)


--- trunk/Source/WebCore/page/FrameView.h	2018-06-14 01:23:26 UTC (rev 232822)
+++ trunk/Source/WebCore/page/FrameView.h	2018-06-14 01:36:24 UTC (rev 232823)
@@ -211,8 +211,9 @@
     WEBCORE_EXPORT void adjustViewSize();
 
     WEBCORE_EXPORT void setViewportSizeForCSSViewportUnits(IntSize);
+    void clearViewportSizeOverrideForCSSViewportUnits();
     IntSize viewportSizeForCSSViewportUnits() const;
-    
+
     IntRect windowClipRect() const final;
     WEBCORE_EXPORT IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*, bool clipToLayerContents) const;
 
@@ -782,6 +783,14 @@
     void willDoLayout(WeakPtr<RenderElement> layoutRoot);
     void didLayout(WeakPtr<RenderElement> layoutRoot);
 
+    struct OverrideViewportSize {
+        std::optional<int> width;
+        std::optional<int> height;
+
+        bool operator==(const OverrideViewportSize& rhs) const { return rhs.width == width && rhs.height == height; }
+    };
+    void overrideViewportSizeForCSSViewportUnits(OverrideViewportSize);
+
     HashSet<Widget*> m_widgetsInRenderTree;
 
     static MonotonicTime sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
@@ -867,8 +876,7 @@
     IntSize m_customSizeForResizeEvent;
 #endif
 
-    IntSize m_overrideViewportSize;
-    bool m_hasOverrideViewportSize;
+    std::optional<OverrideViewportSize> m_overrideViewportSize;
 
     // If true, automatically resize the frame view around its content.
     bool m_shouldAutoSize;

Modified: trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm (232822 => 232823)


--- trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm	2018-06-14 01:23:26 UTC (rev 232822)
+++ trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm	2018-06-14 01:36:24 UTC (rev 232823)
@@ -1589,10 +1589,9 @@
 
     // W3C SVG tests expect to be 480x360
     bool isSVGW3CTest = (gTestRunner->testURL().find("svg/W3C-SVG-1.1") != string::npos);
-    if (isSVGW3CTest)
-        [[mainFrame webView] setFrameSize:NSMakeSize(TestRunner::w3cSVGViewWidth, TestRunner::w3cSVGViewHeight)];
-    else
-        [[mainFrame webView] setFrameSize:NSMakeSize(TestRunner::viewWidth, TestRunner::viewHeight)];
+    NSSize frameSize = isSVGW3CTest ? NSMakeSize(TestRunner::w3cSVGViewWidth, TestRunner::w3cSVGViewHeight) : NSMakeSize(TestRunner::viewWidth, TestRunner::viewHeight);
+    [[mainFrame webView] setFrameSize:frameSize];
+    [[mainFrame frameView] setFrame:NSMakeRect(0, 0, frameSize.width, frameSize.height)];
 }
 
 static const char *methodNameStringForFailedTest()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to