Title: [252419] trunk
Revision
252419
Author
[email protected]
Date
2019-11-13 11:22:54 -0800 (Wed, 13 Nov 2019)

Log Message

Google Docs spreadsheet tiles render very slowly (because of event region painting)
https://bugs.webkit.org/show_bug.cgi?id=204160
<rdar://problem/57073401>

Reviewed by Simon Fraser.

Source/WebCore:

Content of a overflow:scroll area on this page doesn't cover the entire scrollable area and we end
up generating a complex shape for the event region. This is unnecessary as touches within scrollers
always scroll the content.

Test: fast/scrolling/ios/event-region-scrolled-contents-layer.html

* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateEventRegion):

Initialize event region for scrolled contents layer with layer-sized event region. This optimizes away
event region mutations. We still need to to do the event region paint to capture touch-action regions.

In future we should also improve Region type to not have pathological worst-case performance with complex
shapes.

LayoutTests:

* fast/scrolling/ios/event-region-scrolled-contents-layer-expected.txt: Added.
* fast/scrolling/ios/event-region-scrolled-contents-layer.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (252418 => 252419)


--- trunk/LayoutTests/ChangeLog	2019-11-13 19:15:13 UTC (rev 252418)
+++ trunk/LayoutTests/ChangeLog	2019-11-13 19:22:54 UTC (rev 252419)
@@ -1,3 +1,14 @@
+2019-11-13  Antti Koivisto  <[email protected]>
+
+        Google Docs spreadsheet tiles render very slowly (because of event region painting)
+        https://bugs.webkit.org/show_bug.cgi?id=204160
+        <rdar://problem/57073401>
+
+        Reviewed by Simon Fraser.
+
+        * fast/scrolling/ios/event-region-scrolled-contents-layer-expected.txt: Added.
+        * fast/scrolling/ios/event-region-scrolled-contents-layer.html: Added.
+
 2019-11-13  Youenn Fablet  <[email protected]>
 
         [ iOS ]: Layout Test http/tests/IndexedDB/storage-limit-1.https.html is a Flaky Failure

Added: trunk/LayoutTests/fast/scrolling/ios/event-region-scrolled-contents-layer-expected.txt (0 => 252419)


--- trunk/LayoutTests/fast/scrolling/ios/event-region-scrolled-contents-layer-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/scrolling/ios/event-region-scrolled-contents-layer-expected.txt	2019-11-13 19:22:54 UTC (rev 252419)
@@ -0,0 +1,35 @@
+(GraphicsLayer
+  (anchor 0.00 0.00)
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+      (contentsOpaque 1)
+      (children 1
+        (GraphicsLayer
+          (position 8.00 8.00)
+          (bounds 300.00 300.00)
+          (event region
+            (rect (0,0) width=300 height=300)
+          )
+          (children 1
+            (GraphicsLayer
+              (bounds 300.00 300.00)
+              (children 1
+                (GraphicsLayer
+                  (anchor 0.00 0.00)
+                  (bounds 400.00 400.00)
+                  (drawsContent 1)
+                  (event region
+                    (rect (0,0) width=400 height=400)
+                  )
+                )
+              )
+            )
+          )
+        )
+      )
+    )
+  )
+)
+

Added: trunk/LayoutTests/fast/scrolling/ios/event-region-scrolled-contents-layer.html (0 => 252419)


--- trunk/LayoutTests/fast/scrolling/ios/event-region-scrolled-contents-layer.html	                        (rev 0)
+++ trunk/LayoutTests/fast/scrolling/ios/event-region-scrolled-contents-layer.html	2019-11-13 19:22:54 UTC (rev 252419)
@@ -0,0 +1,39 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] -->
+<html>
+<style>
+.scroll {
+    overflow:scroll;
+    width:300px;
+    height:300px;
+}
+.contents {
+    position:relative;
+    background-color:blue;
+    width:200px;
+    height:200px;
+}
+.offset {
+    left: 200px;
+}
+
+</style>
+<script>
+window._onload_ = () => {
+    if (window.testRunner)
+        testRunner.dumpAsText();
+
+    if (window.internals)
+        results.innerText = internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_EVENT_REGION);
+}
+</script>
+<body>
+<div class=scroll>
+    <div class="contents">
+    </div>
+    <div class="contents offset">
+    </div>
+</div>
+<pre id="results"></pre>
+</body>
+</html>
+

Modified: trunk/Source/WebCore/ChangeLog (252418 => 252419)


--- trunk/Source/WebCore/ChangeLog	2019-11-13 19:15:13 UTC (rev 252418)
+++ trunk/Source/WebCore/ChangeLog	2019-11-13 19:22:54 UTC (rev 252419)
@@ -1,3 +1,26 @@
+2019-11-13  Antti Koivisto  <[email protected]>
+
+        Google Docs spreadsheet tiles render very slowly (because of event region painting)
+        https://bugs.webkit.org/show_bug.cgi?id=204160
+        <rdar://problem/57073401>
+
+        Reviewed by Simon Fraser.
+
+        Content of a overflow:scroll area on this page doesn't cover the entire scrollable area and we end
+        up generating a complex shape for the event region. This is unnecessary as touches within scrollers
+        always scroll the content.
+
+        Test: fast/scrolling/ios/event-region-scrolled-contents-layer.html
+
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::updateEventRegion):
+
+        Initialize event region for scrolled contents layer with layer-sized event region. This optimizes away
+        event region mutations. We still need to to do the event region paint to capture touch-action regions.
+
+        In future we should also improve Region type to not have pathological worst-case performance with complex
+        shapes.
+
 2019-11-13  Andres Gonzalez  <[email protected]>
 
         AXObjectCache::rootObject should generate the isolated tree.

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (252418 => 252419)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2019-11-13 19:15:13 UTC (rev 252418)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2019-11-13 19:22:54 UTC (rev 252419)
@@ -1599,12 +1599,18 @@
         GraphicsContext nullContext(nullptr);
         EventRegion eventRegion;
         auto eventRegionContext = eventRegion.makeContext();
+        auto layerOffset = graphicsLayer.scrollOffset() - roundedIntSize(graphicsLayer.offsetFromRenderer());
+
+        if (&graphicsLayer == m_scrolledContentsLayer && renderer().visibleToHitTesting()) {
+            // Initialize scrolled contents layer with layer-sized event region as it can all used for scrolling.
+            // This avoids generating unnecessarily complex event regions. We still need to to do the paint to capture touch-action regions.
+            eventRegionContext.unite(enclosingIntRect(FloatRect(-layerOffset, graphicsLayer.size())), RenderStyle::defaultStyle());
+        }
+
         auto dirtyRect = enclosingIntRect(FloatRect(FloatPoint(graphicsLayer.offsetFromRenderer()), graphicsLayer.size()));
-
         paintIntoLayer(&graphicsLayer, nullContext, dirtyRect, { }, &eventRegionContext);
 
-        auto layerOffset = toIntSize(graphicsLayer.scrollOffset()) - roundedIntSize(graphicsLayer.offsetFromRenderer());
-        eventRegion.translate(layerOffset);
+        eventRegion.translate(toIntSize(layerOffset));
 
         graphicsLayer.setEventRegion(WTFMove(eventRegion));
     };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to