Title: [270339] trunk
Revision
270339
Author
[email protected]
Date
2020-12-01 19:35:37 -0800 (Tue, 01 Dec 2020)

Log Message

Toggling pointer-events on body does not re-enable scrolling on child
https://bugs.webkit.org/show_bug.cgi?id=218533
<rdar://problem/71009746>

Reviewed by Simon Fraser.

Source/WebCore:

* rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::changeRequiresRecompositeLayer const):
Changes to the CSS `pointer-events` property should also also indicate that a recomposite is
required (`StyleDifference::RecompositeLayer`), resulting in `RenderElement::styleWillChange`
being called, which invalidates the event region since the value of the CSS `pointer-events`
property has changed.

* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::layerStyleChanged):
Don't limit `StyleDifference::RecompositeLayer` changes to only affect `RenderWidget`.

LayoutTests:

* fast/scrolling/ios/overflow-scroll-pointer-events.html: Added.
* fast/scrolling/ios/overflow-scroll-pointer-events-expected.txt: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (270338 => 270339)


--- trunk/LayoutTests/ChangeLog	2020-12-02 03:25:42 UTC (rev 270338)
+++ trunk/LayoutTests/ChangeLog	2020-12-02 03:35:37 UTC (rev 270339)
@@ -1,3 +1,14 @@
+2020-12-01  Devin Rousso  <[email protected]>
+
+        Toggling pointer-events on body does not re-enable scrolling on child
+        https://bugs.webkit.org/show_bug.cgi?id=218533
+        <rdar://problem/71009746>
+
+        Reviewed by Simon Fraser.
+
+        * fast/scrolling/ios/overflow-scroll-pointer-events.html: Added.
+        * fast/scrolling/ios/overflow-scroll-pointer-events-expected.txt: Added.
+
 2020-12-01  Chris Fleizach  <[email protected]>
 
         AX: VoiceOver does not announce the  aria-checked state for ARIA treeitem

Added: trunk/LayoutTests/fast/scrolling/ios/overflow-scroll-pointer-events-expected.txt (0 => 270339)


--- trunk/LayoutTests/fast/scrolling/ios/overflow-scroll-pointer-events-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/scrolling/ios/overflow-scroll-pointer-events-expected.txt	2020-12-02 03:35:37 UTC (rev 270339)
@@ -0,0 +1,11 @@
+Tests that toggling `pointer-events: none;` doesn't prevent scrolling.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS innerScrollElement.scrollTop is 0
+Disabling pointer events...
+PASS innerScrollElement.scrollTop is 0
+Enabling pointer events...
+PASS innerScrollElement.scrollTop is 150
+

Added: trunk/LayoutTests/fast/scrolling/ios/overflow-scroll-pointer-events.html (0 => 270339)


--- trunk/LayoutTests/fast/scrolling/ios/overflow-scroll-pointer-events.html	                        (rev 0)
+++ trunk/LayoutTests/fast/scrolling/ios/overflow-scroll-pointer-events.html	2020-12-02 03:35:37 UTC (rev 270339)
@@ -0,0 +1,61 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ AsyncOverflowScrollingEnabled=true ] -->
+<head>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<script src=""
+<script src=""
+<script src=""
+<style>
+.disable-scroll { pointer-events: none; }
+.outer-scroll { height: 100%; }
+.inner-scroll { height: 100%; overflow-y: auto; }
+.box { height: 100%; }
+</style>
+<script>
+if (window.testRunner)
+    testRunner.waitUntilDone();
+
+async function runTest() {
+    if (!window.testRunner) {
+        finishJSTest();
+        return;
+    }
+
+    description("Tests that toggling `pointer-events: none;` doesn't prevent scrolling.");
+
+    globalThis.outerScrollElement = document.querySelector(".outer-scroll");
+    globalThis.innerScrollElement = document.querySelector(".inner-scroll");
+
+    shouldBe("innerScrollElement.scrollTop", "0");
+
+    debug("Disabling pointer events...");
+    outerScrollElement.classList.add("disable-scroll");
+    await UIHelper.animationFrame();
+    await touchAndDragFromPointToPoint(150, 300, 150, 150);
+    await liftUpAtPoint(150, 150);
+    await UIHelper.animationFrame();
+    shouldBe("innerScrollElement.scrollTop", "0");
+
+    debug("Enabling pointer events...");
+    outerScrollElement.classList.remove("disable-scroll");
+    await UIHelper.animationFrame();
+    await touchAndDragFromPointToPoint(150, 300, 150, 150);
+    await liftUpAtPoint(150, 150);
+    await UIHelper.animationFrame();
+    shouldBe("innerScrollElement.scrollTop", "150");
+
+    finishJSTest();
+}
+</script>
+<body _onload_="runTest()">
+    <div class="outer-scroll">
+        <div class="inner-scroll">
+            <div class="box" style="background-color: red;"></div>
+            <div class="box" style="background-color: green;"></div>
+            <div class="box" style="background-color: blue;"></div>
+        </div>
+    </div>
+    <p id="description"></p>
+    <div id="console"></div>
+    <script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (270338 => 270339)


--- trunk/Source/WebCore/ChangeLog	2020-12-02 03:25:42 UTC (rev 270338)
+++ trunk/Source/WebCore/ChangeLog	2020-12-02 03:35:37 UTC (rev 270339)
@@ -1,3 +1,22 @@
+2020-12-01  Devin Rousso  <[email protected]>
+
+        Toggling pointer-events on body does not re-enable scrolling on child
+        https://bugs.webkit.org/show_bug.cgi?id=218533
+        <rdar://problem/71009746>
+
+        Reviewed by Simon Fraser.
+
+        * rendering/style/RenderStyle.cpp:
+        (WebCore::RenderStyle::changeRequiresRecompositeLayer const):
+        Changes to the CSS `pointer-events` property should also also indicate that a recomposite is
+        required (`StyleDifference::RecompositeLayer`), resulting in `RenderElement::styleWillChange`
+        being called, which invalidates the event region since the value of the CSS `pointer-events`
+        property has changed.
+
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::layerStyleChanged):
+        Don't limit `StyleDifference::RecompositeLayer` changes to only affect `RenderWidget`.
+
 2020-12-01  Simon Fraser  <[email protected]>
 
         Simplify some callsites of WheelEventTestMonitor

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (270338 => 270339)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2020-12-02 03:25:42 UTC (rev 270338)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2020-12-02 03:35:37 UTC (rev 270339)
@@ -1681,9 +1681,14 @@
         }
     }
 
-    // This is necessary to get iframe layers hooked up in response to scheduleInvalidateStyleAndLayerComposition().
-    if (diff == StyleDifference::RecompositeLayer && layer.isComposited() && is<RenderWidget>(layer.renderer()))
-        layer.setNeedsCompositingConfigurationUpdate();
+    if (diff == StyleDifference::RecompositeLayer && layer.isComposited()) {
+        if (oldStyle && oldStyle->pointerEvents() != newStyle.pointerEvents())
+            layer.setNeedsCompositingConfigurationUpdate();
+        else if (is<RenderWidget>(layer.renderer())) {
+            // This is necessary to get iframe layers hooked up in response to scheduleInvalidateStyleAndLayerComposition().
+            layer.setNeedsCompositingConfigurationUpdate();
+        }
+    }
 
     if (diff >= StyleDifference::RecompositeLayer && oldStyle && recompositeChangeRequiresGeometryUpdate(*oldStyle, newStyle)) {
         // FIXME: transform changes really need to trigger layout. See RenderElement::adjustStyleDifference().

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.cpp (270338 => 270339)


--- trunk/Source/WebCore/rendering/style/RenderStyle.cpp	2020-12-02 03:25:42 UTC (rev 270338)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.cpp	2020-12-02 03:35:37 UTC (rev 270339)
@@ -1167,6 +1167,9 @@
 
 bool RenderStyle::changeRequiresRecompositeLayer(const RenderStyle& other, OptionSet<StyleDifferenceContextSensitiveProperty>&) const
 {
+    if (m_inheritedFlags.pointerEvents != other.m_inheritedFlags.pointerEvents)
+        return true;
+
     if (m_rareNonInheritedData.ptr() != other.m_rareNonInheritedData.ptr()) {
         if (m_rareNonInheritedData->transformStyle3D != other.m_rareNonInheritedData->transformStyle3D
             || m_rareNonInheritedData->backfaceVisibility != other.m_rareNonInheritedData->backfaceVisibility
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to