Title: [140593] trunk
Revision
140593
Author
[email protected]
Date
2013-01-23 14:24:49 -0800 (Wed, 23 Jan 2013)

Log Message

Should update compositing state when an out-of-view fixed position element becomes in-view
https://bugs.webkit.org/show_bug.cgi?id=107410

Reviewed by Simon Fraser.

Source/WebCore:

When a non-compositing page contains some not-composited fixed position element because of bounds out-of-view, when the element changes position and RenderLayerCompositor::updateCompositingLayers() is called, the function may return early because of "if (!m_reevaluateCompositingAfterLayout && !m_compositing)" without updating the compositing layers.

Set m_reevaluateCompositingAfterLayout when a fixed position element is not composited because of bounds out-of-view.

Test: compositing/layer-creation/fixed-position-change-out-of-view-in-view.html

* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::requiresCompositingForPosition):

LayoutTests:

Tests if compositing status is properly updated when fixed position elements change from out-of-view to in-view and back.

* compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt: Added.
* compositing/layer-creation/fixed-position-change-out-of-view-in-view.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (140592 => 140593)


--- trunk/LayoutTests/ChangeLog	2013-01-23 22:20:08 UTC (rev 140592)
+++ trunk/LayoutTests/ChangeLog	2013-01-23 22:24:49 UTC (rev 140593)
@@ -1,3 +1,15 @@
+2013-01-23  Xianzhu Wang  <[email protected]>
+
+        Should update compositing state when an out-of-view fixed position element becomes in-view
+        https://bugs.webkit.org/show_bug.cgi?id=107410
+
+        Reviewed by Simon Fraser.
+
+        Tests if compositing status is properly updated when fixed position elements change from out-of-view to in-view and back.
+
+        * compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt: Added.
+        * compositing/layer-creation/fixed-position-change-out-of-view-in-view.html: Added.
+
 2013-01-23  Erik Arvidsson  <[email protected]>
 
         Layout Test platform/chromium-win/fast/events/panScroll-panIcon.html is failing

Added: trunk/LayoutTests/compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt (0 => 140593)


--- trunk/LayoutTests/compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt	2013-01-23 22:24:49 UTC (rev 140593)
@@ -0,0 +1,22 @@
+Layer tree when the fixed elements are out-of-view (should be blank):
+Layer tree when the fixed elements are in-view (both fixed elements should have layers):
+(GraphicsLayer
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+      (children 2
+        (GraphicsLayer
+          (position 100.00 50.00)
+          (bounds 10.00 10.00)
+        )
+        (GraphicsLayer
+          (position 100.00 100.00)
+          (bounds 10.00 10.00)
+        )
+      )
+    )
+  )
+)
+Layer tree when the fixed elements are out-of-view again (should be blank):
+

Added: trunk/LayoutTests/compositing/layer-creation/fixed-position-change-out-of-view-in-view.html (0 => 140593)


--- trunk/LayoutTests/compositing/layer-creation/fixed-position-change-out-of-view-in-view.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/fixed-position-change-out-of-view-in-view.html	2013-01-23 22:24:49 UTC (rev 140593)
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <script type="text/_javascript_">
+    if (window.testRunner && window.internals) {
+      testRunner.dumpAsText();
+      internals.settings.setAcceleratedCompositingForFixedPositionEnabled(true);
+      internals.settings.setFixedPositionCreatesStackingContext(true);
+
+      addEventListener("load", function() {
+        document.getElementById("layerTree1").innerText = internals.layerTreeAsText(document);
+        document.getElementById("fixed1").style.top = "50px";
+        document.getElementById("fixed2").style.height = "10px";
+        document.getElementById("layerTree2").innerText = internals.layerTreeAsText(document);
+        document.getElementById("fixed1").style.top = "-100px";
+        document.getElementById("fixed2").style.height = "0px";
+        document.getElementById("layerTree3").innerText = internals.layerTreeAsText(document);
+      }, false);
+    }
+  </script>
+</head>
+
+<body>
+  Layer tree when the fixed elements are out-of-view (should be blank):
+  <pre id="layerTree1"></pre>
+  Layer tree when the fixed elements are in-view (both fixed elements should have layers):
+  <pre id="layerTree2"></pre>
+  Layer tree when the fixed elements are out-of-view again (should be blank):
+  <pre id="layerTree3"></pre>
+  <div id="fixed1" style="position: fixed; top: -100px; left: 100px; width: 10px; height: 10px"></div>
+  <div id="fixed2" style="position: fixed; top: 100px; left: 100px; width: 10px; height: 0px"></div>
+</body>
+</html>
+

Modified: trunk/Source/WebCore/ChangeLog (140592 => 140593)


--- trunk/Source/WebCore/ChangeLog	2013-01-23 22:20:08 UTC (rev 140592)
+++ trunk/Source/WebCore/ChangeLog	2013-01-23 22:24:49 UTC (rev 140593)
@@ -1,3 +1,19 @@
+2013-01-23  Xianzhu Wang  <[email protected]>
+
+        Should update compositing state when an out-of-view fixed position element becomes in-view
+        https://bugs.webkit.org/show_bug.cgi?id=107410
+
+        Reviewed by Simon Fraser.
+
+        When a non-compositing page contains some not-composited fixed position element because of bounds out-of-view, when the element changes position and RenderLayerCompositor::updateCompositingLayers() is called, the function may return early because of "if (!m_reevaluateCompositingAfterLayout && !m_compositing)" without updating the compositing layers.
+
+        Set m_reevaluateCompositingAfterLayout when a fixed position element is not composited because of bounds out-of-view.
+
+        Test: compositing/layer-creation/fixed-position-change-out-of-view-in-view.html
+
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::requiresCompositingForPosition):
+
 2013-01-23  Tony Chang  <[email protected]>
 
         Unreviewed, set svn:eol-style to CRLF on Windows .sln files.

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (140592 => 140593)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2013-01-23 22:20:08 UTC (rev 140592)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2013-01-23 22:24:49 UTC (rev 140593)
@@ -2072,6 +2072,8 @@
         if (!viewBounds.intersects(enclosingIntRect(layerBounds))) {
             if (viewportConstrainedNotCompositedReason)
                 *viewportConstrainedNotCompositedReason = RenderLayer::NotCompositedForBoundsOutOfView;
+            // Reevaluate compositing after layout because the layer bounds may change and become composited.
+            m_reevaluateCompositingAfterLayout = true;
             return false;
         }
     }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to