2010-04-01 James Robinson <jamesr@chromium.org>
authorjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 1 Apr 2010 22:21:20 +0000 (22:21 +0000)
committerjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 1 Apr 2010 22:21:20 +0000 (22:21 +0000)
        Reviewed by Simon Fraser.

        Keeps a transient optimistic offset to the root in RenderLayer::updateLayerPositions
        https://bugs.webkit.org/show_bug.cgi?id=33520

        RenderLayer::updateLayerPositions() makes a recursive walk through all RenderLayers and updates the repaint rectangles on each.
        These rectangles have to be calculated in the repaint container's coordinates using RenderObject::mapLocalToContainer to walk
        up to the repaint container.  This patch keeps track of the offset to the root and uses that offset instead of walking back up to
        the root every time.

        Tests: fast/layers/nested-layers-1.html
               fast/layers/nested-layers-2.html
               fast/layers/nested-layers-3.html
               fast/layers/nested-layers-4.html

        * page/FrameView.cpp:
        (WebCore::FrameView::layout):
        * rendering/RenderBox.cpp:
        (WebCore::RenderBox::outlineBoundsForRepaint):
        * rendering/RenderBox.h:
        * rendering/RenderLayer.cpp:
        (WebCore::RenderLayer::updateLayerPositions):
        * rendering/RenderLayer.h:
        * rendering/RenderObject.h:
        (WebCore::RenderObject::outlineBoundsForRepaint):
        * rendering/RenderSVGModelObject.cpp:
        (WebCore::RenderSVGModelObject::outlineBoundsForRepaint):
        * rendering/RenderSVGModelObject.h:
2010-04-01  James Robinson  <jamesr@chromium.org>

        Reviewed by Simon Fraser.

        Mapping from local to container coord space in updateLayerPositions is quadratic
        https://bugs.webkit.org/show_bug.cgi?id=33520

        These tests move layers around in various ways to test that the offset caching in
        updateLayerPositions() is correct.

        * fast/layers/nested-layers-1-expected.txt: Added.
        * fast/layers/nested-layers-1.html: Added.
        * fast/layers/nested-layers-2-expected.txt: Added.
        * fast/layers/nested-layers-2.html: Added.
        * fast/layers/nested-layers-3-expected.txt: Added.
        * fast/layers/nested-layers-3.html: Added.
        * fast/layers/nested-layers-4-expected.txt: Added.
        * fast/layers/nested-layers-4.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@56941 268f45cc-cd09-0410-ab3c-d52691b4dbfc

18 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/layers/nested-layers-1-expected.txt [new file with mode: 0644]
LayoutTests/fast/layers/nested-layers-1.html [new file with mode: 0644]
LayoutTests/fast/layers/nested-layers-2-expected.txt [new file with mode: 0644]
LayoutTests/fast/layers/nested-layers-2.html [new file with mode: 0644]
LayoutTests/fast/layers/nested-layers-3-expected.txt [new file with mode: 0644]
LayoutTests/fast/layers/nested-layers-3.html [new file with mode: 0644]
LayoutTests/fast/layers/nested-layers-4-expected.txt [new file with mode: 0644]
LayoutTests/fast/layers/nested-layers-4.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/page/FrameView.cpp
WebCore/rendering/RenderBox.cpp
WebCore/rendering/RenderBox.h
WebCore/rendering/RenderLayer.cpp
WebCore/rendering/RenderLayer.h
WebCore/rendering/RenderObject.h
WebCore/rendering/RenderSVGModelObject.cpp
WebCore/rendering/RenderSVGModelObject.h

index 4ab0ff41eee1b95e3c7940fb9f3108dc88325af7..dd7fb4d16d629ce52b9f30d7b92c65df2f69cdce 100644 (file)
@@ -1,3 +1,22 @@
+2010-04-01  James Robinson  <jamesr@chromium.org>
+
+        Reviewed by Simon Fraser.
+
+        Mapping from local to container coord space in updateLayerPositions is quadratic
+        https://bugs.webkit.org/show_bug.cgi?id=33520
+
+        These tests move layers around in various ways to test that the offset caching in
+        updateLayerPositions() is correct.
+
+        * fast/layers/nested-layers-1-expected.txt: Added.
+        * fast/layers/nested-layers-1.html: Added.
+        * fast/layers/nested-layers-2-expected.txt: Added.
+        * fast/layers/nested-layers-2.html: Added.
+        * fast/layers/nested-layers-3-expected.txt: Added.
+        * fast/layers/nested-layers-3.html: Added.
+        * fast/layers/nested-layers-4-expected.txt: Added.
+        * fast/layers/nested-layers-4.html: Added.
+
 2010-04-01  Chris Marrin  <cmarrin@apple.com>
 
         Reviewed by Simon Fraser.
diff --git a/LayoutTests/fast/layers/nested-layers-1-expected.txt b/LayoutTests/fast/layers/nested-layers-1-expected.txt
new file mode 100644 (file)
index 0000000..aff9f16
--- /dev/null
@@ -0,0 +1,3 @@
+Test where every node has a layer and the containing block structure matches the layer structure exactly. 
+The test passes if it completes without failing any assertions in Debug mode.
+
diff --git a/LayoutTests/fast/layers/nested-layers-1.html b/LayoutTests/fast/layers/nested-layers-1.html
new file mode 100644 (file)
index 0000000..fc96fad
--- /dev/null
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function test()
+{
+    document.body.offsetTop;
+    if (window.layoutTestController) {
+        layoutTestController.display();
+        layoutTestController.dumpAsText();
+        finish();
+    } else {
+        window.setTimeout(finish, 50);
+    }
+}
+
+function finish()
+{
+    var innerLayer = document.getElementById('innerLayer');
+    innerLayer.style.left = '19px';
+    innerLayer.style.top = '23px';
+}
+</script>
+<style>
+/* nodes that have layers and are containers for their children */
+.a { outline: solid blue 1px }
+
+/* nodes that have layers but are not containers for their children */
+.b { outline: solid red 1px }
+
+/* nodes that do not have layers */
+.c { outline: solid green 1px }
+</style>
+</head>
+<body onload="test()">
+  Test where every node has a layer and the containing block structure matches the layer structure exactly.
+  <br>
+  The test passes if it completes without failing any assertions in Debug mode.
+  <div>
+    <div style="position:absolute" class="a">
+      <div style="position:absolute; left:7px; top:3px" class="a">
+        <div style="opacity: 0.8; left: 9px; width:50px; height:50px" class="b"></div>
+        <div style="position:relative; left: 75px; width:50px; height:50px" class="a" id="innerLayer"></div>
+      </div>
+      <div style="opacity: 0.8; width: 25px; height: 37px" class="b"></div>
+      <div style="position:absolute; left:7px; top:50px; width:40px; height:40px" class="a">
+      </div>
+    </div>
+  </div>
+</body>
+</html
diff --git a/LayoutTests/fast/layers/nested-layers-2-expected.txt b/LayoutTests/fast/layers/nested-layers-2-expected.txt
new file mode 100644 (file)
index 0000000..617956a
--- /dev/null
@@ -0,0 +1,2 @@
+Test where some nodes have layers (because of overflow or transparency) but are not the containing block for their children. The test passes if it completes without failing any assertions in Debug mode.
+
diff --git a/LayoutTests/fast/layers/nested-layers-2.html b/LayoutTests/fast/layers/nested-layers-2.html
new file mode 100644 (file)
index 0000000..83b7076
--- /dev/null
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function test()
+{
+    document.body.offsetTop;
+    if (window.layoutTestController) {
+        layoutTestController.display();
+        layoutTestController.dumpAsText();
+        finish();
+    } else {
+        window.setTimeout(finish, 50);
+    }
+}
+
+function finish()
+{
+    var innerLayer = document.getElementById('innerLayer');
+    innerLayer.style.left = '19px';
+    innerLayer.style.top = '23px';
+}
+</script>
+<style>
+/* nodes that have layers and are containers for their children */
+.a { outline: solid blue 1px }
+
+/* nodes that have layers but are not containers for their children */
+.b { outline: solid red 1px }
+
+/* nodes that do not have layers */
+.c { outline: solid green 1px }
+</style>
+</head>
+<body onload="test()">
+  Test where some nodes have layers (because of overflow or transparency) but are not the containing block for their children.
+  The test passes if it completes without failing any assertions in Debug mode.
+  <div>
+    <div style="opacity: 0.8; height:40px" class="b">
+      <div style="height:30px" class="c"></div>
+      <div style="position:absolute; left:5px; top:5px; height:20px" class="c" id="innerLayer">
+         <div style="overflow:hidden; height:13px" class="b"></div>
+         <div style="height:6px" class="c"></div>
+         <div style="position:relative; top:60px" class="a">
+           <div style="height:30px" class="c"></div>
+         </div>
+         <div style="overflow:hidden; height:13px" class="b">
+         </div>
+      </div>
+    </div>
+  </div>
+</body>
+</html
diff --git a/LayoutTests/fast/layers/nested-layers-3-expected.txt b/LayoutTests/fast/layers/nested-layers-3-expected.txt
new file mode 100644 (file)
index 0000000..ad42d89
--- /dev/null
@@ -0,0 +1,2 @@
+Tests moving layers inside with fixed position nodes. The test passes if it completes without failing any assertions in Debug mode.
+
diff --git a/LayoutTests/fast/layers/nested-layers-3.html b/LayoutTests/fast/layers/nested-layers-3.html
new file mode 100644 (file)
index 0000000..3a242aa
--- /dev/null
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function test()
+{
+    document.body.offsetTop;
+    if (window.layoutTestController) {
+        layoutTestController.display();
+        layoutTestController.dumpAsText();
+        finish();
+    } else {
+        window.setTimeout(finish, 50);
+    }
+}
+
+function finish()
+{
+    var innerLayer = document.getElementById('innerLayer');
+    innerLayer.style.left = '19px';
+    innerLayer.style.top = '23px';
+    foo.scrollTop = 50;
+}
+</script>
+<style>
+/* nodes that have layers and are containers for their children */
+.a { outline: solid blue 1px }
+
+/* nodes that have layers but are not containers for their children */
+.b { outline: solid red 1px }
+
+/* nodes that do not have layers */
+.c { outline: solid green 1px }
+</style>
+</head>
+<body onload="test()">
+  Tests moving layers inside with fixed position nodes.
+  The test passes if it completes without failing any assertions in Debug mode.
+  <div>
+    <div style="position:fixed; top:30px" class="a">
+      <div style="position:absolute; left:7px; top:3px" class="a">
+        <div style="opacity: 0.8; left: 9px; width:50px; height:50px" class="b">
+          <div style="width:34px; height:43px" class="c"></div>
+        </div>
+        <div style="position:relative; left: 75px; width:50px; height:50px" class="a" id="innerLayer">
+          <div style="width:45px; height:45px" class="c"></div>
+        </div>
+      </div>
+      <div style="opacity: 0.8; width: 25px; height: 37px" id="foo"  class="b"></div>
+      <div style="position:absolute; left:7px; top:50px; width:40px; height:40px" class="a">
+      </div>
+    </div>
+  </div>
+</body>
+</html
diff --git a/LayoutTests/fast/layers/nested-layers-4-expected.txt b/LayoutTests/fast/layers/nested-layers-4-expected.txt
new file mode 100644 (file)
index 0000000..8f0bf0f
--- /dev/null
@@ -0,0 +1,2 @@
+Tests that moving a layer inside a transformed layer works. The test passes if it completes without failing any assertions in Debug mode.
+
diff --git a/LayoutTests/fast/layers/nested-layers-4.html b/LayoutTests/fast/layers/nested-layers-4.html
new file mode 100644 (file)
index 0000000..0e99f5d
--- /dev/null
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function test()
+{
+    document.body.offsetTop;
+    if (window.layoutTestController) {
+        layoutTestController.display();
+        layoutTestController.dumpAsText();
+        finish();
+    } else {
+        window.setTimeout(finish, 50);
+    }
+}
+
+function finish()
+{
+    var innerLayer = document.getElementById('innerLayer');
+    innerLayer.style.left = '19px';
+    innerLayer.style.top = '23px';
+}
+</script>
+<style>
+/* nodes that have layers and are containers for their children */
+.a { outline: solid blue 1px }
+
+/* nodes that have layers but are not containers for their children */
+.b { outline: solid red 1px }
+
+/* nodes that do not have layers */
+.c { outline: solid green 1px }
+</style>
+</head>
+<body onload="test()">
+  Tests that moving a layer inside a transformed layer works.
+  The test passes if it completes without failing any assertions in Debug mode.
+  <div>
+    <div style="position:absolute; top:50px" class="a">
+      <div style="-webkit-transform:translate(27px, 47px); -webkit-transform:rotate(30deg)" class="a">
+        <div style="opacity: 0.8; width:50px; height:50px" class="b"></div>
+        <div style="position:absolute; width:20px; height:20px; left: 4px; top:7px" id="innerLayer" class="a">
+          <div style="position:relative; width:15px; height:15px" class="a"></div>
+        </div>
+        <div style="opacity: 0.8; width:50px; height:50px" class="b"></div>
+      </div>
+    </div>
+  </div>
+</body>
+</html
index 8c9455f72445344f96e44e17ddadae34cf478fff..48ac3c0f73822c18fe6de222ef054c639b8e023b 100644 (file)
@@ -1,3 +1,34 @@
+2010-04-01  James Robinson  <jamesr@chromium.org>
+
+        Reviewed by Simon Fraser.
+
+        Keeps a transient optimistic offset to the root in RenderLayer::updateLayerPositions
+        https://bugs.webkit.org/show_bug.cgi?id=33520
+
+        RenderLayer::updateLayerPositions() makes a recursive walk through all RenderLayers and updates the repaint rectangles on each.
+        These rectangles have to be calculated in the repaint container's coordinates using RenderObject::mapLocalToContainer to walk
+        up to the repaint container.  This patch keeps track of the offset to the root and uses that offset instead of walking back up to
+        the root every time.
+
+        Tests: fast/layers/nested-layers-1.html
+               fast/layers/nested-layers-2.html
+               fast/layers/nested-layers-3.html
+               fast/layers/nested-layers-4.html
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::layout):
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::outlineBoundsForRepaint):
+        * rendering/RenderBox.h:
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::updateLayerPositions):
+        * rendering/RenderLayer.h:
+        * rendering/RenderObject.h:
+        (WebCore::RenderObject::outlineBoundsForRepaint):
+        * rendering/RenderSVGModelObject.cpp:
+        (WebCore::RenderSVGModelObject::outlineBoundsForRepaint):
+        * rendering/RenderSVGModelObject.h:
+
 2010-04-01  Daniel Bates  <dbates@rim.com>
 
         Reviewed by Darin Adler.
index 91a5417ea7a02fce57d5208339ab31e785f190a3..f385e02190353a0b25eb21b91bbf1542601a78ef 100644 (file)
@@ -738,10 +738,12 @@ void FrameView::layout(bool allowSubtree)
 
     // Now update the positions of all layers.
     beginDeferredRepaints();
+    IntPoint cachedOffset;
     layer->updateLayerPositions((m_doFullRepaint ? RenderLayer::DoFullRepaint : 0)
                                 | RenderLayer::CheckForRepaint
                                 | RenderLayer::IsCompositingUpdateRoot
-                                | RenderLayer::UpdateCompositingLayers);
+                                | RenderLayer::UpdateCompositingLayers,
+                                subtree ? 0 : &cachedOffset);
     endDeferredRepaints();
 
 #if USE(ACCELERATED_COMPOSITING)
index 1c0e83739444b6e141e5f8fba47f1e42fdce3527..cc6109487150bbd06b90cfeb6eb073d7e9e65784 100644 (file)
@@ -325,12 +325,17 @@ FloatQuad RenderBox::absoluteContentQuad() const
     return localToAbsoluteQuad(FloatRect(rect));
 }
 
-IntRect RenderBox::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer) const
+IntRect RenderBox::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint* cachedOffsetToRepaintContainer) const
 {
     IntRect box = borderBoundingBox();
     adjustRectForOutlineAndShadow(box);
 
-    FloatQuad containerRelativeQuad = localToContainerQuad(FloatRect(box), repaintContainer);
+    FloatQuad containerRelativeQuad = FloatRect(box);
+    if (cachedOffsetToRepaintContainer)
+        containerRelativeQuad.move(cachedOffsetToRepaintContainer->x(), cachedOffsetToRepaintContainer->y());
+    else
+        containerRelativeQuad = localToContainerQuad(containerRelativeQuad, repaintContainer);
+
     box = containerRelativeQuad.enclosingBoundingBox();
 
     // FIXME: layoutDelta needs to be applied in parts before/after transforms and
index 90a17ae0bb67adbf1a1216e3474152d24fc50dac..eaa638f67b29f98ece18ec46d3663c9a104cf183 100644 (file)
@@ -73,7 +73,7 @@ public:
     FloatQuad absoluteContentQuad() const;
 
     // Bounds of the outline box in absolute coords. Respects transforms
-    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/) const;
+    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* cachedOffsetToRepaintContainer) const;
     virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
 
     // Use this with caution! No type checking is done!
index a60da264a352f5ada4576bd07cf14a3bbc2c661e..1c0e6ae622dddb263ef7c4e0329139e0bdc2d796 100644 (file)
@@ -245,7 +245,7 @@ bool RenderLayer::hasAcceleratedCompositing() const
 #endif
 }
 
-void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags)
+void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags, IntPoint* cachedOffset)
 {
     if (flags & DoFullRepaint) {
         renderer()->repaint();
@@ -259,13 +259,46 @@ void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags)
 #endif
     }
     
+
     updateLayerPosition(); // For relpositioned layers or non-positioned layers,
                            // we need to keep in sync, since we may have shifted relative
                            // to our parent layer.
+    IntPoint oldCachedOffset;
+    if (cachedOffset) {
+        // We can't cache our offset to the repaint container if the mapping is anything more complex than a simple translation
+        bool disableOffsetCache = renderer()->isSVGRoot() || renderer()->hasColumns() || renderer()->hasTransform() || isComposited();
+        if (disableOffsetCache)
+            cachedOffset = 0; // If our cached offset is invalid make sure it's not passed to any of our children
+        else {
+            oldCachedOffset = *cachedOffset;
+            // Frequently our parent layer's renderer will be the same as our renderer's containing block.  In that case,
+            // we just update the cache using our offset to our parent (which is m_x / m_y).  Otherwise, regenerated cached
+            // offsets to the root from the render tree.
+            if (!m_parent || m_parent->renderer() == renderer()->containingBlock())
+                cachedOffset->move(m_x, m_y); // Fast case
+            else {
+                int x = 0;
+                int y = 0;
+                convertToLayerCoords(root(), x, y);
+                *cachedOffset = IntPoint(x, y);
+            }
+        }
+    }
 
     int x = 0;
     int y = 0;
-    convertToLayerCoords(root(), x, y);
+    if (cachedOffset) {
+        x += cachedOffset->x();
+        y += cachedOffset->y();
+#ifndef NDEBUG
+        int nonCachedX = 0;
+        int nonCachedY = 0;
+        convertToLayerCoords(root(), nonCachedX, nonCachedY);
+        ASSERT(x == nonCachedX);
+        ASSERT(y == nonCachedY);
+#endif
+    } else
+        convertToLayerCoords(root(), x, y);
     positionOverflowControls(x, y);
 
     updateVisibilityStatus();
@@ -281,7 +314,8 @@ void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags)
 
         RenderBoxModelObject* repaintContainer = renderer()->containerForRepaint();
         IntRect newRect = renderer()->clippedOverflowRectForRepaint(repaintContainer);
-        IntRect newOutlineBox = renderer()->outlineBoundsForRepaint(repaintContainer);
+        IntRect newOutlineBox = renderer()->outlineBoundsForRepaint(repaintContainer, cachedOffset);
+        ASSERT(newOutlineBox == renderer()->outlineBoundsForRepaint(repaintContainer, 0));
         if (flags & CheckForRepaint) {
             if (view && !view->printing()) {
                 if (m_needsFullRepaint) {
@@ -313,7 +347,7 @@ void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags)
 #endif
 
     for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
-        child->updateLayerPositions(flags);
+        child->updateLayerPositions(flags, cachedOffset);
 
 #if USE(ACCELERATED_COMPOSITING)
     if ((flags & UpdateCompositingLayers) && isComposited())
@@ -323,6 +357,9 @@ void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags)
     // With all our children positioned, now update our marquee if we need to.
     if (m_marquee)
         m_marquee->updateMarqueePosition();
+
+    if (cachedOffset)
+        *cachedOffset = oldCachedOffset;
 }
 
 void RenderLayer::computeRepaintRects()
index 9210e95c92ae6c0b37647d31344eeb56254d35cb..73cc380e00bd9090e7c840887e58595512067144 100644 (file)
@@ -305,7 +305,7 @@ public:
         UpdateCompositingLayers = 1 << 3,
     };
     typedef unsigned UpdateLayerPositionsFlags;
-    void updateLayerPositions(UpdateLayerPositionsFlags = DoFullRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers);
+    void updateLayerPositions(UpdateLayerPositionsFlags = DoFullRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers, IntPoint* cachedOffset = 0);
 
     void updateTransform();
 
index aa7646b163fb6835dd9dba77bf2ccf260e661ce4..3fd5ddd3a1e351511d4fbc66b72fa1727ffc071a 100644 (file)
@@ -793,7 +793,7 @@ protected:
 
     void arenaDelete(RenderArena*, void* objectBase);
 
-    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/) const { return IntRect(); }
+    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* /*cachedOffsetToRepaintContainer*/ = 0) const { return IntRect(); }
 
     class LayoutRepainter {
     public:
index c163dc63639fe343ace4130b1114162d9b6d70b7..837b36a589b5868127cbb988613ec0d004277642 100644 (file)
@@ -63,7 +63,7 @@ void RenderSVGModelObject::mapLocalToContainer(RenderBoxModelObject* repaintCont
 // Copied from RenderBox, this method likely requires further refactoring to work easily for both SVG and CSS Box Model content.
 // FIXME: This may also need to move into SVGRenderBase as the RenderBox version depends
 // on borderBoundingBox() which SVG RenderBox subclases (like SVGRenderBlock) do not implement.
-IntRect RenderSVGModelObject::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer) const
+IntRect RenderSVGModelObject::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint*) const
 {
     IntRect box = enclosingIntRect(repaintRectInLocalCoordinates());
     adjustRectForOutlineAndShadow(box);
index c04c5900a206408dcc65975b0f2b88a071150533..760e79a33842e361e6d80fdb9c35c42e038a7c20 100644 (file)
@@ -55,7 +55,7 @@ public:
 
     virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer);
     virtual void computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect&, bool fixed = false);
-    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer) const;
+    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint*) const;
 
     virtual void absoluteRects(Vector<IntRect>& rects, int tx, int ty);
     virtual void absoluteQuads(Vector<FloatQuad>&);