[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

simon.fraser at apple.com simon.fraser at apple.com
Wed Dec 22 11:14:24 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit cc875e459a1ef8dcfe98a2b18ff1cb2a7043842a
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Jul 15 20:08:41 2010 +0000

    2010-07-15  Simon Fraser  <simon.fraser at apple.com>
    
            Reviewed by Dan Bernstein.
    
            Avoid creating huge compositing layers for elements that project outside the viewport
            https://bugs.webkit.org/show_bug.cgi?id=42338
    
            The logic that computed the bounds of compositing layers naively used the
            union of the bounds of descendant, non-composited RenderLayers, without regard
            to what is actually visible. This could result in huge layers for page with
            elements are large negative offsets, or with large negative text-indent (both
            common).
    
            For elements without transforms on them or in their ancestor chain, and when
            no 3d transforms or hardware-accelerated animations are used, can clip compositing
            layers to the size of the document, or based on CSS overflow and clip.
    
            Tests: compositing/geometry/limit-layer-bounds-clipping-ancestor.html
                   compositing/geometry/limit-layer-bounds-fixed-positioned.html
                   compositing/geometry/limit-layer-bounds-overflow-repaint.html
                   compositing/geometry/limit-layer-bounds-positioned-transition.html
                   compositing/geometry/limit-layer-bounds-positioned.html
                   compositing/geometry/limit-layer-bounds-transformed-overflow.html
                   compositing/geometry/limit-layer-bounds-transformed.html
    
            * rendering/RenderLayerBacking.cpp:
            (WebCore::enclosingOverflowClipAncestor):  Walk up the RenderLayer tree
            looking for an ancestor that has overflow, or to the root. Along the way, check for
            transformed elements.
            (WebCore::RenderLayerBacking::updateCompositedBounds):  If we're in "consult
            overlap" mode, and we don't have transforms, then constrain the bounds
            of composited layers by the RenderView's layoutOverflowRect(), or by the
            enclosing layer with overflow.
            (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry): If the offset from the renderer changes,
            we need to repaint the layer.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@63452 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 15db718..92ec98d 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,30 @@
+2010-07-15  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        Avoid creating huge compositing layers for elements that project outside the viewport
+        https://bugs.webkit.org/show_bug.cgi?id=42338
+        
+        Tests for constraining the size of compositing layers to the layout bounds, or the enclosing
+        overflow ancestor.
+
+        * compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt: Added.
+        * compositing/geometry/limit-layer-bounds-clipping-ancestor.html: Added.
+        * compositing/geometry/limit-layer-bounds-fixed-positioned-expected.txt: Added.
+        * compositing/geometry/limit-layer-bounds-fixed-positioned.html: Added.
+        * compositing/geometry/limit-layer-bounds-overflow-repaint.html: Added.
+        * compositing/geometry/limit-layer-bounds-positioned-expected.txt: Added.
+        * compositing/geometry/limit-layer-bounds-positioned-transition-expected.txt: Added.
+        * compositing/geometry/limit-layer-bounds-positioned-transition.html: Added.
+        * compositing/geometry/limit-layer-bounds-positioned.html: Added.
+        * compositing/geometry/limit-layer-bounds-transformed-expected.txt: Added.
+        * compositing/geometry/limit-layer-bounds-transformed-overflow-expected.txt: Added.
+        * compositing/geometry/limit-layer-bounds-transformed-overflow.html: Added.
+        * compositing/geometry/limit-layer-bounds-transformed.html: Added.
+        * platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.checksum: Added.
+        * platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.png: Added.
+        * platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.txt: Added.
+
 2010-07-15  Alex Nicolaou  <anicolao at chromium.org>
 
         Reviewed by Dirk Schulze.
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt b/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt
new file mode 100644
index 0000000..5af82d4
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt
@@ -0,0 +1,244 @@
+
+top
+
+middlebottom
+top
+
+middlebottom
+(GraphicsLayer
+  (position 0.00 0.00)
+  (anchor 0.50 0.50)
+  (bounds 785.00 2618.00)
+  (opacity 1.00)
+  (usingTiledLayer 0)
+  (preserves3D 0)
+  (drawsContent 0)
+  (backfaceVisibility visible)
+  (backgroundColor none)
+  (transform identity)
+  (children 1
+    (GraphicsLayer
+      (position 0.00 0.00)
+      (anchor 0.50 0.50)
+      (bounds 785.00 2618.00)
+      (opacity 1.00)
+      (usingTiledLayer 0)
+      (preserves3D 0)
+      (drawsContent 0)
+      (backfaceVisibility visible)
+      (backgroundColor none)
+      (transform identity)
+      (childrenTransform identity)
+      (children 9
+        (GraphicsLayer
+          (position 21.00 21.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 18.00 10.00)
+          (anchor 0.50 0.50)
+          (bounds 220.00 220.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 28.00 20.00)
+          (anchor 0.50 0.50)
+          (bounds 200.00 200.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 0)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position 0.00 0.00)
+              (anchor 0.50 0.50)
+              (bounds 110.00 200.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+        (GraphicsLayer
+          (position 28.00 20.00)
+          (anchor 0.50 0.50)
+          (bounds 200.00 200.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 0)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position 5.00 145.00)
+              (anchor 0.50 0.50)
+              (bounds 68.00 28.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+        (GraphicsLayer
+          (position 28.00 20.00)
+          (anchor 0.50 0.50)
+          (bounds 200.00 200.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 0)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position 5.00 2058.00)
+              (anchor 0.50 0.50)
+              (bounds 0.00 0.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+        (GraphicsLayer
+          (position 18.00 240.00)
+          (anchor 0.50 0.50)
+          (bounds 220.00 220.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 28.00 250.00)
+          (anchor 0.50 0.50)
+          (bounds 185.00 200.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 0)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position 0.00 -100.00)
+              (anchor 0.50 0.50)
+              (bounds 110.00 2200.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+        (GraphicsLayer
+          (position 28.00 250.00)
+          (anchor 0.50 0.50)
+          (bounds 185.00 200.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 0)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position 5.00 145.00)
+              (anchor 0.50 0.50)
+              (bounds 68.00 28.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+        (GraphicsLayer
+          (position 28.00 250.00)
+          (anchor 0.50 0.50)
+          (bounds 185.00 200.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 0)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position 5.00 2058.00)
+              (anchor 0.50 0.50)
+              (bounds 69.00 28.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor.html b/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor.html
new file mode 100644
index 0000000..2619a5e
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+
+<html lang="en">
+<head>
+  <style type="text/css" media="screen">
+    body {
+      height: 2600px;
+    }
+    
+    .container {
+      width: 200px;
+      height: 200px;
+      margin: 10px;
+      overflow: auto;
+      border: 10px solid black;
+    }
+    
+    .inner {
+      width: 100px;
+      height: 2200px;
+      padding: 5px;
+      font-size: 18pt;
+      background-color: green;
+    }
+    
+    embed {
+      position: absolute;
+      top: 21px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+    }
+    
+    p.middle {
+      position: absolute;
+      top: 10%;
+    }
+
+    p.bottom {
+      position: absolute;
+      bottom: 0;
+    }
+  </style>
+  <script type="text/javascript" charset="utf-8">
+    if (window.layoutTestController) {
+      layoutTestController.dumpAsText();
+      layoutTestController.waitUntilDone();
+    }
+
+    function doTest()
+    {
+      var scrollables = document.querySelectorAll('.container');
+      for (var i = 0; i < scrollables.length; ++i)
+        scrollables[i].scrollTop = 100;
+
+      if (window.layoutTestController) {
+        document.getElementById('layers').innerText = layoutTestController.layerTreeAsText();
+        layoutTestController.notifyDone();
+      }
+    }
+
+    window.addEventListener('load', doTest, false);
+  </script>
+</head>
+
+<body>
+  
+  <!-- Go into compositing without transforms. -->
+  <embed type="application/x-webkit-test-netscape" drawingmodel="coreanimation">
+
+  <!-- "middle" text should be visible -->
+  <div class="container" style="position: relative; overflow: hidden;">
+    <div class="inner" style="position: relative;">
+      <p class="top">top</p>
+      <p class="middle">middle</p>
+      <p class="bottom">bottom</p>
+    </div>
+  </div>
+
+  <!-- Vertical scrollbar should be visible -->
+  <!-- "middle" text should be visible -->
+  <!-- "inner" should use a tiled layer -->
+  <div class="container" style="position: relative;">
+    <div class="inner" style="position: relative;">
+      <p class="top">top</p>
+      <p class="middle">middle</p>
+      <p class="bottom">bottom</p>
+    </div>
+  </div>
+
+  <pre id="layers">Layer tree goes here in DRT</pre>
+
+</body>
+</html>
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-fixed-positioned-expected.txt b/LayoutTests/compositing/geometry/limit-layer-bounds-fixed-positioned-expected.txt
new file mode 100644
index 0000000..a4716b8
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-fixed-positioned-expected.txt
@@ -0,0 +1,86 @@
+
+Text here
+(GraphicsLayer
+  (position 0.00 0.00)
+  (anchor 0.50 0.50)
+  (bounds 785.00 1021.00)
+  (opacity 1.00)
+  (usingTiledLayer 0)
+  (preserves3D 0)
+  (drawsContent 0)
+  (backfaceVisibility visible)
+  (backgroundColor none)
+  (transform identity)
+  (children 1
+    (GraphicsLayer
+      (position 0.00 0.00)
+      (anchor 0.50 0.50)
+      (bounds 785.00 1021.00)
+      (opacity 1.00)
+      (usingTiledLayer 0)
+      (preserves3D 0)
+      (drawsContent 0)
+      (backfaceVisibility visible)
+      (backgroundColor none)
+      (transform identity)
+      (childrenTransform identity)
+      (children 3
+        (GraphicsLayer
+          (position 29.00 134.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 29.00 134.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 8.00 113.00)
+          (anchor 0.50 0.50)
+          (bounds 142.00 142.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position -8.00 21.00)
+              (anchor 0.50 0.50)
+              (bounds 129.00 100.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-fixed-positioned.html b/LayoutTests/compositing/geometry/limit-layer-bounds-fixed-positioned.html
new file mode 100644
index 0000000..e1741ec
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-fixed-positioned.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style type="text/css" media="screen">
+    body {
+      position: relative;
+      height: 1000px;
+    }
+    .container {
+      position: fixed;
+      width: 100px;
+      height: 100px;
+      padding: 20px;
+      z-index: 0;
+      border: 1px solid black;
+    }
+    
+    embed {
+      position: absolute;
+      top: 121px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+    }
+    
+    .far-left {
+      position: relative;
+      left: -1000px;
+      width: 1100px;
+      height: 100px;
+      background-color: green;
+    }
+    
+    .indicator {
+      position: absolute;
+      top: 121px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+      background-color: red;
+    }
+  </style>
+  <script type="text/javascript" charset="utf-8">
+    if (window.layoutTestController) {
+      layoutTestController.dumpAsText();
+      layoutTestController.waitUntilDone();
+    }
+
+    function doTest()
+    {
+      window.scrollBy(0, 100);
+
+      if (window.layoutTestController) {
+        document.getElementById('layers').innerText = layoutTestController.layerTreeAsText();
+        layoutTestController.notifyDone();
+      }
+    }
+
+    window.addEventListener('load', doTest, false);
+  </script>
+</head>
+
+<body>
+  
+  <!-- Go into compositing without transforms. -->
+  <embed type="application/x-webkit-test-netscape" drawingmodel="coreanimation">
+
+  <div class="indicator"></div>
+
+  <!-- Test clipping to viewport with some intermediate layers. -->
+  <!-- Green box should extend to the left edge. No red visible. -->
+  <div class="container">
+    <div class="far-left">
+      Text here
+    </div>
+  </div>
+  <pre id="layers">Layer tree goes here in DRT</pre>
+</body>
+</html>
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-overflow-repaint.html b/LayoutTests/compositing/geometry/limit-layer-bounds-overflow-repaint.html
new file mode 100644
index 0000000..83a5c8f
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-overflow-repaint.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+
+<html lang="en">
+<head>
+  <style type="text/css" media="screen">
+    .container {
+      display: inline-block;
+      width: 200px; 
+      height: 200px; 
+      overflow: hidden;
+      margin: 10px;
+      border: 1px solid black;
+    }
+    
+    .inner {
+      width: 100%;
+      height: 1000px;
+      background-color: blue;
+    }
+    
+    embed {
+      position: absolute;
+      top: 20px;
+      left: 20px;
+      width: 100px;
+      height: 100px;
+    }
+    
+    .top {
+      height: 50%;
+      width: 100%;
+      background-color: red;
+    }
+
+    .bottom {
+      height: 50%;
+      width: 100%;
+      background-color: green;
+    }
+  </style>
+  <script type="text/javascript" charset="utf-8">
+    if (window.layoutTestController)
+      layoutTestController.waitUntilDone();
+
+    function doTest()
+    {
+      window.setTimeout(function() {
+        var scrollables = document.querySelectorAll('.container');
+        for (var i = 0; i < scrollables.length; ++i)
+          scrollables[i].scrollTop = 500;
+
+        if (window.layoutTestController)
+          layoutTestController.notifyDone();
+
+      }, 0);
+    }
+
+    window.addEventListener('load', doTest, false);
+  </script>
+</head>
+
+<body>
+  
+  <!-- Go into compositing without transforms. -->
+  <embed type="application/x-webkit-test-netscape" drawingmodel="coreanimation">
+
+  <!-- Test repainting when the graphicsLayer offsetFromRenderer changes -->
+  <!-- You should see one green square, and no red -->
+  <div class="container" style="position: relative;">
+    <div class="inner" style="position: relative;">
+      <div class="top"></div>
+      <div class="bottom"></div>
+    </div>
+  </div>
+
+</body>
+</html>
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-expected.txt b/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-expected.txt
new file mode 100644
index 0000000..5bcf91f
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-expected.txt
@@ -0,0 +1,86 @@
+
+Text here
+(GraphicsLayer
+  (position 0.00 0.00)
+  (anchor 0.50 0.50)
+  (bounds 800.00 600.00)
+  (opacity 1.00)
+  (usingTiledLayer 0)
+  (preserves3D 0)
+  (drawsContent 0)
+  (backfaceVisibility visible)
+  (backgroundColor none)
+  (transform identity)
+  (children 1
+    (GraphicsLayer
+      (position 0.00 0.00)
+      (anchor 0.50 0.50)
+      (bounds 800.00 600.00)
+      (opacity 1.00)
+      (usingTiledLayer 0)
+      (preserves3D 0)
+      (drawsContent 0)
+      (backfaceVisibility visible)
+      (backgroundColor none)
+      (transform identity)
+      (childrenTransform identity)
+      (children 3
+        (GraphicsLayer
+          (position 29.00 29.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 29.00 29.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 8.00 8.00)
+          (anchor 0.50 0.50)
+          (bounds 142.00 142.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position -8.00 21.00)
+              (anchor 0.50 0.50)
+              (bounds 129.00 100.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-transition-expected.txt b/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-transition-expected.txt
new file mode 100644
index 0000000..80708e2
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-transition-expected.txt
@@ -0,0 +1,86 @@
+
+Text here
+(GraphicsLayer
+  (position 0.00 0.00)
+  (anchor 0.50 0.50)
+  (bounds 800.00 600.00)
+  (opacity 1.00)
+  (usingTiledLayer 0)
+  (preserves3D 0)
+  (drawsContent 0)
+  (backfaceVisibility visible)
+  (backgroundColor none)
+  (transform identity)
+  (children 1
+    (GraphicsLayer
+      (position 0.00 0.00)
+      (anchor 0.50 0.50)
+      (bounds 800.00 600.00)
+      (opacity 1.00)
+      (usingTiledLayer 0)
+      (preserves3D 0)
+      (drawsContent 0)
+      (backfaceVisibility visible)
+      (backgroundColor none)
+      (transform identity)
+      (childrenTransform identity)
+      (children 3
+        (GraphicsLayer
+          (position 29.00 29.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 29.00 29.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 8.00 8.00)
+          (anchor 0.50 0.50)
+          (bounds 142.00 142.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position -979.00 21.00)
+              (anchor 0.50 0.50)
+              (bounds 1200.00 100.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [200.00 0.00 0.00 1.00])
+              (childrenTransform identity)
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-transition.html b/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-transition.html
new file mode 100644
index 0000000..3356b8b
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-positioned-transition.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style type="text/css" media="screen">
+    body {
+      position: relative;
+    }
+    .container {
+      position: relative;
+      width: 100px;
+      height: 100px;
+      padding: 20px;
+      z-index: 0;
+      border: 1px solid black;
+    }
+    
+    embed {
+      position: absolute;
+      top: 21px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+    }
+    
+    #far-left {
+      position: relative;
+      left: -1000px;
+      width: 1200px;
+      height: 100px;
+      background-color: green;
+    }
+    
+    #far-left.moved {
+      -webkit-transform: translateX(200px);
+    }
+    
+    .indicator {
+      position: absolute;
+      top: 21px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+      background-color: red;
+    }
+  </style>
+  <script type="text/javascript" charset="utf-8">
+    if (window.layoutTestController) {
+      layoutTestController.dumpAsText();
+      layoutTestController.waitUntilDone();
+    }
+
+    function doTest()
+    {
+      document.getElementById('far-left').className = 'moved';
+      if (window.layoutTestController) {
+        document.getElementById('layers').innerText = layoutTestController.layerTreeAsText();
+        layoutTestController.notifyDone();
+      }
+    }
+
+    window.addEventListener('load', doTest, false);
+  </script>
+</head>
+
+<body>
+  
+  <!-- Go into compositing without transforms. -->
+  <embed type="application/x-webkit-test-netscape" drawingmodel="coreanimation">
+
+  <div class="indicator"></div>
+
+  <!-- Test that layers get updated on the addition of a transform -->
+  <!-- The green layer should extend to the left edge of the page -->
+  <div class="container">
+    <div id="far-left">
+      Text here
+    </div>
+  </div>
+  <pre id="layers">Layer tree goes here in DRT</pre>
+</body>
+</html>
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-positioned.html b/LayoutTests/compositing/geometry/limit-layer-bounds-positioned.html
new file mode 100644
index 0000000..f60f5a8
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-positioned.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style type="text/css" media="screen">
+    body {
+      position: relative;
+    }
+    .container {
+      position: relative;
+      width: 100px;
+      height: 100px;
+      padding: 20px;
+      z-index: 0;
+      border: 1px solid black;
+    }
+    
+    embed {
+      position: absolute;
+      top: 21px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+    }
+    
+    .far-left {
+      position: relative;
+      text-indent: -10000px;
+      width: 100px;
+      height: 100px;
+      background-color: green;
+    }
+    
+    .indicator {
+      position: absolute;
+      top: 21px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+      background-color: red;
+    }
+  </style>
+  <script type="text/javascript" charset="utf-8">
+    if (window.layoutTestController) {
+      layoutTestController.dumpAsText();
+      layoutTestController.waitUntilDone();
+    }
+
+    function doTest()
+    {
+      if (window.layoutTestController) {
+        document.getElementById('layers').innerText = layoutTestController.layerTreeAsText();
+        layoutTestController.notifyDone();
+      }
+    }
+
+    window.addEventListener('load', doTest, false);
+  </script>
+</head>
+
+<body>
+  
+  <!-- Go into compositing without transforms. -->
+  <embed type="application/x-webkit-test-netscape" drawingmodel="coreanimation">
+
+  <div class="indicator"></div>
+
+  <!-- Test clipping to viewport with some intermediate layers. -->
+  <div class="container">
+    <div class="far-left">
+      Text here
+    </div>
+  </div>
+  <pre id="layers">Layer tree goes here in DRT</pre>
+</body>
+</html>
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-expected.txt b/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-expected.txt
new file mode 100644
index 0000000..a530746
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-expected.txt
@@ -0,0 +1,86 @@
+
+Text here
+(GraphicsLayer
+  (position 0.00 0.00)
+  (anchor 0.50 0.50)
+  (bounds 800.00 600.00)
+  (opacity 1.00)
+  (usingTiledLayer 0)
+  (preserves3D 0)
+  (drawsContent 0)
+  (backfaceVisibility visible)
+  (backgroundColor none)
+  (transform identity)
+  (children 1
+    (GraphicsLayer
+      (position 0.00 0.00)
+      (anchor 0.50 0.50)
+      (bounds 800.00 600.00)
+      (opacity 1.00)
+      (usingTiledLayer 0)
+      (preserves3D 0)
+      (drawsContent 0)
+      (backfaceVisibility visible)
+      (backgroundColor none)
+      (transform identity)
+      (childrenTransform identity)
+      (children 3
+        (GraphicsLayer
+          (position 129.00 29.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 129.00 29.00)
+          (anchor 0.50 0.50)
+          (bounds 200.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 8.00 8.00)
+          (anchor 0.50 0.50)
+          (bounds 242.00 142.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [100.00 0.00 0.00 1.00])
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position -979.00 21.00)
+              (anchor 0.50 0.50)
+              (bounds 1200.00 100.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 1)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-overflow-expected.txt b/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-overflow-expected.txt
new file mode 100644
index 0000000..b847213
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-overflow-expected.txt
@@ -0,0 +1,114 @@
+
+middle
+(GraphicsLayer
+  (position 0.00 0.00)
+  (anchor 0.50 0.50)
+  (bounds 800.00 600.00)
+  (opacity 1.00)
+  (usingTiledLayer 0)
+  (preserves3D 0)
+  (drawsContent 0)
+  (backfaceVisibility visible)
+  (backgroundColor none)
+  (transform identity)
+  (children 1
+    (GraphicsLayer
+      (position 0.00 0.00)
+      (anchor 0.50 0.50)
+      (bounds 800.00 600.00)
+      (opacity 1.00)
+      (usingTiledLayer 0)
+      (preserves3D 0)
+      (drawsContent 0)
+      (backfaceVisibility visible)
+      (backgroundColor none)
+      (transform identity)
+      (childrenTransform identity)
+      (children 3
+        (GraphicsLayer
+          (position 129.00 29.00)
+          (anchor 0.50 0.50)
+          (bounds 100.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 129.00 29.00)
+          (anchor 0.50 0.50)
+          (bounds 200.00 100.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform identity)
+          (childrenTransform identity)
+        )
+        (GraphicsLayer
+          (position 8.00 8.00)
+          (anchor 0.50 0.50)
+          (bounds 242.00 162.00)
+          (opacity 1.00)
+          (usingTiledLayer 0)
+          (preserves3D 0)
+          (drawsContent 1)
+          (backfaceVisibility visible)
+          (backgroundColor none)
+          (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [100.00 0.00 0.00 1.00])
+          (childrenTransform identity)
+          (children 1
+            (GraphicsLayer
+              (position 1.00 1.00)
+              (anchor 0.50 0.50)
+              (bounds 240.00 145.00)
+              (opacity 1.00)
+              (usingTiledLayer 0)
+              (preserves3D 0)
+              (drawsContent 0)
+              (backfaceVisibility visible)
+              (backgroundColor none)
+              (transform identity)
+              (childrenTransform identity)
+              (children 2
+                (GraphicsLayer
+                  (position -1.00 20.00)
+                  (anchor 0.50 0.50)
+                  (bounds 1070.00 100.00)
+                  (opacity 1.00)
+                  (usingTiledLayer 0)
+                  (preserves3D 0)
+                  (drawsContent 1)
+                  (backfaceVisibility visible)
+                  (backgroundColor none)
+                  (transform identity)
+                  (childrenTransform identity)
+                )
+                (GraphicsLayer
+                  (position 45.00 36.00)
+                  (anchor 0.50 0.50)
+                  (bounds 43.00 18.00)
+                  (opacity 1.00)
+                  (usingTiledLayer 0)
+                  (preserves3D 0)
+                  (drawsContent 1)
+                  (backfaceVisibility visible)
+                  (backgroundColor none)
+                  (transform identity)
+                  (childrenTransform identity)
+                )
+              )
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-overflow.html b/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-overflow.html
new file mode 100644
index 0000000..18df245
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-transformed-overflow.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style type="text/css" media="screen">
+    body {
+      position: relative;
+    }
+    .container {
+      position: relative;
+      width: 200px;
+      height: 120px;
+      padding: 20px;
+      overflow-x: scroll;
+      border: 1px solid black;
+      -webkit-transform: translate(100px, 0);
+    }
+    
+    embed {
+      position: absolute;
+      top: 21px;
+      left: 121px;
+      width: 100px;
+      height: 100px;
+    }
+    
+    .far-left {
+      position: relative;
+      left: -1000px;
+      width: 2050px;
+      height: 100px;
+      background-color: green;
+    }
+    
+    p.middle {
+      position: absolute;
+      left: 50%;
+    }
+
+    .indicator {
+      position: absolute;
+      top: 21px;
+      left: 121px;
+      width: 200px;
+      height: 100px;
+      background-color: red;
+    }
+  </style>
+  <script type="text/javascript" charset="utf-8">
+    if (window.layoutTestController) {
+      layoutTestController.dumpAsText();
+      layoutTestController.waitUntilDone();
+    }
+
+    function doTest()
+    {
+      if (window.layoutTestController) {
+        document.getElementById('layers').innerText = layoutTestController.layerTreeAsText();
+        layoutTestController.notifyDone();
+      }
+    }
+
+    window.addEventListener('load', doTest, false);
+  </script>
+</head>
+
+<body>
+  
+  <!-- Go into compositing without transforms. -->
+  <embed type="application/x-webkit-test-netscape" drawingmodel="coreanimation">
+
+  <div class="indicator"></div>
+
+  <!-- Test clipping to viewport with some intermediate layers. -->
+  <!-- Green box should extend to the left edge. No red visible. "middle" should be visible -->
+  <div class="container">
+    <div class="far-left">
+      <p class="middle">middle</p>
+    </div>
+  </div>
+  <pre id="layers">Layer tree goes here in DRT</pre>
+</body>
+</html>
+
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-transformed.html b/LayoutTests/compositing/geometry/limit-layer-bounds-transformed.html
new file mode 100644
index 0000000..cf3bf7f
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-transformed.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style type="text/css" media="screen">
+    body {
+      position: relative;
+    }
+    .container {
+      position: relative;
+      width: 200px;
+      height: 100px;
+      padding: 20px;
+      z-index: 0;
+      border: 1px solid black;
+      -webkit-transform: translate(100px, 0);
+    }
+    
+    embed {
+      position: absolute;
+      top: 21px;
+      left: 121px;
+      width: 100px;
+      height: 100px;
+    }
+    
+    .far-left {
+      position: relative;
+      left: -1000px;
+      width: 1200px;
+      height: 100px;
+      background-color: green;
+    }
+    
+    .indicator {
+      position: absolute;
+      top: 21px;
+      left: 121px;
+      width: 200px;
+      height: 100px;
+      background-color: red;
+    }
+  </style>
+  <script type="text/javascript" charset="utf-8">
+    if (window.layoutTestController) {
+      layoutTestController.dumpAsText();
+      layoutTestController.waitUntilDone();
+    }
+
+    function doTest()
+    {
+      if (window.layoutTestController) {
+        document.getElementById('layers').innerText = layoutTestController.layerTreeAsText();
+        layoutTestController.notifyDone();
+      }
+    }
+
+    window.addEventListener('load', doTest, false);
+  </script>
+</head>
+
+<body>
+  
+  <!-- Go into compositing without transforms. -->
+  <embed type="application/x-webkit-test-netscape" drawingmodel="coreanimation">
+
+  <div class="indicator"></div>
+
+  <!-- Test clipping to viewport with some intermediate layers. -->
+  <!-- Green box should extend to the left edge. No red visible. -->
+  <div class="container">
+    <div class="far-left">
+      Text here
+    </div>
+  </div>
+  
+  <pre id="layers">Layer tree goes here in DRT</pre>
+</body>
+</html>
+
diff --git a/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.checksum b/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.checksum
new file mode 100644
index 0000000..8728872
--- /dev/null
+++ b/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.checksum
@@ -0,0 +1 @@
+be7d71a5262076cc7d54d08da168a57b
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.png b/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.png
new file mode 100644
index 0000000..0701ed9
Binary files /dev/null and b/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.png differ
diff --git a/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.txt b/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.txt
new file mode 100644
index 0000000..5c7e340
--- /dev/null
+++ b/LayoutTests/platform/mac/compositing/geometry/limit-layer-bounds-overflow-repaint-expected.txt
@@ -0,0 +1,14 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x242
+  RenderBlock {HTML} at (0,0) size 800x242
+    RenderBody {BODY} at (8,8) size 784x226
+      RenderText {#text} at (0,0) size 0x0
+layer at (20,20) size 100x100
+  RenderEmbeddedObject {EMBED} at (20,20) size 100x100
+layer at (18,18) size 202x202 clip at (19,19) size 200x200 scrollY 500 scrollHeight 1000
+  RenderBlock (relative positioned) {DIV} at (10,10) size 202x202 [border: (1px solid #000000)]
+layer at (19,-481) size 200x1000 backgroundClip at (19,19) size 200x200 clip at (19,19) size 200x200 outlineClip at (19,19) size 200x200
+  RenderBlock (relative positioned) {DIV} at (1,1) size 200x1000 [bgcolor=#0000FF]
+    RenderBlock {DIV} at (0,0) size 200x500 [bgcolor=#FF0000]
+    RenderBlock {DIV} at (0,500) size 200x500 [bgcolor=#008000]
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 92c203a..c5e85a3 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,39 @@
+2010-07-15  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        Avoid creating huge compositing layers for elements that project outside the viewport
+        https://bugs.webkit.org/show_bug.cgi?id=42338
+
+        The logic that computed the bounds of compositing layers naively used the
+        union of the bounds of descendant, non-composited RenderLayers, without regard
+        to what is actually visible. This could result in huge layers for page with
+        elements are large negative offsets, or with large negative text-indent (both
+        common).
+        
+        For elements without transforms on them or in their ancestor chain, and when
+        no 3d transforms or hardware-accelerated animations are used, can clip compositing
+        layers to the size of the document, or based on CSS overflow and clip.
+
+        Tests: compositing/geometry/limit-layer-bounds-clipping-ancestor.html
+               compositing/geometry/limit-layer-bounds-fixed-positioned.html
+               compositing/geometry/limit-layer-bounds-overflow-repaint.html
+               compositing/geometry/limit-layer-bounds-positioned-transition.html
+               compositing/geometry/limit-layer-bounds-positioned.html
+               compositing/geometry/limit-layer-bounds-transformed-overflow.html
+               compositing/geometry/limit-layer-bounds-transformed.html
+
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::enclosingOverflowClipAncestor):  Walk up the RenderLayer tree
+        looking for an ancestor that has overflow, or to the root. Along the way, check for
+        transformed elements.
+        (WebCore::RenderLayerBacking::updateCompositedBounds):  If we're in "consult
+        overlap" mode, and we don't have transforms, then constrain the bounds
+        of composited layers by the RenderView's layoutOverflowRect(), or by the
+        enclosing layer with overflow.
+        (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry): If the offset from the renderer changes,
+        we need to repaint the layer.
+
 2010-07-15  Alex Nicolaou  <anicolao at chromium.org>
 
         Reviewed by Dirk Schulze.
diff --git a/WebCore/rendering/RenderLayerBacking.cpp b/WebCore/rendering/RenderLayerBacking.cpp
index e8b3cee..ed42a96 100644
--- a/WebCore/rendering/RenderLayerBacking.cpp
+++ b/WebCore/rendering/RenderLayerBacking.cpp
@@ -64,6 +64,7 @@ using namespace HTMLNames;
 static bool hasBorderOutlineOrShadow(const RenderStyle*);
 static bool hasBoxDecorationsOrBackground(const RenderObject*);
 static bool hasBoxDecorationsOrBackgroundImage(const RenderStyle*);
+static IntRect clipBox(RenderBox* renderer);
 
 static inline bool is3DCanvas(RenderObject* renderer)
 {
@@ -139,10 +140,60 @@ static bool hasNonZeroTransformOrigin(const RenderObject* renderer)
         || (style->transformOriginY().type() == Fixed && style->transformOriginY().value());
 }
 
+static RenderLayer* enclosingOverflowClipAncestor(RenderLayer* layer, bool& crossesTransform)
+{
+    crossesTransform = false;
+
+    for (RenderLayer* curr = layer->parent(); curr; curr = curr->parent()) {
+        if (curr->renderer()->hasOverflowClip())
+            return curr;
+
+        if (curr->hasTransform())
+            crossesTransform = true;
+    }
+    
+    return 0;
+}
+
 void RenderLayerBacking::updateCompositedBounds()
 {
     IntRect layerBounds = compositor()->calculateCompositedBounds(m_owningLayer, m_owningLayer);
 
+    // Clip to the size of the document or enclosing overflow-scroll layer.
+    if (compositor()->compositingConsultsOverlap() && !m_owningLayer->hasTransform()) {
+        bool crossesTransform;
+        RenderLayer* overflowAncestor = enclosingOverflowClipAncestor(m_owningLayer, crossesTransform);
+        // If an ancestor is transformed, we can't currently compute the correct rect to intersect with.
+        // We'd need RenderObject::convertContainerToLocalQuad(), which doesn't yet exist.
+        if (!crossesTransform) {
+            IntRect clippingBounds;
+            RenderLayer* boundsRelativeLayer;
+
+            if (overflowAncestor) {
+                RenderBox* overflowBox = toRenderBox(overflowAncestor->renderer());
+                // If scrollbars are visible, then constrain the layer to the scrollable area, so we can avoid redraws
+                // on scrolling. Otherwise just clip to the visible area (it can still be scrolled via JS, but we'll come
+                // back through this code when the scroll offset changes).
+                if (overflowBox->scrollsOverflow())
+                    clippingBounds = IntRect(-overflowAncestor->scrollXOffset(), -overflowAncestor->scrollYOffset(), overflowBox->scrollWidth(), overflowBox->scrollHeight());
+                else
+                    clippingBounds = clipBox(overflowBox);
+
+                boundsRelativeLayer = overflowAncestor;
+            } else {
+                RenderView* view = m_owningLayer->renderer()->view();
+                clippingBounds = view->layoutOverflowRect();
+                boundsRelativeLayer = view->layer();
+            }
+            
+            int deltaX = 0;
+            int deltaY = 0;
+            m_owningLayer->convertToLayerCoords(boundsRelativeLayer, deltaX, deltaY);
+            clippingBounds.move(-deltaX, -deltaY);
+            layerBounds.intersect(clippingBounds);
+        }
+    }
+    
     // If the element has a transform-origin that has fixed lengths, and the renderer has zero size,
     // then we need to ensure that the compositing layer has non-zero size so that we can apply
     // the transform-origin via the GraphicsLayer anchorPoint (which is expressed as a fractional value).
@@ -308,7 +359,12 @@ void RenderLayerBacking::updateGraphicsLayerGeometry()
     }
 
     m_graphicsLayer->setPosition(FloatPoint() + (relativeCompositingBounds.location() - graphicsLayerParentLocation));
+    
+    IntSize oldOffsetFromRenderer = m_graphicsLayer->offsetFromRenderer();
     m_graphicsLayer->setOffsetFromRenderer(localCompositingBounds.location() - IntPoint());
+    // If the compositing layer offset changes, we need to repaint.
+    if (oldOffsetFromRenderer != m_graphicsLayer->offsetFromRenderer())
+        m_graphicsLayer->setNeedsDisplay();
     
     FloatSize oldSize = m_graphicsLayer->size();
     FloatSize newSize = relativeCompositingBounds.size();

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list