- 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();