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