[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