Title: [148998] trunk
Revision
148998
Author
[email protected]
Date
2013-04-23 15:01:05 -0700 (Tue, 23 Apr 2013)

Log Message

Don't create compositing layers for sticky position unless using the ScrollingCoordinator
https://bugs.webkit.org/show_bug.cgi?id=115060

Source/WebCore:

Reviewed by Tim Horton.

Creating compositing layers for sticky position elements is only useful
when we're using a ScrollingCoordinator, so don't create them if
we're not in a frame that uses a scrolling coordinator.

Tests: compositing/layer-creation/no-compositing-for-sticky.html
       platform/mac-wk2/tiled-drawing/sticky/sticky-layers.html

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

LayoutTests:

Reviewed by Tim Horton.

Tests that we create layers for sticky position when in tiled drawing mode,
and that we have no layers when not.

* compositing/layer-creation/no-compositing-for-sticky-expected.txt: Added.
* compositing/layer-creation/no-compositing-for-sticky.html: Added.
* platform/mac-wk2/tiled-drawing/sticky/sticky-layers-expected.txt: Added.
* platform/mac-wk2/tiled-drawing/sticky/sticky-layers.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (148997 => 148998)


--- trunk/LayoutTests/ChangeLog	2013-04-23 21:59:26 UTC (rev 148997)
+++ trunk/LayoutTests/ChangeLog	2013-04-23 22:01:05 UTC (rev 148998)
@@ -1,3 +1,18 @@
+2013-04-23  Simon Fraser  <[email protected]>
+
+        Don't create compositing layers for sticky position unless using the ScrollingCoordinator
+        https://bugs.webkit.org/show_bug.cgi?id=115060
+
+        Reviewed by Tim Horton.
+        
+        Tests that we create layers for sticky position when in tiled drawing mode,
+        and that we have no layers when not.
+
+        * compositing/layer-creation/no-compositing-for-sticky-expected.txt: Added.
+        * compositing/layer-creation/no-compositing-for-sticky.html: Added.
+        * platform/mac-wk2/tiled-drawing/sticky/sticky-layers-expected.txt: Added.
+        * platform/mac-wk2/tiled-drawing/sticky/sticky-layers.html: Added.
+
 2013-04-23  Christophe Dumez  <[email protected]>
 
         'length' property of DOM bindings functions returns wrong value

Added: trunk/LayoutTests/compositing/layer-creation/no-compositing-for-sticky-expected.txt (0 => 148998)


--- trunk/LayoutTests/compositing/layer-creation/no-compositing-for-sticky-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/no-compositing-for-sticky-expected.txt	2013-04-23 22:01:05 UTC (rev 148998)
@@ -0,0 +1,4 @@
+There should be no compositing layers for sticky positioned elements.
+
+Left sticky Right sticky Left % sticky Right % sticky Left and Right Left and Right %
+

Added: trunk/LayoutTests/compositing/layer-creation/no-compositing-for-sticky.html (0 => 148998)


--- trunk/LayoutTests/compositing/layer-creation/no-compositing-for-sticky.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/no-compositing-for-sticky.html	2013-04-23 22:01:05 UTC (rev 148998)
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style>
+    body {
+      width: 2000px;
+    }
+    
+    .container {
+      position: relative;
+      height: 450px;
+      width: 800px;
+      margin: 20px auto;
+      background-color: #eee;
+      border: 1px solid black;
+    }
+    
+    .left {
+      float: left;
+      width: 200px;
+      height: 100%;
+      background-color: #ddd;
+    }
+    
+    .sticky {
+      position: -webkit-sticky;
+      display: inline-block;
+      background: silver;
+      margin: 4px;
+      height: 60px;
+      width: 300px;
+    }
+    
+    .box {
+      display: none;
+      width: 100px;
+      height: 100px;
+      background-color: blue;
+    }
+  </style>
+  <script>
+    if (window.testRunner) {
+      testRunner.waitUntilDone();
+      testRunner.dumpAsText();
+    }
+
+    function doScroll()
+    {
+      window.setTimeout(function() {
+        window.scrollTo(800, 0);
+        if (window.testRunner) {
+          document.getElementById('results').innerText = window.internals.layerTreeAsText(document);
+          testRunner.notifyDone();
+        }
+      }, 10);
+    }
+    
+    window.addEventListener('load', doScroll, false);
+  </script>
+</head>
+<body>
+<p>There should be no compositing layers for sticky positioned elements.</p>
+  <div class="container">
+    <div class="left"></div>
+    <div class="horizontal sticky" style="left: 20px">Left sticky <div class="composited box"></div></div>
+    <div class="horizontal sticky" style="right: 20px">Right sticky <div class="composited box"></div></div>
+    <div class="horizontal sticky" style="left: 20%">Left % sticky <div class="composited box"></div></div>
+    <div class="horizontal sticky" style="right: 20%">Right % sticky <div class="composited box"></div></div>
+
+    <div class="horizontal sticky" style="left: 20px; right: 20px">Left and Right <div class="composited box"></div></div>
+    <div class="horizontal sticky" style="left: 20%; right: 20%">Left and Right %<div class="composited box"></div></div>
+  </div>
+<pre id="results"></pre>
+</body>
+</html>

Added: trunk/LayoutTests/platform/mac-wk2/tiled-drawing/sticky/sticky-layers-expected.txt (0 => 148998)


--- trunk/LayoutTests/platform/mac-wk2/tiled-drawing/sticky/sticky-layers-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/mac-wk2/tiled-drawing/sticky/sticky-layers-expected.txt	2013-04-23 22:01:05 UTC (rev 148998)
@@ -0,0 +1,55 @@
+Left sticky Right sticky Left % sticky Right % sticky Left and Right Left and Right %
+(GraphicsLayer
+  (bounds 2008.00 585.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 2008.00 585.00)
+      (contentsOpaque 1)
+      (drawsContent 1)
+      (backgroundColor #FFFFFF)
+      (children 1
+        (GraphicsLayer
+          (children 6
+            (GraphicsLayer
+              (position 820.00 25.00)
+              (bounds 300.00 60.00)
+              (contentsOpaque 1)
+              (drawsContent 1)
+            )
+            (GraphicsLayer
+              (position 812.00 93.00)
+              (bounds 300.00 60.00)
+              (contentsOpaque 1)
+              (drawsContent 1)
+            )
+            (GraphicsLayer
+              (position 960.00 161.00)
+              (bounds 300.00 60.00)
+              (contentsOpaque 1)
+              (drawsContent 1)
+            )
+            (GraphicsLayer
+              (position 812.00 229.00)
+              (bounds 300.00 60.00)
+              (contentsOpaque 1)
+              (drawsContent 1)
+            )
+            (GraphicsLayer
+              (position 820.00 297.00)
+              (bounds 300.00 60.00)
+              (contentsOpaque 1)
+              (drawsContent 1)
+            )
+            (GraphicsLayer
+              (position 960.00 365.00)
+              (bounds 300.00 60.00)
+              (contentsOpaque 1)
+              (drawsContent 1)
+            )
+          )
+        )
+      )
+    )
+  )
+)
+

Added: trunk/LayoutTests/platform/mac-wk2/tiled-drawing/sticky/sticky-layers.html (0 => 148998)


--- trunk/LayoutTests/platform/mac-wk2/tiled-drawing/sticky/sticky-layers.html	                        (rev 0)
+++ trunk/LayoutTests/platform/mac-wk2/tiled-drawing/sticky/sticky-layers.html	2013-04-23 22:01:05 UTC (rev 148998)
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style>
+    body {
+      width: 2000px;
+    }
+    
+    .container {
+      position: relative;
+      height: 450px;
+      width: 800px;
+      margin: 20px auto;
+      background-color: #eee;
+      border: 1px solid black;
+    }
+    
+    .left {
+      float: left;
+      width: 200px;
+      height: 100%;
+      background-color: #ddd;
+    }
+    
+    .sticky {
+      position: -webkit-sticky;
+      display: inline-block;
+      background: silver;
+      margin: 4px;
+      height: 60px;
+      width: 300px;
+    }
+    
+    .box {
+      display: none;
+      width: 100px;
+      height: 100px;
+      background-color: blue;
+    }
+  </style>
+  <script>
+    if (window.testRunner) {
+      testRunner.waitUntilDone();
+      testRunner.dumpAsText();
+    }
+
+    function doScroll()
+    {
+      window.setTimeout(function() {
+        window.scrollTo(800, 0);
+        if (window.testRunner) {
+          document.getElementById('results').innerText = window.internals.layerTreeAsText(document);
+          testRunner.notifyDone();
+        }
+      }, 10);
+    }
+    
+    window.addEventListener('load', doScroll, false);
+  </script>
+</head>
+<body>
+  <div class="container">
+    <div class="left"></div>
+    <div class="horizontal sticky" style="left: 20px">Left sticky <div class="composited box"></div></div>
+    <div class="horizontal sticky" style="right: 20px">Right sticky <div class="composited box"></div></div>
+    <div class="horizontal sticky" style="left: 20%">Left % sticky <div class="composited box"></div></div>
+    <div class="horizontal sticky" style="right: 20%">Right % sticky <div class="composited box"></div></div>
+
+    <div class="horizontal sticky" style="left: 20px; right: 20px">Left and Right <div class="composited box"></div></div>
+    <div class="horizontal sticky" style="left: 20%; right: 20%">Left and Right %<div class="composited box"></div></div>
+  </div>
+<pre id="results"></pre>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (148997 => 148998)


--- trunk/Source/WebCore/ChangeLog	2013-04-23 21:59:26 UTC (rev 148997)
+++ trunk/Source/WebCore/ChangeLog	2013-04-23 22:01:05 UTC (rev 148998)
@@ -1,3 +1,20 @@
+2013-04-23  Simon Fraser  <[email protected]>
+
+        Don't create compositing layers for sticky position unless using the ScrollingCoordinator
+        https://bugs.webkit.org/show_bug.cgi?id=115060
+
+        Reviewed by Tim Horton.
+        
+        Creating compositing layers for sticky position elements is only useful
+        when we're using a ScrollingCoordinator, so don't create them if
+        we're not in a frame that uses a scrolling coordinator.
+
+        Tests: compositing/layer-creation/no-compositing-for-sticky.html
+               platform/mac-wk2/tiled-drawing/sticky/sticky-layers.html
+
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::requiresCompositingForPosition):
+
 2013-04-23  Christophe Dumez  <[email protected]>
 
         'length' property of DOM bindings functions returns wrong value

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (148997 => 148998)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2013-04-23 21:59:26 UTC (rev 148997)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2013-04-23 22:01:05 UTC (rev 148998)
@@ -1257,6 +1257,12 @@
     }
 }
 
+bool RenderLayerCompositor::hasCoordinatedScrolling() const
+{
+    ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator();
+    return scrollingCoordinator && scrollingCoordinator->coordinatesScrollingForFrameView(m_renderView->frameView());
+}
+
 void RenderLayerCompositor::frameViewDidScroll()
 {
     FrameView* frameView = m_renderView->frameView();
@@ -1267,11 +1273,12 @@
 
     // If there's a scrolling coordinator that manages scrolling for this frame view,
     // it will also manage updating the scroll layer position.
-    if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) {
-        if (scrollingCoordinator->coordinatesScrollingForFrameView(frameView))
-            return;
-        if (Settings* settings = m_renderView->document()->settings()) {
-            if (settings->compositedScrollingForFramesEnabled())
+    if (hasCoordinatedScrolling())
+        return;
+
+    if (Settings* settings = m_renderView->document()->settings()) {
+        if (settings->compositedScrollingForFramesEnabled()) {
+            if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
                 scrollingCoordinator->scrollableAreaScrollLayerDidChange(frameView);
         }
     }
@@ -2187,7 +2194,7 @@
     }
 
     if (isSticky)
-        return true;
+        return hasCoordinatedScrolling();
 
     RenderObject* container = renderer->container();
     // If the renderer is not hooked up yet then we have to wait until it is.
@@ -2381,38 +2388,38 @@
     return true;
 }
 
-static bool shouldCompositeOverflowControls(FrameView* view)
+bool RenderLayerCompositor::shouldCompositeOverflowControls() const
 {
+    FrameView* view = m_renderView->frameView();
+
     if (view->platformWidget())
         return false;
 
-    if (Page* page = view->frame()->page()) {
-        if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
-            if (scrollingCoordinator->coordinatesScrollingForFrameView(view))
-                return true;
-    }
+    if (hasCoordinatedScrolling())
+        return true;
 
     if (!view->hasOverlayScrollbars())
         return false;
+
     return true;
 }
 
 bool RenderLayerCompositor::requiresHorizontalScrollbarLayer() const
 {
     FrameView* view = m_renderView->frameView();
-    return shouldCompositeOverflowControls(view) && view->horizontalScrollbar();
+    return shouldCompositeOverflowControls() && view->horizontalScrollbar();
 }
 
 bool RenderLayerCompositor::requiresVerticalScrollbarLayer() const
 {
     FrameView* view = m_renderView->frameView();
-    return shouldCompositeOverflowControls(view) && view->verticalScrollbar();
+    return shouldCompositeOverflowControls() && view->verticalScrollbar();
 }
 
 bool RenderLayerCompositor::requiresScrollCornerLayer() const
 {
     FrameView* view = m_renderView->frameView();
-    return shouldCompositeOverflowControls(view) && view->isScrollCornerVisible();
+    return shouldCompositeOverflowControls() && view->isScrollCornerVisible();
 }
 
 #if ENABLE(RUBBER_BANDING)

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (148997 => 148998)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2013-04-23 21:59:26 UTC (rev 148997)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2013-04-23 22:01:05 UTC (rev 148998)
@@ -377,6 +377,9 @@
     bool requiresContentShadowLayer() const;
 #endif
 
+    bool hasCoordinatedScrolling() const;
+    bool shouldCompositeOverflowControls() const;
+
     void scheduleLayerFlushNow();
     bool isThrottlingLayerFlushes() const;
     void startLayerFlushTimerIfNeeded();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to