[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:28:55 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 3d1176671a278baf2de5d920471ea9426a7bfa9a
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Jul 27 00:21:41 2010 +0000

    2010-07-26  Simon Fraser  <simon.fraser at apple.com>
    
            Reviewed by Dan Bernstein.
    
            Google image search results broken on pages with Flash
            https://bugs.webkit.org/show_bug.cgi?id=43014
    
            The test for overflow added in r63452 is wrong in that it ignores the effects
            of positioning on overflow.
    
            The correct approach is to start by using RenderView's layoutOverflowRect as the largest bounds,
            then getting the oveflow rect via backgroundClipRect() relative to the root layer.
    
            Test: compositing/geometry/limit-layer-bounds-overflow-root.html
    
            * rendering/RenderLayerBacking.cpp:
            (WebCore::layerOrAncestorIsTransformed):
            (WebCore::RenderLayerBacking::updateCompositedBounds):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64095 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index a7c5051..844d023 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-26  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        Google image search results broken on pages with Flash
+        https://bugs.webkit.org/show_bug.cgi?id=43014
+        
+        Test with overflow:hidden on empty root, and absolutely positioned elements with compositing.
+
+        * compositing/geometry/limit-layer-bounds-overflow-root-expected.txt: Added.
+        * compositing/geometry/limit-layer-bounds-overflow-root.html: Added.
+
 2010-07-26  Chris Fleizach  <cfleizach at apple.com>
 
         Reviewed by Darin Adler.
diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-overflow-root-expected.txt b/LayoutTests/compositing/geometry/limit-layer-bounds-overflow-root-expected.txt
new file mode 100644
index 0000000..c7df7a4
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-overflow-root-expected.txt
@@ -0,0 +1,98 @@
+
+(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 4
+        (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 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 0.00 0.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 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 0.00 13.00)
+          (anchor 0.50 0.50)
+          (bounds 216.00 15.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-overflow-root.html b/LayoutTests/compositing/geometry/limit-layer-bounds-overflow-root.html
new file mode 100644
index 0000000..eb89779
--- /dev/null
+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-overflow-root.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style type="text/css" media="screen">
+    html, body {
+      overflow: hidden;
+      margin: 0;
+    }
+
+    .container {
+      position: absolute;
+      width: 100px;
+      height: 100px;
+      padding: 20px;
+      z-index: 0;
+      border: 1px solid black;
+    }
+    
+    embed {
+      position: absolute;
+      top: 21px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+    }
+    
+    .test {
+      position: relative;
+      width: 100px;
+      height: 100px;
+      background-color: green;
+    }
+    
+    .indicator {
+      position: absolute;
+      top: 21px;
+      left: 21px;
+      width: 100px;
+      height: 100px;
+      background-color: red;
+    }
+    
+    #layers {
+      position: absolute;
+    }
+  </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>
+
+  <!-- Tests with absolute positioning between the compositing layer and the element with overflow. -->
+  <!-- You should see a green square. -->
+  <div class="container">
+    <div class="test">
+    </div>
+  </div>
+  <pre id="layers">Layer tree goes here in DRT</pre>
+</body>
+</html>
+
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index dc2e18b..d936ed6 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,22 @@
+2010-07-26  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        Google image search results broken on pages with Flash
+        https://bugs.webkit.org/show_bug.cgi?id=43014
+
+        The test for overflow added in r63452 is wrong in that it ignores the effects
+        of positioning on overflow.
+        
+        The correct approach is to start by using RenderView's layoutOverflowRect as the largest bounds,
+        then getting the oveflow rect via backgroundClipRect() relative to the root layer.
+        
+        Test: compositing/geometry/limit-layer-bounds-overflow-root.html
+
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::layerOrAncestorIsTransformed):
+        (WebCore::RenderLayerBacking::updateCompositedBounds):
+
 2010-07-26  Anders Carlsson  <andersca at apple.com>
 
         Reviewed by Sam Weinig.
diff --git a/WebCore/rendering/RenderLayerBacking.cpp b/WebCore/rendering/RenderLayerBacking.cpp
index 888fe32..ea7114a 100644
--- a/WebCore/rendering/RenderLayerBacking.cpp
+++ b/WebCore/rendering/RenderLayerBacking.cpp
@@ -140,19 +140,14 @@ static bool hasNonZeroTransformOrigin(const RenderObject* renderer)
         || (style->transformOriginY().type() == Fixed && style->transformOriginY().value());
 }
 
-static RenderLayer* enclosingOverflowClipAncestor(RenderLayer* layer, bool& crossesTransform)
+static bool layerOrAncestorIsTransformed(RenderLayer* layer)
 {
-    crossesTransform = false;
-
-    for (RenderLayer* curr = layer->parent(); curr; curr = curr->parent()) {
-        if (curr->renderer()->hasOverflowClip())
-            return curr;
-
+    for (RenderLayer* curr = layer; curr; curr = curr->parent()) {
         if (curr->hasTransform())
-            crossesTransform = true;
+            return true;
     }
     
-    return 0;
+    return false;
 }
 
 void RenderLayerBacking::updateCompositedBounds()
@@ -160,38 +155,24 @@ 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 this or 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 (compositor()->compositingConsultsOverlap() && !layerOrAncestorIsTransformed(m_owningLayer)) {
+        RenderView* view = m_owningLayer->renderer()->view();
+        RenderLayer* rootLayer = view->layer();
+
+        // Start by clipping to the view's bounds.
+        IntRect clippingBounds = view->layoutOverflowRect();
+
+        if (m_owningLayer != rootLayer)
+            clippingBounds.intersect(m_owningLayer->backgroundClipRect(rootLayer, true));
+
+        int deltaX = 0;
+        int deltaY = 0;
+        m_owningLayer->convertToLayerCoords(rootLayer, 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,

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list