Diff
Modified: trunk/LayoutTests/ChangeLog (89393 => 89394)
--- trunk/LayoutTests/ChangeLog 2011-06-21 23:46:49 UTC (rev 89393)
+++ trunk/LayoutTests/ChangeLog 2011-06-21 23:52:04 UTC (rev 89394)
@@ -1,3 +1,13 @@
+2011-06-21 Adrienne Walker <[email protected]>
+
+ Reviewed by Simon Fraser.
+
+ Add child layers to the overlap map if their parent belatedly becomes composited
+ https://bugs.webkit.org/show_bug.cgi?id=62181
+
+ * compositing/layer-creation/overlap-transformed-layer-expected.txt: Added.
+ * compositing/layer-creation/overlap-transformed-layer.html: Added.
+
2011-06-21 Zhenyao Mo <[email protected]>
Reviewed by Kenneth Russell.
Added: trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer-expected.png
(Binary files differ)
Property changes on: trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer-expected.png
___________________________________________________________________
Added: svn:mime-type
Added: trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer-expected.txt (0 => 89394)
--- trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer-expected.txt 2011-06-21 23:52:04 UTC (rev 89394)
@@ -0,0 +1,27 @@
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 2
+ (GraphicsLayer
+ (position 23.00 8.00)
+ (anchor 1.47 0.00)
+ (bounds 256.00 256.00)
+ (drawsContent 1)
+ (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [-10.00 0.00 0.00 1.00])
+ (children 1
+ (GraphicsLayer
+ (position 385.00 0.00)
+ )
+ )
+ )
+ (GraphicsLayer
+ (bounds 300.00 300.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
Property changes on: trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer-expected.txt
___________________________________________________________________
Added: svn:eol-style
Added: trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer.html (0 => 89394)
--- trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer.html (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer.html 2011-06-21 23:52:04 UTC (rev 89394)
@@ -0,0 +1,65 @@
+<html>
+<head>
+<style>
+ #container {
+ -webkit-transform: translate(-10px, 0px);
+ }
+
+ #indicator {
+ position: absolute;
+ left: 15px;
+ top: 0px;
+ height: 256px;
+ width: 256px;
+ background-color: red;
+ }
+
+ #green {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ width: 300px;
+ height: 300px;
+ background-color: green;
+ }
+
+ #composited {
+ position: absolute;
+ left: 400px;
+ -webkit-transform:translateZ(0);
+ }
+
+ #layertree {
+ position: absolute;
+ left: 10000px;
+ top: 0px;
+ }
+
+ body {
+ overflow: hidden;
+ }
+
+</style>
+
+<script>
+ if (window.layoutTestController) {
+ layoutTestController.dumpAsText(true);
+ window.addEventListener('load', function() {
+ document.getElementById("layertree").innerText = layoutTestController.layerTreeAsText();
+ }, false);
+ }
+</script>
+
+<body>
+ <div id="container">
+ <!-- This red square should not be visible -->
+ <div id="indicator"></div>
+ <div id="composited"></div>
+ </div>
+
+ <!-- This green square should render completely on top of the red one -->
+ <div id="green"></div>
+
+ <pre id="layertree"></pre>
+</body>
+</html>
Property changes on: trunk/LayoutTests/compositing/layer-creation/overlap-transformed-layer.html
___________________________________________________________________
Added: svn:eol-style
Modified: trunk/Source/WebCore/ChangeLog (89393 => 89394)
--- trunk/Source/WebCore/ChangeLog 2011-06-21 23:46:49 UTC (rev 89393)
+++ trunk/Source/WebCore/ChangeLog 2011-06-21 23:52:04 UTC (rev 89394)
@@ -1,3 +1,15 @@
+2011-06-21 Adrienne Walker <[email protected]>
+
+ Reviewed by Simon Fraser.
+
+ Add child layers to the overlap map if their parent belatedly becomes composited
+ https://bugs.webkit.org/show_bug.cgi?id=62181
+
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::addToOverlapMapRecursive):
+ (WebCore::RenderLayerCompositor::computeCompositingRequirements):
+ * rendering/RenderLayerCompositor.h:
+
2011-06-21 Zhenyao Mo <[email protected]>
Reviewed by Kenneth Russell.
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (89393 => 89394)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2011-06-21 23:46:49 UTC (rev 89393)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2011-06-21 23:52:04 UTC (rev 89394)
@@ -569,6 +569,45 @@
overlapMap.add(layer, layerBounds);
}
+void RenderLayerCompositor::addToOverlapMapRecursive(OverlapMap& overlapMap, RenderLayer* layer)
+{
+ if (!canBeComposited(layer) || overlapMap.contains(layer))
+ return;
+
+ IntRect bounds;
+ bool haveComputedBounds = false;
+ addToOverlapMap(overlapMap, layer, bounds, haveComputedBounds);
+
+ if (layer->isStackingContext()) {
+ if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) {
+ size_t listSize = negZOrderList->size();
+ for (size_t i = 0; i < listSize; ++i) {
+ RenderLayer* curLayer = negZOrderList->at(i);
+ addToOverlapMapRecursive(overlapMap, curLayer);
+ }
+ }
+ }
+
+ ASSERT(!layer->m_normalFlowListDirty);
+ if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) {
+ size_t listSize = normalFlowList->size();
+ for (size_t i = 0; i < listSize; ++i) {
+ RenderLayer* curLayer = normalFlowList->at(i);
+ addToOverlapMapRecursive(overlapMap, curLayer);
+ }
+ }
+
+ if (layer->isStackingContext()) {
+ if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) {
+ size_t listSize = posZOrderList->size();
+ for (size_t i = 0; i < listSize; ++i) {
+ RenderLayer* curLayer = posZOrderList->at(i);
+ addToOverlapMapRecursive(overlapMap, curLayer);
+ }
+ }
+ }
+}
+
bool RenderLayerCompositor::overlapsCompositedLayers(OverlapMap& overlapMap, const IntRect& layerBounds)
{
RenderLayerCompositor::OverlapMap::const_iterator end = overlapMap.end();
@@ -698,7 +737,7 @@
if (!willBeComposited && canBeComposited(layer) && childState.m_subtreeIsCompositing && requiresCompositingWhenDescendantsAreCompositing(layer->renderer())) {
layer->setMustOverlapCompositedLayers(true);
if (overlapMap)
- addToOverlapMap(*overlapMap, layer, absBounds, haveComputedBounds);
+ addToOverlapMapRecursive(*overlapMap, layer);
willBeComposited = true;
}
@@ -717,7 +756,7 @@
// so test that again.
if (!willBeComposited && canBeComposited(layer) && clipsCompositingDescendants(layer)) {
if (overlapMap)
- addToOverlapMap(*overlapMap, layer, absBounds, haveComputedBounds);
+ addToOverlapMapRecursive(*overlapMap, layer);
willBeComposited = true;
}
@@ -1820,4 +1859,3 @@
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
-
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (89393 => 89394)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2011-06-21 23:46:49 UTC (rev 89393)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2011-06-21 23:52:04 UTC (rev 89394)
@@ -214,6 +214,7 @@
typedef HashMap<RenderLayer*, IntRect> OverlapMap;
static void addToOverlapMap(OverlapMap&, RenderLayer*, IntRect& layerBounds, bool& boundsComputed);
+ void addToOverlapMapRecursive(OverlapMap&, RenderLayer*);
static bool overlapsCompositedLayers(OverlapMap&, const IntRect& layerBounds);
void updateCompositingLayersTimerFired(Timer<RenderLayerCompositor>*);