Fix for 3673931, negative margins on objects that dodge floats not handled correctly.
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 3 Jun 2004 21:36:15 +0000 (21:36 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 3 Jun 2004 21:36:15 +0000 (21:36 +0000)
        Reviewed by darin

        * khtml/rendering/render_block.cpp:
        (khtml::RenderBlock::layoutBlockChildren):

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

LayoutTests/fast/block/float/032-expected.txt [new file with mode: 0644]
LayoutTests/fast/block/float/032.html [new file with mode: 0644]
WebCore/ChangeLog-2005-08-23
WebCore/khtml/rendering/render_block.cpp

diff --git a/LayoutTests/fast/block/float/032-expected.txt b/LayoutTests/fast/block/float/032-expected.txt
new file mode 100644 (file)
index 0000000..b0688e8
--- /dev/null
@@ -0,0 +1,66 @@
+layer at (0,0) size 800x1022
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x1022
+  RenderBlock {HTML} at (0,0) size 800x1022
+    RenderBody {BODY} at (8,8) size 784x1006
+      RenderBlock {DIV} at (0,0) size 784x110 [border: (5px solid #000000)]
+        RenderBlock (anonymous) at (5,5) size 774x0
+          RenderBlock (floating) {DIV} at (0,0) size 100x100 [bgcolor=#008000]
+          RenderText {TEXT} at (0,0) size 0x0
+        RenderImage {IMG} at (205,5) size 100x100 [bgcolor=#800080]
+      RenderBlock (anonymous) at (0,110) size 784x18
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock {DIV} at (0,128) size 784x110 [border: (5px solid #000000)]
+        RenderBlock (floating) {DIV} at (5,5) size 100x100 [bgcolor=#008000]
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderImage {IMG} at (305,5) size 100x100 [bgcolor=#800080]
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock (anonymous) at (0,238) size 784x18
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock {DIV} at (0,256) size 784x110 [border: (5px solid #000000)]
+        RenderBlock (anonymous) at (5,5) size 774x0
+          RenderBlock (floating) {DIV} at (0,0) size 100x100 [bgcolor=#008000]
+          RenderText {TEXT} at (0,0) size 0x0
+        RenderImage {IMG} at (55,5) size 100x100 [bgcolor=#800080]
+      RenderBlock (anonymous) at (0,366) size 784x18
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock {DIV} at (0,384) size 784x110 [border: (5px solid #000000)]
+        RenderBlock (floating) {DIV} at (5,5) size 100x100 [bgcolor=#008000]
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderImage {IMG} at (55,5) size 100x100 [bgcolor=#800080]
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock (anonymous) at (0,494) size 784x18
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock {DIV} at (0,512) size 784x110 [border: (5px solid #000000)]
+        RenderBlock (anonymous) at (5,5) size 774x0
+          RenderBlock (floating) {DIV} at (0,0) size 100x100 [bgcolor=#008000]
+          RenderText {TEXT} at (0,0) size 0x0
+        RenderLineEdit {INPUT} at (205,5) size 100x18 [bgcolor=#800080]
+      RenderBlock (anonymous) at (0,622) size 784x18
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock {DIV} at (0,640) size 784x110 [border: (5px solid #000000)]
+        RenderBlock (floating) {DIV} at (5,5) size 100x100 [bgcolor=#008000]
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderLineEdit {INPUT} at (305,5) size 100x18 [bgcolor=#800080]
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock (anonymous) at (0,750) size 784x18
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock {DIV} at (0,768) size 784x110 [border: (5px solid #000000)]
+        RenderBlock (anonymous) at (5,5) size 774x0
+          RenderBlock (floating) {DIV} at (0,0) size 100x100 [bgcolor=#008000]
+          RenderText {TEXT} at (0,0) size 0x0
+        RenderLineEdit {INPUT} at (55,5) size 100x18 [bgcolor=#800080]
+      RenderBlock (anonymous) at (0,878) size 784x18
+        RenderBR {BR} at (0,0) size 0x18
+        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock {DIV} at (0,896) size 784x110 [border: (5px solid #000000)]
+        RenderBlock (floating) {DIV} at (5,5) size 100x100 [bgcolor=#008000]
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderLineEdit {INPUT} at (55,5) size 100x18 [bgcolor=#800080]
+        RenderText {TEXT} at (0,0) size 0x0
diff --git a/LayoutTests/fast/block/float/032.html b/LayoutTests/fast/block/float/032.html
new file mode 100644 (file)
index 0000000..478b092
--- /dev/null
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<style>
+body > div { border:5px solid black; height: 100px }
+.float { float: left; width:100px; height:100px; background-color: green }
+.normal { width: 100px; height:100px; background-color: purple }
+.left { margin-left: 200px; }
+.negleft { margin-left: -50px; }
+.block { display: block }
+</style>
+</head>
+<body>
+<div>
+  <div class="float"></div>
+  <img class="block normal left">
+</div>
+
+<br clear="all">
+
+<div>
+    <div class="float"></div>
+    <img class="normal left">
+</div>
+
+<br clear="all">
+
+<div>
+  <div class="float"></div>
+  <img class="block normal negleft">
+</div>
+
+<br clear="all">
+
+<div>
+    <div class="float"></div>
+    <img class="normal negleft">
+</div>
+
+<br clear="all">
+
+<div>
+  <div class="float"></div>
+  <input class="block normal left">
+</div>
+
+<br clear="all">
+
+<div>
+    <div class="float"></div>
+    <input class="normal left">
+</div>
+
+<br clear="all">
+
+<div>
+  <div class="float"></div>
+  <input class="block normal negleft">
+</div>
+
+<br clear="all">
+
+<div>
+    <div class="float"></div>
+    <input class="normal negleft">
+</div>
+
index 646201ea8c21ca904abd0c561d2553e43ad4f12b..d7420372908d2c2e5e701507d7181edad2cc313b 100644 (file)
@@ -1,3 +1,12 @@
+2004-06-02  David Hyatt  <hyatt@apple.com>
+
+       Fix for 3673931, negative margins on objects that dodge floats not handled correctly.
+       
+        Reviewed by darin
+
+        * khtml/rendering/render_block.cpp:
+        (khtml::RenderBlock::layoutBlockChildren):
+
 2004-06-03  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Hyatt
         * khtml/rendering/render_canvasimage.cpp:
         (RenderCanvasImage::createDrawingContext):
 
+>>>>>>> 1.2855
 2004-06-01  Trey Matteson  <trey@apple.com>
 
        First cut at the source side of DHTML dragging.  Following IE, new events are added:
index 09a400a97f16d52100a22fee157f221b6d428b21..a52b6a226343ed45e0da8ce4f69bd787896afaa5 100644 (file)
@@ -990,8 +990,11 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
             // to shift over as necessary to dodge any floats that might get in the way.
             if (child->avoidsFloats()) {
                 int leftOff = leftOffset(m_height);
-                if (style()->textAlign() != KHTML_CENTER && child->style()->marginLeft().type != Variable)
+                if (style()->textAlign() != KHTML_CENTER && child->style()->marginLeft().type != Variable) {
+                    if (child->marginLeft() < 0)
+                        leftOff += child->marginLeft();
                     chPos = kMax(chPos, leftOff); // Let the float sit in the child's margin if it can fit.
+                }
                 else if (leftOff != xPos) {
                     // The object is shifting right. The object might be centered, so we need to
                     // recalculate our horizontal margins. Note that the containing block content
@@ -1009,9 +1012,11 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
             chPos -= child->width() + child->marginRight();
             if (child->avoidsFloats()) {
                 int rightOff = rightOffset(m_height);
-                if (style()->textAlign() != KHTML_CENTER && child->style()->marginRight().type != Variable)
+                if (style()->textAlign() != KHTML_CENTER && child->style()->marginRight().type != Variable) {
+                    if (child->marginRight() < 0)
+                        rightOff -= child->marginRight();
                     chPos = kMin(chPos, rightOff - child->width()); // Let the float sit in the child's margin if it can fit.
-                else if (rightOff != xPos) {
+                else if (rightOff != xPos) {
                     // The object is shifting left. The object might be centered, so we need to
                     // recalculate our horizontal margins. Note that the containing block content
                     // width computation will take into account the delta between |rightOff| and |xPos|