Diff
Modified: trunk/LayoutTests/ChangeLog (98626 => 98627)
--- trunk/LayoutTests/ChangeLog 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/LayoutTests/ChangeLog 2011-10-27 20:28:40 UTC (rev 98627)
@@ -1,3 +1,14 @@
+2011-10-25 Vangelis Kokkevis <[email protected]>
+
+ Adding tests for fixed positioned elements getting their own composited layer.
+ https://bugs.webkit.org/show_bug.cgi?id=69796
+
+ Reviewed by Simon Fraser.
+
+
+ * compositing/geometry/fixed-position-composited-switch-expected.txt: Added.
+ * compositing/geometry/fixed-position-composited-switch.html: Added.
+
2011-10-27 John Gregg <[email protected]>
Unreviewed, more chromium baselines for new multicol tests.
Added: trunk/LayoutTests/compositing/geometry/fixed-position-composited-switch-expected.txt (0 => 98627)
--- trunk/LayoutTests/compositing/geometry/fixed-position-composited-switch-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/geometry/fixed-position-composited-switch-expected.txt 2011-10-27 20:28:40 UTC (rev 98627)
@@ -0,0 +1,20 @@
+Before (should be empty):
+
+After (should not be empty):
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (position 495.00 30.00)
+ (bounds 300.00 100.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+After (should be empty):
+
Property changes on: trunk/LayoutTests/compositing/geometry/fixed-position-composited-switch-expected.txt
___________________________________________________________________
Added: svn:eol-style
Added: trunk/LayoutTests/compositing/geometry/fixed-position-composited-switch.html (0 => 98627)
--- trunk/LayoutTests/compositing/geometry/fixed-position-composited-switch.html (rev 0)
+++ trunk/LayoutTests/compositing/geometry/fixed-position-composited-switch.html 2011-10-27 20:28:40 UTC (rev 98627)
@@ -0,0 +1,65 @@
+<!DOCTYPE>
+<html>
+<head>
+ <title>Creating composited layers for fixed position elements</title>
+
+ <style type="text/css" media="screen">
+ #tall {
+ height: 100px;
+ }
+
+ #fixed {
+ width: 300px;
+ height: 100px;
+ position: fixed;
+ top: 30px;
+ right: 5px;
+ background-color: green;
+ }
+ </style>
+ <script type="text/_javascript_" charset="utf-8">
+ if (window.internals)
+ window.internals.setEnableCompositingForFixedPosition(document, true);
+
+ function doTest()
+ {
+ var layerTreeOutput = '';
+
+ // If the fixed position element doesn't have its own stacking context then
+ // it cannot get a composited layer.
+ if (window.layoutTestController)
+ layerTreeOutput += 'Before (should be empty): \n' + layoutTestController.layerTreeAsText() + '\n';
+
+ // Adding a z-index to the fixed position element will give it a stacking context
+ // and allow it to be composited.
+ document.getElementById('fixed').style.zIndex = '1';
+
+ if (window.layoutTestController) {
+ layerTreeOutput += 'After (should not be empty): \n' + layoutTestController.layerTreeAsText();
+ document.getElementById('layertree').innerText = layerTreeOutput;
+ layoutTestController.dumpAsText();
+ }
+
+ // Adding a transform to the container will turn off compositing.
+ document.getElementById('container').style.webkitTransform = 'translateX(0)';
+ if (window.layoutTestController) {
+ layerTreeOutput += 'After (should be empty): \n' + layoutTestController.layerTreeAsText();
+ document.getElementById('layertree').innerText = layerTreeOutput;
+ layoutTestController.dumpAsText();
+ }
+
+ }
+
+ window.addEventListener("load", doTest, false);
+
+ </script>
+</head>
+<body>
+<!-- Fixed position element should get its own layer -->
+<pre id="layertree"></pre>
+<div id="tall"></div>
+<div id="container">
+ <div id="fixed"></div>
+</div>
+</body>
+</html>
Property changes on: trunk/LayoutTests/compositing/geometry/fixed-position-composited-switch.html
___________________________________________________________________
Added: svn:eol-style
Modified: trunk/Source/WebCore/ChangeLog (98626 => 98627)
--- trunk/Source/WebCore/ChangeLog 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/Source/WebCore/ChangeLog 2011-10-27 20:28:40 UTC (rev 98627)
@@ -1,3 +1,34 @@
+2011-10-25 Vangelis Kokkevis <[email protected]>
+
+ Add support for creating compositing layers for fixed position elements.
+ https://bugs.webkit.org/show_bug.cgi?id=69796
+
+ position:fixed elements will get a compositing layer if:
+ 1. Settings:acceleratedCompositingForFixedPositionEnabled() returns true,
+ 2. The element has its own stacking context (e.g. has a z-index), and
+ 3. The element's container is the RenderView (e.g. not a descendant of a transformed element)
+
+ Reviewed by Simon Fraser.
+
+
+ Test: compositing/geometry/fixed-position-composited-switch.html
+
+ * page/Settings.cpp:
+ (WebCore::Settings::Settings):
+ * page/Settings.h:
+ (WebCore::Settings::setAcceleratedCompositingForFixedPositionEnabled):
+ (WebCore::Settings::acceleratedCompositingForFixedPositionEnabled):
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::RenderLayerCompositor):
+ (WebCore::RenderLayerCompositor::updateCompositingLayers):
+ (WebCore::RenderLayerCompositor::requiresCompositingLayer):
+ (WebCore::RenderLayerCompositor::requiresCompositingForPosition):
+ * rendering/RenderLayerCompositor.h:
+ * testing/Internals.cpp:
+ (WebCore::Internals::setEnableCompositingForFixedPosition):
+ * testing/Internals.h:
+ * testing/Internals.idl:
+
2011-10-27 Arthur Hsu <[email protected]>
https://bugs.webkit.org/show_bug.cgi?id=70390
Modified: trunk/Source/WebCore/page/Settings.cpp (98626 => 98627)
--- trunk/Source/WebCore/page/Settings.cpp 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/Source/WebCore/page/Settings.cpp 2011-10-27 20:28:40 UTC (rev 98627)
@@ -180,6 +180,7 @@
, m_acceleratedCompositingForPluginsEnabled(true)
, m_acceleratedCompositingForCanvasEnabled(true)
, m_acceleratedCompositingForAnimationEnabled(true)
+ , m_acceleratedCompositingForFixedPositionEnabled(false)
, m_showDebugBorders(false)
, m_showRepaintCounter(false)
, m_experimentalNotificationsEnabled(false)
Modified: trunk/Source/WebCore/page/Settings.h (98626 => 98627)
--- trunk/Source/WebCore/page/Settings.h 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/Source/WebCore/page/Settings.h 2011-10-27 20:28:40 UTC (rev 98627)
@@ -319,6 +319,9 @@
void setAcceleratedCompositingForAnimationEnabled(bool);
bool acceleratedCompositingForAnimationEnabled() const { return m_acceleratedCompositingForAnimationEnabled; }
+ void setAcceleratedCompositingForFixedPositionEnabled(bool enabled) { m_acceleratedCompositingForFixedPositionEnabled = enabled; }
+ bool acceleratedCompositingForFixedPositionEnabled() const { return m_acceleratedCompositingForFixedPositionEnabled; }
+
void setShowDebugBorders(bool);
bool showDebugBorders() const { return m_showDebugBorders; }
@@ -563,6 +566,7 @@
bool m_acceleratedCompositingForPluginsEnabled : 1;
bool m_acceleratedCompositingForCanvasEnabled : 1;
bool m_acceleratedCompositingForAnimationEnabled : 1;
+ bool m_acceleratedCompositingForFixedPositionEnabled : 1;
bool m_showDebugBorders : 1;
bool m_showRepaintCounter : 1;
bool m_experimentalNotificationsEnabled : 1;
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (98626 => 98627)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2011-10-27 20:28:40 UTC (rev 98627)
@@ -100,6 +100,7 @@
, m_showRepaintCounter(false)
, m_compositingConsultsOverlap(true)
, m_compositingDependsOnGeometry(false)
+ , m_compositingNeedsUpdate(false)
, m_compositing(false)
, m_compositingLayersNeedRebuild(false)
, m_flushingLayers(false)
@@ -258,7 +259,7 @@
if (m_forceCompositingMode && !m_compositing)
enableCompositingMode(true);
- if (!m_compositingDependsOnGeometry && !m_compositing)
+ if (!m_compositingDependsOnGeometry && !m_compositing && !m_compositingNeedsUpdate)
return;
bool checkForHierarchyUpdate = m_compositingDependsOnGeometry;
@@ -338,6 +339,8 @@
if (!hasAcceleratedCompositing())
enableCompositingMode(false);
+
+ m_compositingNeedsUpdate = false;
}
bool RenderLayerCompositor::updateBacking(RenderLayer* layer, CompositingChangeRepaint shouldRepaint)
@@ -1319,7 +1322,8 @@
|| (canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden)
|| clipsCompositingDescendants(layer)
|| requiresCompositingForAnimation(renderer)
- || requiresCompositingForFullScreen(renderer);
+ || requiresCompositingForFullScreen(renderer)
+ || requiresCompositingForPosition(renderer, layer);
}
bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const
@@ -1504,6 +1508,33 @@
#endif
}
+bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer) const
+{
+ // position:fixed elements that create their own stacking context (e.g. have an explicit z-index,
+ // opacity, transform) can get their own composited layer. A stacking context is required otherwise
+ // z-index and clipping will be broken.
+ if (!(renderer->isPositioned() && renderer->style()->position() == FixedPosition && layer->isStackingContext()))
+ return false;
+
+ if (Settings* settings = m_renderView->document()->settings())
+ if (!settings->acceleratedCompositingForFixedPositionEnabled())
+ return false;
+
+ RenderObject* container = renderer->container();
+ // If the renderer is not hooked up yet then we have to wait until it is.
+ if (!container) {
+ m_compositingNeedsUpdate = true;
+ return false;
+ }
+
+ // Don't promote fixed position elements that are descendants of transformed elements.
+ // They will stay fixed wrt the transformed element rather than the enclosing frame.
+ if (container != m_renderView)
+ return false;
+
+ return true;
+}
+
bool RenderLayerCompositor::hasNonIdentity3DTransform(RenderObject* renderer) const
{
if (!renderer->hasTransform())
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (98626 => 98627)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2011-10-27 20:28:40 UTC (rev 98627)
@@ -282,6 +282,7 @@
bool requiresCompositingWhenDescendantsAreCompositing(RenderObject*) const;
bool requiresCompositingForFullScreen(RenderObject*) const;
bool requiresCompositingForScrollableFrame() const;
+ bool requiresCompositingForPosition(RenderObject*, const RenderLayer*) const;
bool requiresScrollLayer(RootLayerAttachment) const;
bool requiresHorizontalScrollbarLayer() const;
@@ -309,10 +310,13 @@
// FIXME: once set, this is never cleared.
mutable bool m_compositingDependsOnGeometry;
+ mutable bool m_compositingNeedsUpdate;
+
bool m_compositing;
bool m_compositingLayersNeedRebuild;
bool m_flushingLayers;
bool m_forceCompositingMode;
+ bool m_compositeForFixedPosition;
RootLayerAttachment m_rootLayerAttachment;
Modified: trunk/Source/WebCore/testing/Internals.cpp (98626 => 98627)
--- trunk/Source/WebCore/testing/Internals.cpp 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/Source/WebCore/testing/Internals.cpp 2011-10-27 20:28:40 UTC (rev 98627)
@@ -248,6 +248,16 @@
document->settings()->setForceCompositingMode(enabled);
}
+void Internals::setEnableCompositingForFixedPosition(Document* document, bool enabled, ExceptionCode& ec)
+{
+ if (!document || !document->settings()) {
+ ec = INVALID_ACCESS_ERR;
+ return;
+ }
+
+ document->settings()->setAcceleratedCompositingForFixedPositionEnabled(enabled);
+}
+
void Internals::setEnableScrollAnimator(Document* document, bool enabled, ExceptionCode& ec)
{
if (!document || !document->settings()) {
Modified: trunk/Source/WebCore/testing/Internals.h (98626 => 98627)
--- trunk/Source/WebCore/testing/Internals.h 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/Source/WebCore/testing/Internals.h 2011-10-27 20:28:40 UTC (rev 98627)
@@ -76,6 +76,7 @@
PassRefPtr<Range> markerRangeForNode(Node*, unsigned, ExceptionCode&);
void setForceCompositingMode(Document*, bool enabled, ExceptionCode&);
+ void setEnableCompositingForFixedPosition(Document*, bool enabled, ExceptionCode&);
void setEnableScrollAnimator(Document*, bool enabled, ExceptionCode&);
void setZoomAnimatorTransform(Document*, float scale, float tx, float ty, ExceptionCode&);
Modified: trunk/Source/WebCore/testing/Internals.idl (98626 => 98627)
--- trunk/Source/WebCore/testing/Internals.idl 2011-10-27 20:20:27 UTC (rev 98626)
+++ trunk/Source/WebCore/testing/Internals.idl 2011-10-27 20:28:40 UTC (rev 98627)
@@ -50,6 +50,7 @@
Range markerRangeForNode(in Node node, in unsigned long index) raises(DOMException);
void setForceCompositingMode(in Document document, in boolean enabled) raises(DOMException);
+ void setEnableCompositingForFixedPosition(in Document document, in boolean enabled) raises(DOMException);
void setEnableScrollAnimator(in Document document, in boolean enabled) raises(DOMException);
void setZoomAnimatorTransform(in Document document, in float scale, in float tx, in float ty) raises(DOMException);
float getPageScaleFactor(in Document document) raises(DOMException);