Diff
Modified: trunk/LayoutTests/ChangeLog (125085 => 125086)
--- trunk/LayoutTests/ChangeLog 2012-08-08 21:08:32 UTC (rev 125085)
+++ trunk/LayoutTests/ChangeLog 2012-08-08 21:09:59 UTC (rev 125086)
@@ -1,3 +1,17 @@
+2012-08-08 Beth Dakin <[email protected]>
+
+ https://bugs.webkit.org/show_bug.cgi?id=93393
+ Overflow regions sometimes repaint incorrectly after going into or
+ coming out of compositing mode
+ -and corresponding-
+ <rdar://problem/12006463>
+
+ Reviewed by Simon Fraser.
+
+ * compositing/repaint/newly-composited-on-scroll.html: Added.
+ * platform/mac/compositing/repaint/newly-composited-on-scroll-expected.png: Added.
+ * platform/mac/compositing/repaint/newly-composited-on-scroll-expected.txt: Added.
+
2012-08-08 Eric Carlson <[email protected]>
REGRESSION (r124710-r124713): media/video-seek-past-end-paused.html failing on Apple Lion Debug WK1 (Tests)
Added: trunk/LayoutTests/compositing/repaint/newly-composited-on-scroll.html (0 => 125086)
--- trunk/LayoutTests/compositing/repaint/newly-composited-on-scroll.html (rev 0)
+++ trunk/LayoutTests/compositing/repaint/newly-composited-on-scroll.html 2012-08-08 21:09:59 UTC (rev 125086)
@@ -0,0 +1,96 @@
+<html>
+<head>
+ <title>Reduction</title>
+ <style>
+ #content-container {
+ position:absolute;
+ top:48px;
+ bottom:0;
+ left:0;
+ right:0;
+ margin-left:225px;
+ }
+
+ #composited {
+ height: 38px;
+ -webkit-transform:translate3d(0px, 0px, 0px);
+ }
+
+ #positioned-2 {
+ position:absolute;
+ top:40px;
+ bottom:0;
+ left:0;
+ right:0;
+ }
+
+ .positioned-3 {
+ position:absolute;
+ top:0;
+ bottom:0;
+ left:0;
+ right:0;
+ }
+
+ #transformed-container {
+ -webkit-transform: translateX(0);
+ height:300px;
+ width:600px;
+ }
+
+ #overflow {
+ overflow:auto;
+ border: 2px solid black;
+ }
+
+ .positioned-4 {
+ position:absolute;
+ top:20px;
+ height:80px;
+ right:20px;
+ width:80px;
+ }
+ </style>
+</head>
+
+<script src=""
+
+<script>
+ if (window.testRunner) {
+ testRunner.dumpAsText(true);
+ testRunner.waitUntilDone();
+ }
+
+ function repaintTest() {
+ if (window.testRunner)
+ testRunner.display();
+
+ document.getElementById('overflow').scrollTop = 30;
+ if (window.testRunner)
+ testRunner.display();
+
+ window.setTimeout(function() {
+ document.getElementById('overflow').scrollTop = 50;
+ testRunner.notifyDone();
+ }, 0);
+ }
+
+</script>
+
+<body _onload_="runRepaintTest()">
+ <div id="content-container">
+ <div id="composited"></div>
+ <div id="positioned-2">
+ <div id="transformed-container" class="positioned-3">
+ <div id="overflow" class="positioned-3">
+ <div class="positioned-4"></div>
+
+ <div style="background-color:purple; width:50px; height:300px;"></div>
+ <br/>
+ <div style="width:500px; height:50px; background-color:green;"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
Added: trunk/LayoutTests/platform/mac/compositing/repaint/newly-composited-on-scroll-expected.png
(Binary files differ)
Property changes on: trunk/LayoutTests/platform/mac/compositing/repaint/newly-composited-on-scroll-expected.png
___________________________________________________________________
Added: svn:mime-type
Added: trunk/LayoutTests/platform/mac/compositing/repaint/newly-composited-on-scroll-expected.txt (0 => 125086)
--- trunk/LayoutTests/platform/mac/compositing/repaint/newly-composited-on-scroll-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/mac/compositing/repaint/newly-composited-on-scroll-expected.txt 2012-08-08 21:09:59 UTC (rev 125086)
@@ -0,0 +1,2 @@
+
+
Modified: trunk/Source/WebCore/ChangeLog (125085 => 125086)
--- trunk/Source/WebCore/ChangeLog 2012-08-08 21:08:32 UTC (rev 125085)
+++ trunk/Source/WebCore/ChangeLog 2012-08-08 21:09:59 UTC (rev 125086)
@@ -1,3 +1,26 @@
+2012-08-08 Beth Dakin <[email protected]>
+
+ https://bugs.webkit.org/show_bug.cgi?id=93393
+ Overflow regions sometimes repaint incorrectly after going into or
+ coming out of compositing mode
+ -and corresponding-
+ <rdar://problem/12006463>
+
+ Reviewed by Simon Fraser.
+
+ New RenderLayer function computeRepaintRectsIncludingDescendants()
+ * rendering/RenderLayer.cpp:
+ (WebCore):
+ (WebCore::RenderLayer::computeRepaintRectsIncludingDescendants):
+ * rendering/RenderLayer.h:
+ (RenderLayer):
+
+ It is not sufficient to compute repaint rects just for the current
+ layer when compositing changes. They must be recomputed for all
+ descendant layers as well.
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::updateBacking):
+
2012-08-08 Alec Flett <[email protected]>
IndexedDB: new enums and openCursor stub
Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (125085 => 125086)
--- trunk/Source/WebCore/rendering/RenderLayer.cpp 2012-08-08 21:08:32 UTC (rev 125085)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp 2012-08-08 21:09:59 UTC (rev 125086)
@@ -485,6 +485,17 @@
m_outlineBox = renderer()->outlineBoundsForRepaint(repaintContainer, offsetFromRoot);
}
+
+void RenderLayer::computeRepaintRectsIncludingDescendants()
+{
+ // FIXME: computeRepaintRects() has to walk up the parent chain for every layer to compute the rects.
+ // We should make this more efficient.
+ computeRepaintRects();
+
+ for (RenderLayer* layer = firstChild(); layer; layer = layer->nextSibling())
+ layer->computeRepaintRectsIncludingDescendants();
+}
+
void RenderLayer::clearRepaintRects()
{
ASSERT(!m_hasVisibleContent);
Modified: trunk/Source/WebCore/rendering/RenderLayer.h (125085 => 125086)
--- trunk/Source/WebCore/rendering/RenderLayer.h 2012-08-08 21:08:32 UTC (rev 125085)
+++ trunk/Source/WebCore/rendering/RenderLayer.h 2012-08-08 21:09:59 UTC (rev 125086)
@@ -673,6 +673,7 @@
void dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
void computeRepaintRects(LayoutPoint* offsetFromRoot = 0);
+ void computeRepaintRectsIncludingDescendants();
void clearRepaintRects();
void clipToRect(RenderLayer* rootLayer, GraphicsContext*, const LayoutRect& paintDirtyRect, const ClipRect&,
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (125085 => 125086)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2012-08-08 21:08:32 UTC (rev 125085)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2012-08-08 21:09:59 UTC (rev 125086)
@@ -493,13 +493,6 @@
repaintOnCompositingChange(layer);
layer->ensureBacking();
-
- // The RenderLayer's needs to update repaint rects here, because the target
- // repaintContainer may have changed after becoming a composited layer.
- // https://bugs.webkit.org/show_bug.cgi?id=80641
- if (layer->parent())
- layer->computeRepaintRects();
-
layerChanged = true;
}
} else {
@@ -518,10 +511,6 @@
layer->clearBacking();
layerChanged = true;
- // The layer's cached repaints rects are relative to the repaint container, so change when
- // compositing changes; we need to update them here.
- layer->computeRepaintRects();
-
// If we need to repaint, do so now that we've removed the backing
if (shouldRepaint == CompositingChangeRepaintNow)
repaintOnCompositingChange(layer);
@@ -542,9 +531,14 @@
innerCompositor->updateRootLayerAttachment();
}
- if (layerChanged)
+ if (layerChanged) {
layer->clearClipRectsIncludingDescendants(PaintingClipRects);
+ // This layer and all of its descendants have cached repaints rects that are relative to
+ // the repaint container, so change when compositing changes; we need to update them here.
+ layer->computeRepaintRectsIncludingDescendants();
+ }
+
// If a fixed position layer gained/lost a backing, the scrolling coordinator needs to recalculate whether it can do fast scrolling.
if (layerChanged && layer->renderer()->style()->position() == FixedPosition) {
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())