Fix for 3742585, sony dhtml menus wrong size. The percentage table height algorithm...
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Aug 2004 16:49:33 +0000 (16:49 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Aug 2004 16:49:33 +0000 (16:49 +0000)
unifies the table percentage height algorithm with the block percentage height algorithm and fixes bugs in
both.

        Reviewed by john

        * khtml/rendering/render_box.cpp:
        (RenderBox::calcPercentageHeight):
        * khtml/rendering/render_table.cpp:
        (RenderTable::layout):

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/rendering/render_box.cpp
WebCore/khtml/rendering/render_table.cpp

index 52be769ede06ef2b1d5257437d111df10108e428..7a2173b6fd9db65e537e61333321ac8120c72fa8 100644 (file)
@@ -1,3 +1,16 @@
+2004-08-30  David Hyatt  <hyatt@apple.com>
+
+       Fix for 3742585, sony dhtml menus wrong size.  The percentage table height algorithm was wrong.  This patch
+       unifies the table percentage height algorithm with the block percentage height algorithm and fixes bugs in
+       both.
+       
+        Reviewed by john
+
+        * khtml/rendering/render_box.cpp:
+        (RenderBox::calcPercentageHeight):
+        * khtml/rendering/render_table.cpp:
+        (RenderTable::layout):
+
 2004-08-31  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by me
index c807a63022ca95be400f1e516ea6c44a77c2e65f..35b5d6de3ff0f9dbddf85d9339d845b7acb8b7b7 100644 (file)
@@ -995,7 +995,17 @@ int RenderBox::calcHeightUsing(const Length& h)
 int RenderBox::calcPercentageHeight(const Length& height)
 {
     int result = -1;
+    bool includeBorderPadding = isTable();
     RenderBlock* cb = containingBlock();
+    if (style()->htmlHacks()) {
+        // In quirks mode, blocks with auto height are skipped, and we keep looking for an enclosing
+        // block that may have a specified height and then use it.  In strict mode, this violates the
+        // specification, which states that percentage heights just revert to auto if the containing
+        // block has an auto height.
+        for ( ; !cb->isCanvas() && !cb->isBody() && !cb->isTableCell() && !cb->isPositioned() &&
+                cb->style()->height().isVariable(); cb = cb->containingBlock());
+    }
+
     // Table cells violate what the CSS spec says to do with heights.  Basically we
     // don't care if the cell specified a height or not.  We just always make ourselves
     // be a percentage of the cell's current content height.
@@ -1003,11 +1013,7 @@ int RenderBox::calcPercentageHeight(const Length& height)
         result = cb->overrideSize();
         if (result == -1)
             return -1;
-        // It is necessary to use the border-box to match WinIE's broken
-        // box model.  This is essential for sizing inside
-        // table cells using percentage heights.
-        result -= (borderTop() + paddingTop() + borderBottom() + paddingBottom());
-        result = kMax(0, result);
+        includeBorderPadding = true;
     }
 
     // Otherwise we only use our percentage height if our containing block had a specified
@@ -1025,8 +1031,16 @@ int RenderBox::calcPercentageHeight(const Length& height)
         result = cb->contentHeight();
         cb->setHeight(oldHeight);
     }
-    if (result != -1)
+    if (result != -1) {
         result = height.width(result);
+        if (includeBorderPadding) {
+            // It is necessary to use the border-box to match WinIE's broken
+            // box model.  This is essential for sizing inside
+            // table cells using percentage heights.
+            result -= (borderTop() + paddingTop() + borderBottom() + paddingBottom());
+            result = kMax(0, result);
+        }
+    }
     return result;
 }
 
index 6213f8e8c9b3057e523514340a49fc16498f7c2e..d2b8dd58693541abd7aa0793fcdd6297fb51ca4c 100644 (file)
@@ -287,39 +287,13 @@ void RenderTable::layout()
     m_height = oldHeight;
 
     Length h = style()->height();
-    int th = -(bpTop + bpBottom); // Tables size as though CSS height includes border/padding.
+    int th = 0;
     if (isPositioned())
         th = newHeight; // FIXME: Leave this alone for now but investigate later.
     else if (h.isFixed())
-        th += h.value;
+        th = h.value - (bpTop + bpBottom);  // Tables size as though CSS height includes border/padding.
     else if (h.isPercent())
-    {
-        RenderObject* c = containingBlock();
-        for ( ; 
-            !c->isCanvas() && !c->isBody() && !c->isTableCell() && !c->isPositioned() && !c->isFloating(); 
-             c = c->containingBlock()) {
-            Length ch = c->style()->height();
-            if (ch.isFixed()) {
-                th += h.width(ch.value);
-                break;
-            }
-        }
-
-        if (c->isTableCell()) {
-            int cellHeight = c->overrideSize();
-            if (cellHeight != -1)
-                th += h.width(cellHeight);
-        }
-        else  {
-            Length ch = c->style()->height();
-            if (ch.isFixed())
-                th += h.width(ch.value);
-            else if (style()->htmlHacks())
-                // In quirks mode, we always expand to fill the viewRect.
-                // We need to substract out the margins of this block. -dwh
-                th += h.width(viewRect().height() - c->marginBottom() - c->marginTop());
-        }
-    }
+        th = calcPercentageHeight(h);
     th = kMax(0, th);
 
     // layout rows