Title: [98627] trunk
Revision
98627
Author
[email protected]
Date
2011-10-27 13:28:40 -0700 (Thu, 27 Oct 2011)

Log Message

Source/WebCore: 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:

LayoutTests: 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.

Modified Paths

Added Paths

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);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to