Title: [92873] trunk
Revision
92873
Author
[email protected]
Date
2011-08-11 12:44:45 -0700 (Thu, 11 Aug 2011)

Log Message

Support creating compositing layers for scrollable frames and iframes
https://bugs.webkit.org/show_bug.cgi?id=55257

Reviewed by James Robinson.

Source/WebCore:

When force compositing mode is turned on, iframes with overflow will
become composited (in order to enable faster scrolling).

This patch was originally by Daniel Sievers <[email protected]>.

Tests: platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer.html
       platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer.html
       platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing.html
       platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer.html
       platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing.html

* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::cacheAcceleratedCompositingFlags):
(WebCore::RenderLayerCompositor::requiresCompositingForScrollableFrame):
* rendering/RenderLayerCompositor.h:

LayoutTests:

* platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer-expected.txt: Added.
* platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer.html: Added.
* platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer-expected.txt: Added.
* platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer.html: Added.
* platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing-expected.txt: Added.
* platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing.html: Added.
* platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer-expected.txt: Added.
* platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer.html: Added.
* platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing-expected.txt: Added.
* platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing.html: Added.
* platform/chromium/compositing/force-compositing-mode/resources/subframe-big.html: Added.
* platform/chromium/compositing/force-compositing-mode/resources/subframe-small.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (92872 => 92873)


--- trunk/LayoutTests/ChangeLog	2011-08-11 19:24:50 UTC (rev 92872)
+++ trunk/LayoutTests/ChangeLog	2011-08-11 19:44:45 UTC (rev 92873)
@@ -1,3 +1,23 @@
+2011-08-10  Adrienne Walker  <[email protected]>
+
+        Support creating compositing layers for scrollable frames and iframes
+        https://bugs.webkit.org/show_bug.cgi?id=55257
+
+        Reviewed by James Robinson.
+
+        * platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer-expected.txt: Added.
+        * platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer.html: Added.
+        * platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer-expected.txt: Added.
+        * platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer.html: Added.
+        * platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing-expected.txt: Added.
+        * platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing.html: Added.
+        * platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer-expected.txt: Added.
+        * platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer.html: Added.
+        * platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing-expected.txt: Added.
+        * platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing.html: Added.
+        * platform/chromium/compositing/force-compositing-mode/resources/subframe-big.html: Added.
+        * platform/chromium/compositing/force-compositing-mode/resources/subframe-small.html: Added.
+
 2011-08-11  David Hyatt  <[email protected]>
 
         https://bugs.webkit.org/show_bug.cgi?id=66075

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer-expected.txt (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer-expected.txt	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,10 @@
+
+(GraphicsLayer
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+    )
+  )
+)
+
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer.html (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer.html	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,27 @@
+<html>
+<head>
+  <style>
+    iframe {
+      height: 150px;
+      width: 150px;
+    }
+  </style>
+  <script>
+    function doTest()
+    {
+      if (window.layoutTestController) {
+        layoutTestController.dumpAsText(false);
+        document.getElementById('layertree').innerText = layoutTestController.layerTreeAsText();
+      }
+    }
+    window.addEventListener("load", doTest, false);
+    if (window.internals)
+      internals.setForceCompositingMode(document, true);
+  </script>
+</head>
+<body>
+  <!-- this should not generate a layer and the layer tree should be empty -->
+  <iframe src=""
+  <pre id="layertree"></pre>
+</body>
+</html>
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer.html
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer-expected.txt (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer-expected.txt	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,10 @@
+
+(GraphicsLayer
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+    )
+  )
+)
+
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer.html (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer.html	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,31 @@
+<html>
+<head>
+  <style>
+    iframe {
+      height: 150px;
+      width: 150px;
+    }
+  </style>
+  <script>
+    if (window.internals)
+      internals.setForceCompositingMode(document, true);
+    function doTest()
+    {
+      if (window.layoutTestController)
+        layoutTestController.display();
+      var iframe = document.getElementById("parent-iframe");
+      iframe.contentDocument.body.setAttribute("style", "overflow:hidden");
+      iframe.contentDocument.body.offsetWidth; // See bug 41999
+      if (window.layoutTestController) {
+        layoutTestController.dumpAsText(false);
+        document.getElementById('layertree').innerText = layoutTestController.layerTreeAsText();
+      }
+    }
+    window.addEventListener("load", doTest, false);
+  </script>
+</head>
+<body>
+  <iframe id="parent-iframe" src=""
+  <pre id="layertree"></pre>
+</body>
+</html>
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer.html
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing-expected.txt (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing-expected.txt	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,57 @@
+
+(GraphicsLayer
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+      (children 1
+        (GraphicsLayer
+          (position 8.00 8.00)
+          (bounds 154.00 154.00)
+          (drawsContent 1)
+          (children 1
+            (GraphicsLayer
+              (position 2.00 2.00)
+              (children 4
+                (GraphicsLayer
+                  (bounds 135.00 135.00)
+                  (children 1
+                    (GraphicsLayer
+                      (children 1
+                        (GraphicsLayer
+                          (bounds 508.00 516.00)
+                          (children 1
+                            (GraphicsLayer
+                              (bounds 508.00 516.00)
+                              (drawsContent 1)
+                            )
+                          )
+                        )
+                      )
+                    )
+                  )
+                )
+                (GraphicsLayer
+                  (position 0.00 135.00)
+                  (bounds 135.00 15.00)
+                  (drawsContent 1)
+                )
+                (GraphicsLayer
+                  (position 135.00 0.00)
+                  (bounds 15.00 135.00)
+                  (drawsContent 1)
+                )
+                (GraphicsLayer
+                  (position 135.00 135.00)
+                  (bounds 15.00 15.00)
+                  (drawsContent 1)
+                )
+              )
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing.html (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing.html	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,32 @@
+<html>
+<head>
+  <style>
+    iframe {
+      height: 150px;
+      width: 150px;
+    }
+  </style>
+  <script>
+    if (window.internals)
+      internals.setForceCompositingMode(document, true);
+    function doTest()
+    {
+      if (window.layoutTestController)
+        layoutTestController.display();
+      var iframe = document.getElementById("parent-iframe");
+      var box = iframe.contentDocument.getElementById("box");
+      box.setAttribute("style", "height:500px;width:500px;");
+      iframe.contentDocument.body.offsetWidth; // See bug 41999
+      if (window.layoutTestController) {
+        layoutTestController.dumpAsText(false);
+        document.getElementById('layertree').innerText = layoutTestController.layerTreeAsText();
+      }
+    }
+    window.addEventListener("load", doTest, false);
+  </script>
+</head>
+<body>
+    <iframe id="parent-iframe" src=""
+    <pre id="layertree"></p>
+</body>
+</html>
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing.html
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer-expected.txt (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer-expected.txt	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,57 @@
+
+(GraphicsLayer
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+      (children 1
+        (GraphicsLayer
+          (position 8.00 8.00)
+          (bounds 154.00 154.00)
+          (drawsContent 1)
+          (children 1
+            (GraphicsLayer
+              (position 2.00 2.00)
+              (children 4
+                (GraphicsLayer
+                  (bounds 135.00 135.00)
+                  (children 1
+                    (GraphicsLayer
+                      (children 1
+                        (GraphicsLayer
+                          (bounds 508.00 516.00)
+                          (children 1
+                            (GraphicsLayer
+                              (bounds 508.00 516.00)
+                              (drawsContent 1)
+                            )
+                          )
+                        )
+                      )
+                    )
+                  )
+                )
+                (GraphicsLayer
+                  (position 0.00 135.00)
+                  (bounds 135.00 15.00)
+                  (drawsContent 1)
+                )
+                (GraphicsLayer
+                  (position 135.00 0.00)
+                  (bounds 15.00 135.00)
+                  (drawsContent 1)
+                )
+                (GraphicsLayer
+                  (position 135.00 135.00)
+                  (bounds 15.00 15.00)
+                  (drawsContent 1)
+                )
+              )
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer.html (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer.html	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,27 @@
+<html>
+<head>
+  <style>
+    iframe {
+      height: 150px;
+      width: 150px;
+    }
+  </style>
+  <script>
+    if (window.internals)
+      internals.setForceCompositingMode(document, true);
+    function doTest()
+    {
+      if (window.layoutTestController) {
+        layoutTestController.dumpAsText(false);
+        document.getElementById('layertree').innerText = layoutTestController.layerTreeAsText();
+      }
+    }
+    window.addEventListener("load", doTest, false);
+  </script>
+</head>
+<body>
+  <!-- this should generate a layer due to overflow -->
+  <iframe src=""
+  <pre id="layertree"></pre>
+</body>
+</html>
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer.html
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing-expected.txt (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing-expected.txt	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,10 @@
+
+(GraphicsLayer
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+    )
+  )
+)
+
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing.html (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing.html	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,32 @@
+<html>
+<head>
+  <style>
+    iframe {
+      height: 150px;
+      width: 150px;
+    }
+  </style>
+  <script>
+    if (window.internals)
+      internals.setForceCompositingMode(document, true);
+    function doTest()
+    {
+      if (window.layoutTestController)
+        layoutTestController.display();
+      var iframe = document.getElementById("parent-iframe");
+      var box = iframe.contentDocument.getElementById("box");
+      box.setAttribute("style", "height:50px;width:50px;");
+      iframe.contentDocument.body.offsetWidth; // See bug 41999
+      if (window.layoutTestController) {
+        layoutTestController.dumpAsText(false);
+        document.getElementById('layertree').innerText = layoutTestController.layerTreeAsText();
+      }
+    }
+    window.addEventListener("load", doTest, false);
+  </script>
+</head>
+<body>
+    <iframe id="parent-iframe" src=""
+    <pre id="layertree"></p>
+</body>
+</html>
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing.html
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/resources/subframe-big.html (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/resources/subframe-big.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/resources/subframe-big.html	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,14 @@
+<html>
+<head>
+  <style>
+    div {
+        height: 500px;
+        width: 500px;
+        background-color: blue;
+    }
+  </style>
+</head>
+<body>
+    <div id="box"></div>
+</body>
+</html>
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/resources/subframe-big.html
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/resources/subframe-small.html (0 => 92873)


--- trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/resources/subframe-small.html	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/resources/subframe-small.html	2011-08-11 19:44:45 UTC (rev 92873)
@@ -0,0 +1,14 @@
+<html>
+<head>
+  <style>
+    div {
+        height: 50px;
+        width: 50px;
+        background-color: blue;
+    }
+  </style>
+</head>
+<body>
+    <div id="box"></div>
+</body>
+</html>
Property changes on: trunk/LayoutTests/platform/chromium/compositing/force-compositing-mode/resources/subframe-small.html
___________________________________________________________________

Added: svn:eol-style

Modified: trunk/Source/WebCore/ChangeLog (92872 => 92873)


--- trunk/Source/WebCore/ChangeLog	2011-08-11 19:24:50 UTC (rev 92872)
+++ trunk/Source/WebCore/ChangeLog	2011-08-11 19:44:45 UTC (rev 92873)
@@ -1,3 +1,26 @@
+2011-08-10  Adrienne Walker  <[email protected]>
+
+        Support creating compositing layers for scrollable frames and iframes
+        https://bugs.webkit.org/show_bug.cgi?id=55257
+
+        Reviewed by James Robinson.
+
+        When force compositing mode is turned on, iframes with overflow will
+        become composited (in order to enable faster scrolling).
+
+        This patch was originally by Daniel Sievers <[email protected]>.
+
+        Tests: platform/chromium/compositing/force-compositing-mode/no-overflow-iframe-layer.html
+               platform/chromium/compositing/force-compositing-mode/overflow-hidden-iframe-layer.html
+               platform/chromium/compositing/force-compositing-mode/overflow-iframe-enter-compositing.html
+               platform/chromium/compositing/force-compositing-mode/overflow-iframe-layer.html
+               platform/chromium/compositing/force-compositing-mode/overflow-iframe-leave-compositing.html
+
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::cacheAcceleratedCompositingFlags):
+        (WebCore::RenderLayerCompositor::requiresCompositingForScrollableFrame):
+        * rendering/RenderLayerCompositor.h:
+
 2011-08-11  Yong Li  <[email protected]>
 
         https://bugs.webkit.org/show_bug.cgi?id=65944

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (92872 => 92873)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2011-08-11 19:24:50 UTC (rev 92872)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2011-08-11 19:44:45 UTC (rev 92873)
@@ -139,9 +139,10 @@
         hasAcceleratedCompositing = settings->acceleratedCompositingEnabled();
         showDebugBorders = settings->showDebugBorders();
         showRepaintCounter = settings->showRepaintCounter();
+        forceCompositingMode = settings->forceCompositingMode() && hasAcceleratedCompositing;
 
-        if (!m_renderView->document()->frame()->tree()->parent())
-            forceCompositingMode = settings->forceCompositingMode() && hasAcceleratedCompositing;
+        if (forceCompositingMode && m_renderView->document()->ownerElement())
+            forceCompositingMode = requiresCompositingForScrollableFrame();
     }
 
     // We allow the chrome to override the settings, in case the page is rendered
@@ -1358,6 +1359,15 @@
            (layer->renderer()->hasOverflowClip() || layer->renderer()->hasClip());
 }
 
+bool RenderLayerCompositor::requiresCompositingForScrollableFrame() const
+{
+    // Need this done first to determine overflow.
+    ASSERT(!m_renderView->needsLayout());
+
+    ScrollView* scrollView = m_renderView->frameView();
+    return scrollView->verticalScrollbar() || scrollView->horizontalScrollbar();
+}
+
 bool RenderLayerCompositor::requiresCompositingForTransform(RenderObject* renderer) const
 {
     if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger))

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (92872 => 92873)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2011-08-11 19:24:50 UTC (rev 92872)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2011-08-11 19:44:45 UTC (rev 92873)
@@ -270,6 +270,7 @@
     bool requiresCompositingForFrame(RenderObject*) const;
     bool requiresCompositingWhenDescendantsAreCompositing(RenderObject*) const;
     bool requiresCompositingForFullScreen(RenderObject*) const;
+    bool requiresCompositingForScrollableFrame() const;
 
     bool requiresScrollLayer(RootLayerAttachment) const;
     bool requiresHorizontalScrollbarLayer() const;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to