Fixes for 3761411 and 3782201. This patch makes two changes to percentage heights...
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Sep 2004 17:19:26 +0000 (17:19 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Sep 2004 17:19:26 +0000 (17:19 +0000)
replaced elements always flex inside a cell (unlike blocks and tables, which do so only sometimes under bizarre
conditions that are still being guessed at by me).  The second fix is a recognition that empty tables do not
actually honor their heights, and so it is a mistake to try to flex them.

        Reviewed by mjs

        * khtml/rendering/render_table.cpp:
        (RenderTableSection::layoutRows):
        * khtml/rendering/render_table.h:
        (khtml::RenderTable::hasSections):

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

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

index f343b8e1b52d58feceeede9ea02b33ac8b1a136c..ff1d580cebcca2f3a367977d957efb18ef764c32 100644 (file)
@@ -1,3 +1,17 @@
+2004-08-31  David Hyatt  <hyatt@apple.com>
+
+       Fixes for 3761411 and 3782201.  This patch makes two changes to percentage heights.  First it makes sure that
+       replaced elements always flex inside a cell (unlike blocks and tables, which do so only sometimes under bizarre
+       conditions that are still being guessed at by me).  The second fix is a recognition that empty tables do not
+       actually honor their heights, and so it is a mistake to try to flex them.
+       
+        Reviewed by mjs
+
+        * khtml/rendering/render_table.cpp:
+        (RenderTableSection::layoutRows):
+        * khtml/rendering/render_table.h:
+        (khtml::RenderTable::hasSections):
+
 2004-08-31  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Hyatt
index d2b8dd58693541abd7aa0793fcdd6297fb51ca4c..eea4b6f283aebc3295ce83139f94f1bb3d5734d5 100644 (file)
@@ -1249,26 +1249,32 @@ int RenderTableSection::layoutRows( int toAdd )
             rHeight = rowPos[r+1] - rowPos[rindx] - vspacing;
             
             // Force percent height children to lay themselves out again.
-            // This will cause, e.g., textareas to grow to
-            // fill the area.
+            // This will cause these children to grow to fill the cell.
+            // FIXME: There is still more work to do here to fully match WinIE (should
+            // it become necessary to do so).  In quirks mode, WinIE behaves like we
+            // do, but it will clip the cells that spill out of the table section.  In
+            // strict mode, Mozilla and WinIE both regrow the table to accommodate the
+            // new height of the cell (thus letting the percentages cause growth one
+            // time only).  We may also not be handling row-spanning cells correctly.
+            //
+            // Note also the oddity where replaced elements always flex, and yet blocks/tables do
+            // not necessarily flex.  WinIE is crazy and inconsistent, and we can't hope to
+            // match the behavior perfectly, but we'll continue to refine it as we discover new
+            // bugs. :)
             bool cellChildrenFlex = false;
-            if (cell->style()->height().isFixed() || 
-                (!table()->style()->height().isVariable() && rHeight != cell->height())) {
-                // FIXME: There is still more work to do here to fully match WinIE (should
-                // it become necessary to do so).  In quirks mode, WinIE behaves like we
-                // do, but it will clip the cells that spill out of the table section.  In
-                // strict mode, Mozilla and WinIE both regrow the table to accommodate the
-                // new height of the cell (thus letting the percentages cause growth one
-                // time only).  We may also not be handling row-spanning cells correctly.
-                RenderObject* o = cell->firstChild();
-                while (o) {
-                    if (!o->isText() && o->style()->height().isPercent()) {
+            bool flexAllChildren = cell->style()->height().isFixed() || 
+                (!table()->style()->height().isVariable() && rHeight != cell->height());
+            RenderObject* o = cell->firstChild();
+            while (o) {
+                if (!o->isText() && o->style()->height().isPercent() && (o->isReplaced() || flexAllChildren)) {
+                    // Tables with no sections do not flex.
+                    if (!o->isTable() || static_cast<RenderTable*>(o)->hasSections()) {
                         o->setNeedsLayout(true, false);
                         cell->setChildNeedsLayout(true, false);
                         cellChildrenFlex = true;
                     }
-                    o = o->nextSibling();
                 }
+                o = o->nextSibling();
             }
             if (cellChildrenFlex) {
                 cell->setOverrideSize(kMax(0, 
index e1a3cfdb289d45cf5fd95b497903c5eb4656b691..bda6e61f8cc9983bdef126e93abfd26fe970c9f2 100644 (file)
@@ -172,6 +172,8 @@ public:
  
     CollapsedBorderValue* currentBorderStyle() { return m_currentBorder; }
     
+    bool hasSections() const { return head || foot || firstBody; }
+
 protected:
 
     void recalcSections();