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

simon.fraser at apple.com simon.fraser at apple.com
Wed Dec 22 17:45:05 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit c99100a9a3b5f45c0a7af3cc76e25da10dc37074
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Nov 29 23:13:28 2010 +0000

    2010-11-29  Simon Fraser  <simon.fraser at apple.com>
    
            Reviewed by Dave Hyatt.
    
            layer()->currentTransform() is stale when layout changes the box size
            https://bugs.webkit.org/show_bug.cgi?id=50175
    
            RenderLayer::updateTransform() is fairly expensive, so we
            have to avoid calling it from RenderBox::applyLayerTransformToRect()
            every time. This requires that we update the layer's transform
            during layout, instead of from updateLayerPositions() which is too late.
    
            So call updateLayerTransform() from the various layout methods
            on renderers that can be transformed, and remove it from
            updateLayerPositions().
    
            Test: fast/overflow/overflow-update-transform.html
    
            * rendering/RenderBlock.cpp:
            (WebCore::RenderBlock::layoutBlock):
            (WebCore::RenderBlock::layoutOnlyPositionedObjects):
            * rendering/RenderBox.cpp:
            (WebCore::RenderBox::applyLayerTransformToRect):
            (WebCore::RenderBox::updateLayerTransform):
            * rendering/RenderBox.h:
            * rendering/RenderEmbeddedObject.cpp:
            (WebCore::RenderEmbeddedObject::layout):
            * rendering/RenderFlexibleBox.cpp:
            (WebCore::RenderFlexibleBox::layoutBlock):
            * rendering/RenderIFrame.cpp:
            (WebCore::RenderIFrame::layout):
            * rendering/RenderLayer.cpp:
            (WebCore::RenderLayer::updateLayerPositions):
            * rendering/RenderReplaced.cpp:
            (WebCore::RenderReplaced::layout):
            * rendering/RenderTable.cpp:
            (WebCore::RenderTable::layout):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72839 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index dcd6ae8..ff4851a 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-29  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dave Hyatt.
+
+        layer()->currentTransform() is stale when layout changes the box size
+        https://bugs.webkit.org/show_bug.cgi?id=50175
+        
+        * fast/overflow/overflow-update-transform-expected.txt: Added.
+        * fast/overflow/overflow-update-transform.html: Added.
+
 2010-11-29  Ojan Vafai  <ojan at chromium.org>
 
         [Chromium] Mark tests as failing after http://trac.webkit.org/changeset/72819.
diff --git a/LayoutTests/fast/overflow/overflow-update-transform-expected.txt b/LayoutTests/fast/overflow/overflow-update-transform-expected.txt
new file mode 100644
index 0000000..695f9cf
--- /dev/null
+++ b/LayoutTests/fast/overflow/overflow-update-transform-expected.txt
@@ -0,0 +1,14 @@
+layer at (0,0) size 785x634
+  RenderView at (0,0) size 785x600
+layer at (0,0) size 785x634
+  RenderBlock {HTML} at (0,0) size 785x634
+    RenderBody {BODY} at (8,10) size 769x614
+layer at (18,10) size 302x302 clip at (19,11) size 285x285 scrollWidth 363 scrollHeight 363
+  RenderBlock {DIV} at (10,0) size 302x302 [border: (1px solid #000000)]
+layer at (18,322) size 302x302 clip at (19,323) size 285x285 scrollWidth 363 scrollHeight 363
+  RenderBlock {DIV} at (10,312) size 302x302 [border: (1px solid #000000)]
+    RenderText {#text} at (0,0) size 0x0
+layer at (19,11) size 300x300 backgroundClip at (19,11) size 285x285 clip at (19,11) size 285x285 outlineClip at (19,11) size 285x285
+  RenderBlock {DIV} at (1,1) size 300x300 [bgcolor=#C0C0C0]
+layer at (19,323) size 300x300 backgroundClip at (19,323) size 285x285 clip at (19,323) size 285x285 outlineClip at (19,323) size 285x285
+  RenderImage {IMG} at (1,1) size 300x300 [bgcolor=#C0C0C0]
diff --git a/LayoutTests/fast/overflow/overflow-update-transform.html b/LayoutTests/fast/overflow/overflow-update-transform.html
new file mode 100644
index 0000000..0cd7dac
--- /dev/null
+++ b/LayoutTests/fast/overflow/overflow-update-transform.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+    <style type="text/css" media="screen">
+        .container {
+            overflow: scroll;
+            height: 300px;
+            width: 300px;
+            margin: 10px;
+            border: 1px solid black;
+        }
+        
+        .contents {
+            height: 300px;
+            width: 300px;
+            -webkit-transform: rotate(45deg);
+            background-color: silver;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <div class="contents"></div>
+    </div>
+
+    <div class="container">
+        <img class="contents">
+    </div>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index d2e74ec..40456bf 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,41 @@
+2010-11-29  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dave Hyatt.
+
+        layer()->currentTransform() is stale when layout changes the box size
+        https://bugs.webkit.org/show_bug.cgi?id=50175
+        
+        RenderLayer::updateTransform() is fairly expensive, so we
+        have to avoid calling it from RenderBox::applyLayerTransformToRect()
+        every time. This requires that we update the layer's transform
+        during layout, instead of from updateLayerPositions() which is too late.
+        
+        So call updateLayerTransform() from the various layout methods
+        on renderers that can be transformed, and remove it from 
+        updateLayerPositions().
+
+        Test: fast/overflow/overflow-update-transform.html
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::layoutBlock):
+        (WebCore::RenderBlock::layoutOnlyPositionedObjects):
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::applyLayerTransformToRect):
+        (WebCore::RenderBox::updateLayerTransform):
+        * rendering/RenderBox.h:
+        * rendering/RenderEmbeddedObject.cpp:
+        (WebCore::RenderEmbeddedObject::layout):
+        * rendering/RenderFlexibleBox.cpp:
+        (WebCore::RenderFlexibleBox::layoutBlock):
+        * rendering/RenderIFrame.cpp:
+        (WebCore::RenderIFrame::layout):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::updateLayerPositions):
+        * rendering/RenderReplaced.cpp:
+        (WebCore::RenderReplaced::layout):
+        * rendering/RenderTable.cpp:
+        (WebCore::RenderTable::layout):
+
 2010-11-29  Chris Rogers  <crogers at google.com>
 
         Reviewed by Kenneth Russell.
diff --git a/WebCore/rendering/RenderBlock.cpp b/WebCore/rendering/RenderBlock.cpp
index c2cf6e4..37df281 100644
--- a/WebCore/rendering/RenderBlock.cpp
+++ b/WebCore/rendering/RenderBlock.cpp
@@ -1254,6 +1254,8 @@ void RenderBlock::layoutBlock(bool relayoutChildren, int pageHeight)
     if (view()->layoutState()->m_pageHeight)
         setPageY(view()->layoutState()->pageY(y()));
 
+    updateLayerTransform();
+
     // Update our scroll information if we're overflow:auto/scroll/hidden now that we know if
     // we overflow or not.
     updateScrollInfoAfterLayout();
@@ -1998,6 +2000,8 @@ bool RenderBlock::layoutOnlyPositionedObjects()
     layoutPositionedObjects(false);
 
     statePusher.pop();
+    
+    updateLayerTransform();
 
     updateScrollInfoAfterLayout();
 
diff --git a/WebCore/rendering/RenderBox.cpp b/WebCore/rendering/RenderBox.cpp
index 9bb7765..e2a4a53 100644
--- a/WebCore/rendering/RenderBox.cpp
+++ b/WebCore/rendering/RenderBox.cpp
@@ -452,11 +452,9 @@ void RenderBox::absoluteQuads(Vector<FloatQuad>& quads)
 
 IntRect RenderBox::applyLayerTransformToRect(const IntRect& rect) const
 {
-    if (layer() && layer()->hasTransform()) {
+    if (hasLayer() && layer()->hasTransform()) {
         TransformationMatrix transform;
-        transform.makeIdentity();
         transform.translate(rect.x(), rect.y());
-        layer()->updateTransform();
         transform.multLeft(layer()->currentTransform());
         return transform.mapRect(IntRect(0, 0, rect.width(), rect.height()));
     }
@@ -468,6 +466,13 @@ IntRect RenderBox::transformedFrameRect() const
     return applyLayerTransformToRect(frameRect());
 }
 
+void RenderBox::updateLayerTransform()
+{
+    // Transform-origin depends on box size, so we need to update the layer transform after layout.
+    if (hasLayer())
+        layer()->updateTransform();
+}
+
 IntRect RenderBox::absoluteContentBox() const
 {
     IntRect rect = contentBoxRect();
diff --git a/WebCore/rendering/RenderBox.h b/WebCore/rendering/RenderBox.h
index 172a950..1e17c4e 100644
--- a/WebCore/rendering/RenderBox.h
+++ b/WebCore/rendering/RenderBox.h
@@ -157,6 +157,8 @@ public:
     void addOverflowFromChild(RenderBox* child) { addOverflowFromChild(child, IntSize(child->x(), child->y())); }
     void addOverflowFromChild(RenderBox* child, const IntSize& delta);
     void clearLayoutOverflow();
+    
+    void updateLayerTransform();
 
     void blockDirectionOverflow(bool isLineHorizontal, int& logicalTopLayoutOverflow, int& logicalBottomLayoutOverflow,
                                 int& logicalTopVisualOverflow, int& logicalBottomVisualOverflow);
diff --git a/WebCore/rendering/RenderEmbeddedObject.cpp b/WebCore/rendering/RenderEmbeddedObject.cpp
index 16613a5..b025394 100644
--- a/WebCore/rendering/RenderEmbeddedObject.cpp
+++ b/WebCore/rendering/RenderEmbeddedObject.cpp
@@ -223,6 +223,8 @@ void RenderEmbeddedObject::layout()
     m_overflow.clear();
     addShadowOverflow();
 
+    updateLayerTransform();
+
     if (!widget() && frameView())
         frameView()->addWidgetToUpdate(this);
 
diff --git a/WebCore/rendering/RenderFlexibleBox.cpp b/WebCore/rendering/RenderFlexibleBox.cpp
index 50b991c..6482eb0 100644
--- a/WebCore/rendering/RenderFlexibleBox.cpp
+++ b/WebCore/rendering/RenderFlexibleBox.cpp
@@ -278,6 +278,8 @@ void RenderFlexibleBox::layoutBlock(bool relayoutChildren, int /*pageHeight FIXM
 
     statePusher.pop();
 
+    updateLayerTransform();
+
     if (view()->layoutState()->m_pageHeight)
         setPageY(view()->layoutState()->pageY(y()));
 
diff --git a/WebCore/rendering/RenderIFrame.cpp b/WebCore/rendering/RenderIFrame.cpp
index 4bf458e..b9fed53 100644
--- a/WebCore/rendering/RenderIFrame.cpp
+++ b/WebCore/rendering/RenderIFrame.cpp
@@ -119,6 +119,7 @@ void RenderIFrame::layout()
 
     m_overflow.clear();
     addShadowOverflow();
+    updateLayerTransform();
 
     setNeedsLayout(false);
 }
diff --git a/WebCore/rendering/RenderLayer.cpp b/WebCore/rendering/RenderLayer.cpp
index 5af951c..2f4bc51 100644
--- a/WebCore/rendering/RenderLayer.cpp
+++ b/WebCore/rendering/RenderLayer.cpp
@@ -310,8 +310,6 @@ void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags, IntPoint
 
     updateVisibilityStatus();
 
-    updateTransform();
-
     if (flags & UpdatePagination)
         updatePagination();
     else
diff --git a/WebCore/rendering/RenderReplaced.cpp b/WebCore/rendering/RenderReplaced.cpp
index b1a7711..9a809fc 100644
--- a/WebCore/rendering/RenderReplaced.cpp
+++ b/WebCore/rendering/RenderReplaced.cpp
@@ -80,6 +80,7 @@ void RenderReplaced::layout()
 
     m_overflow.clear();
     addShadowOverflow();
+    updateLayerTransform();
     
     repainter.repaintAfterLayout();
     setNeedsLayout(false);
diff --git a/WebCore/rendering/RenderTable.cpp b/WebCore/rendering/RenderTable.cpp
index 7115222..b761aea 100644
--- a/WebCore/rendering/RenderTable.cpp
+++ b/WebCore/rendering/RenderTable.cpp
@@ -384,6 +384,8 @@ void RenderTable::layout()
     // FIXME: Only pass true if width or height changed.
     layoutPositionedObjects(true);
 
+    updateLayerTransform();
+
     // Add overflow from borders.
     int rightBorderOverflow = width() + (collapsing ? outerBorderRight() - borderRight() : 0);
     int leftBorderOverflow = collapsing ? borderLeft() - outerBorderLeft() : 0;

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list