Reviewed by Darin.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 22 Jan 2006 20:32:36 +0000 (20:32 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 22 Jan 2006 20:32:36 +0000 (20:32 +0000)
       - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=3702
         Web page is laid out incorrectly after printing with print-specific style sheet.

        Also replaced tabs with spaces in the changed files.

        Test cases:
        * fast/table/append-cells.html
        * fast/table/append-cells2.html
        * fast/table/remove-td-display-none.html

        * rendering/RenderTable.cpp:
        (WebCore::RenderTable::recalcSections): Shrink columns and columnPos to the
          actual number of columns.

        * rendering/RenderTableSection.cpp:
        (WebCore::RenderTableSection::numColumns): New function.
        (WebCore::RenderTableSection::dump): Use gridRows instead of grid.size() for row count,
          preventing crashes.

        * rendering/RenderTableSection.h: Added numColumns() and a comment about cCol/cRow.

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

17 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/table/append-cells-expected.checksum [new file with mode: 0644]
LayoutTests/fast/table/append-cells-expected.png [new file with mode: 0644]
LayoutTests/fast/table/append-cells-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/append-cells.html [new file with mode: 0644]
LayoutTests/fast/table/append-cells2-expected.checksum [new file with mode: 0644]
LayoutTests/fast/table/append-cells2-expected.png [new file with mode: 0644]
LayoutTests/fast/table/append-cells2-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/append-cells2.html [new file with mode: 0644]
LayoutTests/fast/table/remove-td-display-none-expected.checksum [new file with mode: 0644]
LayoutTests/fast/table/remove-td-display-none-expected.png [new file with mode: 0644]
LayoutTests/fast/table/remove-td-display-none-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/remove-td-display-none.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/rendering/RenderTable.cpp
WebCore/rendering/RenderTableSection.cpp
WebCore/rendering/RenderTableSection.h

index 5c7d905d7ad7f7969ee66992fee85037bec231d2..74d1301baed03bd2a6c4fe29878fc0ede4ca9d69 100644 (file)
@@ -1,3 +1,23 @@
+2006-01-22  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+       - test for http://bugzilla.opendarwin.org/show_bug.cgi?id=3702
+         Web page is laid out incorrectly after printing with print-specific style sheet
+
+        * fast/table/append-cells-expected.checksum: Added.
+        * fast/table/append-cells-expected.png: Added.
+        * fast/table/append-cells-expected.txt: Added.
+        * fast/table/append-cells.html: Added.
+        * fast/table/append-cells2-expected.checksum: Added.
+        * fast/table/append-cells2-expected.png: Added.
+        * fast/table/append-cells2-expected.txt: Added.
+        * fast/table/append-cells2.html: Added.
+        * fast/table/remove-td-display-none-expected.checksum: Added.
+        * fast/table/remove-td-display-none-expected.png: Added.
+        * fast/table/remove-td-display-none-expected.txt: Added.
+        * fast/table/remove-td-display-none.html: Added.
+
 2006-01-22  Alexander Kellett  <lypanov@kde.org>
 
         Reviewed by eseidel.
diff --git a/LayoutTests/fast/table/append-cells-expected.checksum b/LayoutTests/fast/table/append-cells-expected.checksum
new file mode 100644 (file)
index 0000000..6a23412
--- /dev/null
@@ -0,0 +1 @@
+27145fb57f8aa2cc76dc175d1649ef46
\ No newline at end of file
diff --git a/LayoutTests/fast/table/append-cells-expected.png b/LayoutTests/fast/table/append-cells-expected.png
new file mode 100644 (file)
index 0000000..4db85a1
Binary files /dev/null and b/LayoutTests/fast/table/append-cells-expected.png differ
diff --git a/LayoutTests/fast/table/append-cells-expected.txt b/LayoutTests/fast/table/append-cells-expected.txt
new file mode 100644 (file)
index 0000000..02ecbff
--- /dev/null
@@ -0,0 +1,51 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {P} at (0,0) size 784x18
+        RenderText {TEXT} at (0,0) size 303x18
+          text run at (0,0) width 303: "Both rows should have the same width (725px)."
+      RenderTable {TABLE} at (0,34) size 725x36
+        RenderTableSection {TBODY} at (0,0) size 0x36
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,0) size 181x18 [bgcolor=#7CFC00] [r=0 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 22x18
+                text run at (0,0) width 22: "cell"
+            RenderTableCell {TD} at (181,0) size 181x18 [bgcolor=#00FFFF] [r=0 c=1 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 22x18
+                text run at (0,0) width 22: "cell"
+            RenderTableCell {TD} at (362,0) size 181x18 [bgcolor=#FFFF00] [r=0 c=2 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 22x18
+                text run at (0,0) width 22: "cell"
+            RenderTableCell {TD} at (543,0) size 182x18 [bgcolor=#FFA500] [r=0 c=3 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 22x18
+                text run at (0,0) width 22: "cell"
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,18) size 181x18 [r=1 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 4x18
+                text run at (0,0) width 4: " "
+            RenderTableCell {TD} at (181,18) size 181x18 [r=1 c=1 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 4x18
+                text run at (0,0) width 4: " "
+            RenderTableCell {TD} at (362,18) size 181x18 [r=1 c=2 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 4x18
+                text run at (0,0) width 4: " "
+            RenderTableCell {TD} at (543,18) size 182x18 [r=1 c=3 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 4x18
+                text run at (0,0) width 4: " "
+      RenderTable {TABLE} at (0,70) size 725x18
+        RenderTableSection {TBODY} at (0,0) size 0x18
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,0) size 181x18 [bgcolor=#7CFC00] [r=0 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "1"
+            RenderTableCell {TD} at (181,0) size 181x18 [bgcolor=#00FFFF] [r=0 c=1 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "2"
+            RenderTableCell {TD} at (362,0) size 181x18 [bgcolor=#FFFF00] [r=0 c=2 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "3"
+            RenderTableCell {TD} at (543,0) size 182x18 [bgcolor=#FFA500] [r=0 c=3 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "4"
diff --git a/LayoutTests/fast/table/append-cells.html b/LayoutTests/fast/table/append-cells.html
new file mode 100644 (file)
index 0000000..661619f
--- /dev/null
@@ -0,0 +1,45 @@
+<html>
+<head>
+<title>Don't let appendChild break the table column count (bug 3702)</title>
+</head>
+<body>
+<p>Both rows should have the same width (725px).</p>
+<table cellpadding="0" cellspacing="0" style="table-layout: fixed; width: 725px;">
+    <tr id='first_row'>
+    </tr>
+    <tr>
+        <td>&nbsp;</td>
+        <td>&nbsp;</td>
+        <td>&nbsp;</td>
+        <td>&nbsp;</td>
+    </tr>
+</table>
+
+<!-- reference rendering -->
+<table cellpadding="0" cellspacing="0" style="table-layout: fixed; width: 725px;">
+    <tr>
+        <td style="background-color: LawnGreen;">1</td>
+        <td style="background-color: Cyan;">2</td>
+        <td style="background-color: Yellow;">3</td>
+        <td style="background-color: Orange;">4</td>
+    </tr>
+</table>
+
+
+<script>
+    firstRow = document.getElementById("first_row")
+       
+       function addCell(color) {
+        cell = document.createElement("td");
+        cell.appendChild(document.createTextNode("cell"));
+        cell.setAttribute("style", "background-color: " + color + ";");
+        firstRow.appendChild(cell);
+       }
+       
+       addCell("LawnGreen");
+       addCell("Cyan");
+       addCell("Yellow");
+       addCell("Orange");
+</script>
+</body>
+</html>
diff --git a/LayoutTests/fast/table/append-cells2-expected.checksum b/LayoutTests/fast/table/append-cells2-expected.checksum
new file mode 100644 (file)
index 0000000..ef1992d
--- /dev/null
@@ -0,0 +1 @@
+8444970885172c7b6bae89932f8b12ee
\ No newline at end of file
diff --git a/LayoutTests/fast/table/append-cells2-expected.png b/LayoutTests/fast/table/append-cells2-expected.png
new file mode 100644 (file)
index 0000000..fcbd3be
Binary files /dev/null and b/LayoutTests/fast/table/append-cells2-expected.png differ
diff --git a/LayoutTests/fast/table/append-cells2-expected.txt b/LayoutTests/fast/table/append-cells2-expected.txt
new file mode 100644 (file)
index 0000000..a9c70a9
--- /dev/null
@@ -0,0 +1,91 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {P} at (0,0) size 784x18
+        RenderText {TEXT} at (0,0) size 457x18
+          text run at (0,0) width 457: "Rows should have different number of columns, but those should match."
+      RenderTable {TABLE} at (0,34) size 725x90
+        RenderTableSection {THEAD} at (0,0) size 0x18
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,0) size 90x18 [bgcolor=#7CFC00] [r=0 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "1"
+            RenderTableCell {TD} at (90,0) size 90x18 [bgcolor=#008000] [r=0 c=1 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "1+"
+            RenderTableCell {TD} at (180,0) size 90x18 [bgcolor=#00FFFF] [r=0 c=2 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "2"
+            RenderTableCell {TD} at (270,0) size 91x18 [bgcolor=#008B8B] [r=0 c=3 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "2+"
+            RenderTableCell {TD} at (361,0) size 91x18 [bgcolor=#FFFF00] [r=0 c=4 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "3"
+            RenderTableCell {TD} at (452,0) size 91x18 [bgcolor=#FFD700] [r=0 c=5 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "3+"
+        RenderTableSection {TFOOT} at (0,72) size 0x18
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,0) size 90x18 [bgcolor=#7CFC00] [r=0 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "1"
+            RenderTableCell {TD} at (90,0) size 90x18 [bgcolor=#008000] [r=0 c=1 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "1+"
+            RenderTableCell {TD} at (180,0) size 90x18 [bgcolor=#00FFFF] [r=0 c=2 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "2"
+            RenderTableCell {TD} at (270,0) size 91x18 [bgcolor=#008B8B] [r=0 c=3 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "2+"
+            RenderTableCell {TD} at (361,0) size 91x18 [bgcolor=#FFFF00] [r=0 c=4 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "3"
+            RenderTableCell {TD} at (452,0) size 91x18 [bgcolor=#FFD700] [r=0 c=5 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "3+"
+            RenderTableCell {TD} at (543,0) size 91x18 [bgcolor=#FFA500] [r=0 c=6 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "4"
+            RenderTableCell {TD} at (634,0) size 91x18 [bgcolor=#FF8C00] [r=0 c=7 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "4+"
+        RenderTableSection {TBODY} at (0,18) size 0x54
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,0) size 90x18 [r=0 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 4x18
+                text run at (0,0) width 4: " "
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,18) size 90x18 [bgcolor=#7CFC00] [r=1 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "1"
+            RenderTableCell {TD} at (90,18) size 90x18 [bgcolor=#008000] [r=1 c=1 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "1+"
+            RenderTableCell {TD} at (180,18) size 90x18 [bgcolor=#00FFFF] [r=1 c=2 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "2"
+            RenderTableCell {TD} at (270,18) size 91x18 [bgcolor=#008B8B] [r=1 c=3 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "2+"
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,36) size 90x18 [r=2 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 4x18
+                text run at (0,0) width 4: " "
+      RenderBlock (anonymous) at (0,124) size 784x22
+        RenderButton {BUTTON} at (2,2) size 44x18 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0) none (2px outset #C0C0C0)]
+          RenderBlock (anonymous) at (8,2) size 28x13
+            RenderText {TEXT} at (0,0) size 28x13
+              text run at (0,0) width 28: "show"
+        RenderText {TEXT} at (48,1) size 4x18
+          text run at (48,1) width 4: " "
+        RenderButton {BUTTON} at (54,2) size 40x18 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0) none (2px outset #C0C0C0)]
+          RenderBlock (anonymous) at (8,2) size 24x13
+            RenderText {TEXT} at (0,0) size 24x13
+              text run at (0,0) width 24: "hide"
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
diff --git a/LayoutTests/fast/table/append-cells2.html b/LayoutTests/fast/table/append-cells2.html
new file mode 100644 (file)
index 0000000..f6f60b2
--- /dev/null
@@ -0,0 +1,51 @@
+<html>
+<head>
+<title>Add/remove "display: none" to table elements (bug 3702)</title>
+<style type="text/css">
+.navbar{display: none;}
+</style>
+</head>
+<body onLoad="javascript:document.styleSheets[0].deleteRule(0);">
+<p>Rows should have different number of columns, but those should match.</p>
+<table cellpadding="0" cellspacing="0" style="table-layout: fixed; width: 725px;">
+  <thead>
+    <tr>
+        <td class="navbar" style="background-color: LawnGreen;">1</td>
+        <td style="background-color: Green;">1+</td>
+        <td class="navbar" style="background-color: Cyan;">2</td>
+        <td style="background-color: DarkCyan;">2+</td>
+        <td class="navbar" style="background-color: Yellow;">3</td>
+        <td style="background-color: Gold;">3+</td>
+    </tr>
+  </thead>
+  <tfoot>
+    <tr>
+        <td class="navbar" style="background-color: LawnGreen;">1</td>
+        <td style="background-color: Green;">1+</td>
+        <td class="navbar" style="background-color: Cyan;">2</td>
+        <td style="background-color: DarkCyan;">2+</td>
+        <td class="navbar" style="background-color: Yellow;">3</td>
+        <td style="background-color: Gold;">3+</td>
+        <td class="navbar" style="background-color: Orange;">4</td>
+        <td style="background-color: DarkOrange;">4+</td>
+    </tr>
+  </tfoot>
+  <tbody>
+    <tr valign="top">
+        <td>&nbsp;</td>
+    </tr>
+    <tr>
+        <td class="navbar" style="background-color: LawnGreen;">1</td>
+        <td style="background-color: Green;">1+</td>
+        <td class="navbar" style="background-color: Cyan;">2</td>
+        <td style="background-color: DarkCyan;">2+</td>
+    </tr>
+    <tr valign="top">
+        <td>&nbsp;</td>
+    </tr>
+  </tbody>
+</table>
+<button onClick="javascript:document.styleSheets[0].deleteRule(0);">show</button>
+<button onClick="javascript:document.styleSheets[0].insertRule('.navbar {display: none;}', 0);">hide</button>
+</body>
+</html>
diff --git a/LayoutTests/fast/table/remove-td-display-none-expected.checksum b/LayoutTests/fast/table/remove-td-display-none-expected.checksum
new file mode 100644 (file)
index 0000000..2a85fc3
--- /dev/null
@@ -0,0 +1 @@
+604bb30477db635d3aeb4f3d0d505b25
\ No newline at end of file
diff --git a/LayoutTests/fast/table/remove-td-display-none-expected.png b/LayoutTests/fast/table/remove-td-display-none-expected.png
new file mode 100644 (file)
index 0000000..5d424c5
Binary files /dev/null and b/LayoutTests/fast/table/remove-td-display-none-expected.png differ
diff --git a/LayoutTests/fast/table/remove-td-display-none-expected.txt b/LayoutTests/fast/table/remove-td-display-none-expected.txt
new file mode 100644 (file)
index 0000000..8c243df
--- /dev/null
@@ -0,0 +1,68 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {P} at (0,0) size 784x18
+        RenderText {TEXT} at (0,0) size 303x18
+          text run at (0,0) width 303: "Both rows should have the same width (725px)."
+      RenderTable {TABLE} at (0,34) size 725x36
+        RenderTableSection {TBODY} at (0,0) size 0x36
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,0) size 90x18 [bgcolor=#7CFC00] [r=0 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "1"
+            RenderTableCell {TD} at (90,0) size 90x18 [bgcolor=#008000] [r=0 c=1 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "1+"
+            RenderTableCell {TD} at (180,0) size 90x18 [bgcolor=#00FFFF] [r=0 c=2 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "2"
+            RenderTableCell {TD} at (270,0) size 91x18 [bgcolor=#008B8B] [r=0 c=3 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "2+"
+            RenderTableCell {TD} at (361,0) size 91x18 [bgcolor=#FFFF00] [r=0 c=4 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "3"
+            RenderTableCell {TD} at (452,0) size 91x18 [bgcolor=#FFD700] [r=0 c=5 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "3+"
+            RenderTableCell {TD} at (543,0) size 91x18 [bgcolor=#FFA500] [r=0 c=6 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "4"
+            RenderTableCell {TD} at (634,0) size 91x18 [bgcolor=#FF8C00] [r=0 c=7 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 17x18
+                text run at (0,0) width 17: "4+"
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,18) size 90x18 [r=1 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 4x18
+                text run at (0,0) width 4: " "
+      RenderTable {TABLE} at (0,70) size 725x18
+        RenderTableSection {TBODY} at (0,0) size 0x18
+          RenderTableRow {TR} at (0,0) size 0x0
+            RenderTableCell {TD} at (0,0) size 181x18 [bgcolor=#7CFC00] [r=0 c=0 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "1"
+            RenderTableCell {TD} at (181,0) size 181x18 [bgcolor=#00FFFF] [r=0 c=1 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "2"
+            RenderTableCell {TD} at (362,0) size 181x18 [bgcolor=#FFFF00] [r=0 c=2 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "3"
+            RenderTableCell {TD} at (543,0) size 182x18 [bgcolor=#FFA500] [r=0 c=3 rs=1 cs=1]
+              RenderText {TEXT} at (0,0) size 8x18
+                text run at (0,0) width 8: "4"
+      RenderBlock (anonymous) at (0,88) size 784x22
+        RenderButton {BUTTON} at (2,2) size 44x18 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0) none (2px outset #C0C0C0)]
+          RenderBlock (anonymous) at (8,2) size 28x13
+            RenderText {TEXT} at (0,0) size 28x13
+              text run at (0,0) width 28: "show"
+        RenderText {TEXT} at (48,1) size 4x18
+          text run at (48,1) width 4: " "
+        RenderButton {BUTTON} at (54,2) size 40x18 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0) none (2px outset #C0C0C0)]
+          RenderBlock (anonymous) at (8,2) size 24x13
+            RenderText {TEXT} at (0,0) size 24x13
+              text run at (0,0) width 24: "hide"
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
diff --git a/LayoutTests/fast/table/remove-td-display-none.html b/LayoutTests/fast/table/remove-td-display-none.html
new file mode 100644 (file)
index 0000000..09a912d
--- /dev/null
@@ -0,0 +1,36 @@
+<html>
+<head>
+<title>Add/remove "display: none" to table elements (bug 3702)</title>
+<style type="text/css">
+.navbar{display: none;}
+</style>
+</head>
+<body onLoad="javascript:document.styleSheets[0].deleteRule(0);">
+<p>Both rows should have the same width (725px).</p>
+<table cellpadding="0" cellspacing="0" style="table-layout: fixed; width: 725px;">
+    <tr id='first_row'>
+        <td class="navbar" style="background-color: LawnGreen;">1</td>
+        <td style="background-color: Green;">1+</td>
+        <td class="navbar" style="background-color: Cyan;">2</td>
+        <td style="background-color: DarkCyan;">2+</td>
+        <td class="navbar" style="background-color: Yellow;">3</td>
+        <td style="background-color: Gold;">3+</td>
+        <td class="navbar" style="background-color: Orange;">4</td>
+        <td style="background-color: DarkOrange;">4+</td>
+    </tr>
+    <tr valign="top">
+        <td>&nbsp;</td>
+    </tr>
+</table>
+<table cellpadding="0" cellspacing="0" style="table-layout: fixed; width: 725px;">
+    <tr>
+        <td style="background-color: LawnGreen;">1</td>
+        <td style="background-color: Cyan;">2</td>
+        <td style="background-color: Yellow;">3</td>
+        <td style="background-color: Orange;">4</td>
+    </tr>
+</table>
+<button onClick="javascript:document.styleSheets[0].deleteRule(0);">show</button>
+<button onClick="javascript:document.styleSheets[0].insertRule('.navbar {display: none;}', 0);">hide</button>
+</body>
+</html>
index 7b076bf7306ac7049acc1e1f312b0832c82dc289..9b76736b0951d91a957fe0bc88023a614744db84 100644 (file)
@@ -1,3 +1,28 @@
+2006-01-22  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+       - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=3702
+         Web page is laid out incorrectly after printing with print-specific style sheet.
+
+        Also replaced tabs with spaces in the changed files.
+
+        Test cases: 
+        * fast/table/append-cells.html
+        * fast/table/append-cells2.html
+        * fast/table/remove-td-display-none.html
+
+        * rendering/RenderTable.cpp:
+        (WebCore::RenderTable::recalcSections): Shrink columns and columnPos to the
+          actual number of columns.
+
+        * rendering/RenderTableSection.cpp:
+        (WebCore::RenderTableSection::numColumns): New function.
+        (WebCore::RenderTableSection::dump): Use gridRows instead of grid.size() for row count,
+          preventing crashes.
+
+        * rendering/RenderTableSection.h: Added numColumns() and a comment about cCol/cRow.
+
 2006-01-22  Darin Adler  <darin@apple.com>
 
         Reviewed by Anders.
         * khtml/xml/xml_tokenizer.cpp: (WebCore::XMLTokenizer::startElementNs):
         Removed unneeded isHTMLElement() calls from before the "qualified name" change.
 
-2006-01-22  Eric Seidel  <eseidel@apple.com
+2006-01-22  Eric Seidel  <eseidel@apple.com>
 
         Rubber-stamped by anders.
 
index 22cd9ba120d532593a61696db6fc3d9edf184fa3..cd941fb9ea7c5196ba5263489c8f2a3756610204 100644 (file)
@@ -7,6 +7,7 @@
  *           (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -79,14 +80,14 @@ void RenderTable::setStyle(RenderStyle *_style)
     columnPos[0] = hspacing;
 
     if (!tableLayout || style()->tableLayout() != oldTableLayout) {
-       delete tableLayout;
+        delete tableLayout;
 
         // According to the CSS2 spec, you only use fixed table layout if an
         // explicit width is specified on the table.  Auto width implies auto table layout.
-       if (style()->tableLayout() == TFIXED && !style()->width().isAuto())
-           tableLayout = new FixedTableLayout(this);
-       else
-           tableLayout = new AutoTableLayout(this);
+        if (style()->tableLayout() == TFIXED && !style()->width().isAuto())
+            tableLayout = new FixedTableLayout(this);
+        else
+            tableLayout = new AutoTableLayout(this);
     }
 }
 
@@ -168,7 +169,7 @@ void RenderTable::calcWidth()
 
     LengthType widthType = style()->width().type;
     if (widthType > Relative && style()->width().value > 0) {
-       // Percent or fixed table
+        // Percent or fixed table
         m_width = style()->width().minWidth(availableWidth);
         if (m_minWidth > m_width) m_width = m_minWidth;
     } else {
@@ -237,13 +238,13 @@ void RenderTable::layout()
 
     RenderObject *child = firstChild();
     while(child) {
-       if (child->needsLayout() && !(child->element() && child->element()->hasTagName(formTag)))
-           child->layout();
-       if (child->isTableSection()) {
-           static_cast<RenderTableSection *>(child)->calcRowHeight();
-           calculatedHeight += static_cast<RenderTableSection *>(child)->layoutRows(0);
-       }
-       child = child->nextSibling();
+        if (child->needsLayout() && !(child->element() && child->element()->hasTagName(formTag)))
+            child->layout();
+        if (child->isTableSection()) {
+            static_cast<RenderTableSection *>(child)->calcRowHeight();
+            calculatedHeight += static_cast<RenderTableSection *>(child)->layoutRows(0);
+        }
+        child = child->nextSibling();
     }
 
     // ### collapse caption margin
@@ -274,10 +275,10 @@ void RenderTable::layout()
 
     // layout rows
     if (th > calculatedHeight) {
-       // we have to redistribute that height to get the constraint correctly
-       // just force the first body to the height needed
-       // ### FIXME This should take height constraints on all table sections into account and distribute
-       // accordingly. For now this should be good enough
+        // we have to redistribute that height to get the constraint correctly
+        // just force the first body to the height needed
+        // ### FIXME This should take height constraints on all table sections into account and distribute
+        // accordingly. For now this should be good enough
         if (firstBody) {
             firstBody->calcRowHeight();
             firstBody->layoutRows(th - calculatedHeight);
@@ -295,18 +296,18 @@ void RenderTable::layout()
 
     // position the table sections
     if (head) {
-       head->setPos(bl, m_height);
-       m_height += head->height();
+        head->setPos(bl, m_height);
+        m_height += head->height();
     }
     for (RenderObject *body = firstBody; body; body = body->nextSibling()) {
-       if (body != head && body != foot && body->isTableSection()) {
-           body->setPos(bl, m_height);
-           m_height += body->height();
-       }
+        if (body != head && body != foot && body->isTableSection()) {
+            body->setPos(bl, m_height);
+            m_height += body->height();
+        }
     }
     if (foot) {
-       foot->setPos(bl, m_height);
-       m_height += foot->height();
+        foot->setPos(bl, m_height);
+        m_height += foot->height();
     }
 
     m_height += bpBottom;
@@ -333,8 +334,8 @@ void RenderTable::layout()
 void RenderTable::setCellWidths()
 {
     for (RenderObject *child = firstChild(); child; child = child->nextSibling())
-       if ( child->isTableSection() )
-           static_cast<RenderTableSection *>(child)->setCellWidths();
+        if ( child->isTableSection() )
+            static_cast<RenderTableSection *>(child)->setCellWidths();
 }
 
 void RenderTable::paint(PaintInfo& i, int _tx, int _ty)
@@ -364,7 +365,7 @@ void RenderTable::paint(PaintInfo& i, int _tx, int _ty)
     
     for (RenderObject *child = firstChild(); child; child = child->nextSibling())
         if (child->isTableSection() || child == tCaption)
-           child->paint(paintInfo, _tx, _ty);
+            child->paint(paintInfo, _tx, _ty);
 
     if (collapseBorders() && paintAction == PaintActionChildBlockBackground && style()->visibility() == VISIBLE) {
         // Collect all the unique border styles that we want to paint in a sorted list.  Once we
@@ -419,7 +420,7 @@ void RenderTable::calcMinMaxWidth()
     KHTMLAssert(!minMaxKnown());
 
     if (needSectionRecalc)
-       recalcSections();
+        recalcSections();
 
     tableLayout->calcMinMaxWidth();
 
@@ -443,19 +444,19 @@ void RenderTable::splitColumn(int pos, int firstSpan)
 
     // change width of all rows.
     for (RenderObject *child = firstChild(); child; child = child->nextSibling()) {
-       if (child->isTableSection()) {
-           RenderTableSection *section = static_cast<RenderTableSection *>(child);
-           if (section->cCol > pos)
-               section->cCol++;
-           int size = section->numRows();
-           for (int row = 0; row < size; ++row) {
-               section->grid[row].row->resize(oldSize + 1);
-               RenderTableSection::Row &r = *section->grid[row].row;
-               memmove(r.data() + pos + 1, r.data() + pos, (oldSize - pos) * sizeof(RenderTableSection::CellStruct));
-               r[pos + 1].cell = 0;
+        if (child->isTableSection()) {
+            RenderTableSection *section = static_cast<RenderTableSection *>(child);
+            if (section->cCol > pos)
+                section->cCol++;
+            int size = section->numRows();
+            for (int row = 0; row < size; ++row) {
+                section->grid[row].row->resize(oldSize + 1);
+                RenderTableSection::Row &r = *section->grid[row].row;
+                memmove(r.data() + pos + 1, r.data() + pos, (oldSize - pos) * sizeof(RenderTableSection::CellStruct));
+                r[pos + 1].cell = 0;
                 r[pos + 1].inColSpan = r[pos].inColSpan || r[pos].cell;
-           }
-       }
+            }
+        }
     }
     columnPos.resize(numEffCols() + 1);
     setNeedsLayoutAndMinMaxRecalc();
@@ -471,16 +472,16 @@ void RenderTable::appendColumn(int span)
 
     // change width of all rows.
     for (RenderObject *child = firstChild(); child; child = child->nextSibling()) {
-       if (child->isTableSection()) {
-           RenderTableSection *section = static_cast<RenderTableSection *>(child);
-           int size = section->numRows();
-           for (int row = 0; row < size; ++row) {
-               section->grid[row].row->resize(newSize);
+        if (child->isTableSection()) {
+            RenderTableSection *section = static_cast<RenderTableSection *>(child);
+            int size = section->numRows();
+            for (int row = 0; row < size; ++row) {
+                section->grid[row].row->resize(newSize);
                 RenderTableSection::CellStruct& c = section->cellAt(row, pos);
-               c.cell = 0;
-               c.inColSpan = false;
-           }
-       }
+                c.cell = 0;
+                c.inColSpan = false;
+            }
+        }
     }
     columnPos.resize(numEffCols() + 1);
     setNeedsLayoutAndMinMaxRecalc();
@@ -488,29 +489,29 @@ void RenderTable::appendColumn(int span)
 
 RenderTableCol *RenderTable::colElement(int col) {
     if (!has_col_elems)
-       return 0;
+        return 0;
     RenderObject *child = firstChild();
     int cCol = 0;
     while (child) {
-       if (child->isTableCol()) {
-           RenderTableCol *colElem = static_cast<RenderTableCol *>(child);
-           int span = colElem->span();
-           if (!colElem->firstChild()) {
-               cCol += span;
-               if (cCol > col)
-                   return colElem;
-           }
-
-           RenderObject *next = child->firstChild();
-           if (!next)
-               next = child->nextSibling();
-           if (!next && child->parent()->isTableCol())
-               next = child->parent()->nextSibling();
-           child = next;
-       } else if (child == tCaption)
+        if (child->isTableCol()) {
+            RenderTableCol *colElem = static_cast<RenderTableCol *>(child);
+            int span = colElem->span();
+            if (!colElem->firstChild()) {
+                cCol += span;
+                if (cCol > col)
+                    return colElem;
+            }
+
+            RenderObject *next = child->firstChild();
+            if (!next)
+                next = child->nextSibling();
+            if (!next && child->parent()->isTableCol())
+                next = child->parent()->nextSibling();
+            child = next;
+        } else if (child == tCaption)
             child = child->nextSibling();
         else
-           break;
+            break;
     }
     return 0;
 }
@@ -523,7 +524,7 @@ void RenderTable::recalcSections()
 
     // We need to get valid pointers to caption, head, foot and firstbody again
     for (RenderObject *child = firstChild(); child; child = child->nextSibling()) {
-       switch (child->style()->display()) {
+        switch (child->style()->display()) {
             case TABLE_CAPTION:
                 if (!tCaption) {
                     tCaption = static_cast<RenderBlock*>(child);
@@ -563,8 +564,23 @@ void RenderTable::recalcSections()
             }
             default:
                 break;
-       }
+        }
     }
+
+    // repair column count (addChild can grow it too much, because it always adds elements to the last row of a section)
+    int maxCols = 0;
+    for (RenderObject *child = firstChild(); child; child = child->nextSibling()) {
+        if (child->isTableSection()) {
+            RenderTableSection *section = static_cast<RenderTableSection *>(child);
+            int sectionCols = section->numColumns();
+            if (sectionCols > maxCols)
+                maxCols = sectionCols;
+        }
+    }
+    
+    columns.resize(maxCols);
+    columnPos.resize(maxCols+1);
+    
     needSectionRecalc = false;
     setNeedsLayout(true);
 }
@@ -726,15 +742,15 @@ void RenderTable::updateFirstLetter()
 void RenderTable::dump(QTextStream *stream, QString ind) const
 {
     if (tCaption)
-       *stream << " tCaption";
+        *stream << " tCaption";
     if (head)
-       *stream << " head";
+        *stream << " head";
     if (foot)
-       *stream << " foot";
+        *stream << " foot";
 
     *stream << endl << ind << "cspans:";
     for ( unsigned int i = 0; i < columns.size(); i++ )
-       *stream << " " << columns[i].span;
+        *stream << " " << columns[i].span;
     *stream << endl << ind;
 
     RenderBlock::dump(stream,ind);
index 787b8e806f665a488a044d85efeafd6b38fbb40b..35c26e911e88b7ff71298a025f411456e9dfcdf5 100644 (file)
@@ -7,6 +7,7 @@
  *           (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -90,20 +91,20 @@ void RenderTableSection::addChild(RenderObject *child, RenderObject *beforeChild
         if (beforeChild && beforeChild->isAnonymous())
             row = beforeChild;
         else {
-           RenderObject *lastBox = beforeChild;
-           while (lastBox && lastBox->parent()->isAnonymous() && !lastBox->isTableRow())
-               lastBox = lastBox->parent();
-           if (lastBox && lastBox->isAnonymous()) {
-               lastBox->addChild( child, beforeChild );
-               return;
-           } else {
-               row = new (renderArena()) RenderTableRow(document() /* anonymous table */);
-               RenderStyle *newStyle = new (renderArena()) RenderStyle();
-               newStyle->inheritFrom(style());
-               newStyle->setDisplay(TABLE_ROW);
-               row->setStyle(newStyle);
-               addChild(row, beforeChild);
-           }
+            RenderObject *lastBox = beforeChild;
+            while (lastBox && lastBox->parent()->isAnonymous() && !lastBox->isTableRow())
+                lastBox = lastBox->parent();
+            if (lastBox && lastBox->isAnonymous()) {
+                lastBox->addChild( child, beforeChild );
+                return;
+            } else {
+                row = new (renderArena()) RenderTableRow(document() /* anonymous table */);
+                RenderStyle *newStyle = new (renderArena()) RenderStyle();
+                newStyle->inheritFrom(style());
+                newStyle->setDisplay(TABLE_ROW);
+                row->setStyle(newStyle);
+                addChild(row, beforeChild);
+            }
         }
         row->addChild(child);
         child->setNeedsLayoutAndMinMaxRecalc();
@@ -111,7 +112,7 @@ void RenderTableSection::addChild(RenderObject *child, RenderObject *beforeChild
     }
 
     if (beforeChild)
-       setNeedCellRecalc();
+        setNeedCellRecalc();
 
     cRow++;
     cCol = 0;
@@ -141,12 +142,12 @@ bool RenderTableSection::ensureRows(int numRows)
         CellStruct emptyCellStruct;
         emptyCellStruct.cell = 0;
         emptyCellStruct.inColSpan = false;
-       for (int r = nRows; r < numRows; r++) {
-           grid[r].row = new Row(nCols);
-           grid[r].row->fill(emptyCellStruct);
-           grid[r].baseLine = 0;
-           grid[r].height = Length();
-       }
+        for (int r = nRows; r < numRows; r++) {
+            grid[r].row = new Row(nCols);
+            grid[r].row->fill(emptyCellStruct);
+            grid[r].baseLine = 0;
+            grid[r].height = Length();
+        }
     }
 
     return true;
@@ -167,14 +168,14 @@ void RenderTableSection::addCell(RenderTableCell *cell)
     // </TABLE>
 
     while (cCol < nCols && (cellAt(cRow, cCol).cell || cellAt(cRow, cCol).inColSpan))
-       cCol++;
+        cCol++;
 
     if (rSpan == 1) {
-       // we ignore height settings on rowspan cells
-       Length height = cell->style()->height();
-       if (height.value > 0 || (height.type == Relative && height.value >= 0)) {
-           Length cRowHeight = grid[cRow].height;
-           switch (height.type) {
+        // we ignore height settings on rowspan cells
+        Length height = cell->style()->height();
+        if (height.value > 0 || (height.type == Relative && height.value >= 0)) {
+            Length cRowHeight = grid[cRow].height;
+            switch (height.type) {
                 case Percent:
                     if (!(cRowHeight.type == Percent) ||
                         (cRowHeight.type == Percent && cRowHeight.value < height.value))
@@ -188,8 +189,8 @@ void RenderTableSection::addCell(RenderTableCell *cell)
                 case Relative:
                 default:
                     break;
-           }
-       }
+            }
+        }
     }
 
     // make sure we have enough rows
@@ -202,31 +203,31 @@ void RenderTableSection::addCell(RenderTableCell *cell)
     currentCell.cell = cell;
     currentCell.inColSpan = false;
     while (cSpan) {
-       int currentSpan;
-       if (cCol >= nCols) {
-           table()->appendColumn(cSpan);
-           currentSpan = cSpan;
-       } else {
-           if (cSpan < columns[cCol].span)
-               table()->splitColumn(cCol, cSpan);
-           currentSpan = columns[cCol].span;
-       }
-
-       for (int r = 0; r < rSpan; r++) {
+        int currentSpan;
+        if (cCol >= nCols) {
+            table()->appendColumn(cSpan);
+            currentSpan = cSpan;
+        } else {
+            if (cSpan < columns[cCol].span)
+                table()->splitColumn(cCol, cSpan);
+            currentSpan = columns[cCol].span;
+        }
+
+        for (int r = 0; r < rSpan; r++) {
             CellStruct& c = cellAt(cRow + r, cCol);
             if (currentCell.cell && !c.cell)
                 c.cell = currentCell.cell;
             if (currentCell.inColSpan)
                 c.inColSpan = true;
-       }
-       cCol++;
-       cSpan -= currentSpan;
+        }
+        cCol++;
+        cSpan -= currentSpan;
         currentCell.cell = 0;
-       currentCell.inColSpan = true;
+        currentCell.inColSpan = true;
     }
     if (cell) {
-       cell->setRow(cRow);
-       cell->setCol(table()->effColToCol(col));
+        cell->setRow(cRow);
+        cell->setCol(table()->effColToCol(col));
     }
 }
 
@@ -238,27 +239,27 @@ void RenderTableSection::setCellWidths()
 
     int rows = gridRows;
     for (int i = 0; i < rows; i++) {
-       Row &row = *grid[i].row;
-       int cols = row.size();
-       for (int j = 0; j < cols; j++) {
-           CellStruct current = row[j];
+        Row &row = *grid[i].row;
+        int cols = row.size();
+        for (int j = 0; j < cols; j++) {
+            CellStruct current = row[j];
             RenderTableCell *cell = current.cell;
 
-           if (!cell)
-               continue;
-           int endCol = j;
-           int cspan = cell->colSpan();
-           while (cspan && endCol < cols) {
-               cspan -= table()->columns[endCol].span;
-               endCol++;
-           }
-           int w = columnPos[endCol] - columnPos[j] - table()->hBorderSpacing();
-           int oldWidth = cell->width();
-           if (w != oldWidth) {
-               cell->setNeedsLayout(true);
-               cell->setWidth(w);
-           }
-       }
+            if (!cell)
+                continue;
+            int endCol = j;
+            int cspan = cell->colSpan();
+            while (cspan && endCol < cols) {
+                cspan -= table()->columns[endCol].span;
+                endCol++;
+            }
+            int w = columnPos[endCol] - columnPos[j] - table()->hBorderSpacing();
+            int oldWidth = cell->width();
+            if (w != oldWidth) {
+                cell->setNeedsLayout(true);
+                cell->setWidth(w);
+            }
+        }
     }
 }
 
@@ -275,30 +276,30 @@ void RenderTableSection::calcRowHeight()
     rowPos[0] = spacing;
 
     for (int r = 0; r < totalRows; r++) {
-       rowPos[r + 1] = 0;
+        rowPos[r + 1] = 0;
 
-       int baseline = 0;
-       int bdesc = 0;
-       int ch = grid[r].height.minWidth(0);
-       int pos = rowPos[r + 1] + ch + spacing;
+        int baseline = 0;
+        int bdesc = 0;
+        int ch = grid[r].height.minWidth(0);
+        int pos = rowPos[r + 1] + ch + spacing;
 
-       if (pos > rowPos[r + 1])
-           rowPos[r + 1] = pos;
+        if (pos > rowPos[r + 1])
+            rowPos[r + 1] = pos;
 
-       Row *row = grid[r].row;
-       int totalCols = row->size();
-       int totalRows = gridRows;
+        Row *row = grid[r].row;
+        int totalCols = row->size();
+        int totalRows = gridRows;
 
-       for (int c = 0; c < totalCols; c++) {
-           CellStruct current = cellAt(r, c);
+        for (int c = 0; c < totalCols; c++) {
+            CellStruct current = cellAt(r, c);
             cell = current.cell;
-           if (!cell || current.inColSpan)
-               continue;
-           if (r < totalRows - 1 && cellAt(r + 1, c).cell == cell)
-               continue;
+            if (!cell || current.inColSpan)
+                continue;
+            if (r < totalRows - 1 && cellAt(r + 1, c).cell == cell)
+                continue;
 
-           if ((indx = r - cell->rowSpan() + 1) < 0)
-               indx = 0;
+            if ((indx = r - cell->rowSpan() + 1) < 0)
+                indx = 0;
 
             if (cell->overrideSize() != -1) {
                 cell->setOverrideSize(-1);
@@ -308,22 +309,22 @@ void RenderTableSection::calcRowHeight()
             
             // Explicit heights use the border box in quirks mode.  In strict mode do the right
             // thing and actually add in the border and padding.
-           ch = cell->style()->height().width(0) + 
+            ch = cell->style()->height().width(0) + 
                 (cell->style()->htmlHacks() ? 0 : (cell->paddingTop() + cell->paddingBottom() +
                                                    cell->borderTop() + cell->borderBottom()));
-           if (cell->height() > ch)
-               ch = cell->height();
+            if (cell->height() > ch)
+                ch = cell->height();
 
             pos = rowPos[ indx ] + ch + spacing;
 
-           if (pos > rowPos[r + 1])
-               rowPos[r + 1] = pos;
+            if (pos > rowPos[r + 1])
+                rowPos[r + 1] = pos;
 
-           // find out the baseline
-           EVerticalAlign va = cell->style()->verticalAlign();
-           if (va == BASELINE || va == TEXT_BOTTOM || va == TEXT_TOP
-               || va == SUPER || va == SUB) {
-               int b = cell->baselinePosition();
+            // find out the baseline
+            EVerticalAlign va = cell->style()->verticalAlign();
+            if (va == BASELINE || va == TEXT_BOTTOM || va == TEXT_TOP
+                || va == SUPER || va == SUB) {
+                int b = cell->baselinePosition();
                 if (b > cell->borderTop() + cell->paddingTop()) {
                     if (b > baseline)
                         baseline = b;
@@ -332,21 +333,21 @@ void RenderTableSection::calcRowHeight()
                     if (td > bdesc)
                         bdesc = td;
                 }
-           }
-       }
+            }
+        }
 
-       //do we have baseline aligned elements?
-       if (baseline) {
-           // increase rowheight if baseline requires
-           int bRowPos = baseline + bdesc  + spacing ; // + 2*padding
-           if (rowPos[r + 1] < bRowPos)
-               rowPos[r + 1] = bRowPos;
+        //do we have baseline aligned elements?
+        if (baseline) {
+            // increase rowheight if baseline requires
+            int bRowPos = baseline + bdesc  + spacing ; // + 2*padding
+            if (rowPos[r + 1] < bRowPos)
+                rowPos[r + 1] = bRowPos;
 
-           grid[r].baseLine = baseline;
-       }
+            grid[r].baseLine = baseline;
+        }
 
-       if (rowPos[r + 1] < rowPos[r])
-           rowPos[r + 1] = rowPos[r];
+        if (rowPos[r + 1] < rowPos[r])
+            rowPos[r + 1] = rowPos[r];
     }
 }
 
@@ -360,53 +361,53 @@ int RenderTableSection::layoutRows(int toAdd)
     
     if (toAdd && totalRows && (rowPos[totalRows] || !nextSibling())) {
 
-       int totalHeight = rowPos[totalRows] + toAdd;
+        int totalHeight = rowPos[totalRows] + toAdd;
 
         int dh = toAdd;
-       int totalPercent = 0;
-       int numAuto = 0;
-       for (int r = 0; r < totalRows; r++) {
-           if (grid[r].height.type == Auto)
-               numAuto++;
-           else if (grid[r].height.type == Percent)
-               totalPercent += grid[r].height.value;
-       }
-       if (totalPercent) {
-           // try to satisfy percent
-           int add = 0;
-           if (totalPercent > 100)
-               totalPercent = 100;
-           int rh = rowPos[1] - rowPos[0];
-           for (int r = 0; r < totalRows; r++) {
-               if (totalPercent > 0 && grid[r].height.type == Percent) {
-                   int toAdd = kMin(dh, (totalHeight * grid[r].height.value / 100) - rh);
+        int totalPercent = 0;
+        int numAuto = 0;
+        for (int r = 0; r < totalRows; r++) {
+            if (grid[r].height.type == Auto)
+                numAuto++;
+            else if (grid[r].height.type == Percent)
+                totalPercent += grid[r].height.value;
+        }
+        if (totalPercent) {
+            // try to satisfy percent
+            int add = 0;
+            if (totalPercent > 100)
+                totalPercent = 100;
+            int rh = rowPos[1] - rowPos[0];
+            for (int r = 0; r < totalRows; r++) {
+                if (totalPercent > 0 && grid[r].height.type == Percent) {
+                    int toAdd = kMin(dh, (totalHeight * grid[r].height.value / 100) - rh);
                     // If toAdd is negative, then we don't want to shrink the row (this bug
                     // affected Outlook Web Access).
                     toAdd = kMax(0, toAdd);
-                   add += toAdd;
-                   dh -= toAdd;
-                   totalPercent -= grid[r].height.value;
-               }
-               if (r < totalRows - 1)
-                   rh = rowPos[r + 2] - rowPos[r + 1];
+                    add += toAdd;
+                    dh -= toAdd;
+                    totalPercent -= grid[r].height.value;
+                }
+                if (r < totalRows - 1)
+                    rh = rowPos[r + 2] - rowPos[r + 1];
                 rowPos[r + 1] += add;
-           }
-       }
-       if (numAuto) {
-           // distribute over variable cols
-           int add = 0;
-           for (int r = 0; r < totalRows; r++) {
-               if (numAuto > 0 && grid[r].height.type == Auto) {
-                   int toAdd = dh/numAuto;
-                   add += toAdd;
-                   dh -= toAdd;
+            }
+        }
+        if (numAuto) {
+            // distribute over variable cols
+            int add = 0;
+            for (int r = 0; r < totalRows; r++) {
+                if (numAuto > 0 && grid[r].height.type == Auto) {
+                    int toAdd = dh/numAuto;
+                    add += toAdd;
+                    dh -= toAdd;
                     numAuto--;
-               }
+                }
                 rowPos[r + 1] += add;
-           }
-       }
+            }
+        }
         if (dh > 0 && rowPos[totalRows]) {
-           // if some left overs, distribute equally.
+            // if some left overs, distribute equally.
             int tot = rowPos[totalRows];
             int add = 0;
             int prev = rowPos[0];
@@ -423,8 +424,8 @@ int RenderTableSection::layoutRows(int toAdd)
 
     int nEffCols = table()->numEffCols();
     for (int r = 0; r < totalRows; r++) {
-       Row *row = grid[r].row;
-       int totalCols = row->size();
+        Row *row = grid[r].row;
+        int totalCols = row->size();
         for (int c = 0; c < nEffCols; c++) {
             CellStruct current = cellAt(r, c);
             RenderTableCell* cell = current.cell;
@@ -432,7 +433,7 @@ int RenderTableSection::layoutRows(int toAdd)
             if (!cell)
                 continue;
             if (r < totalRows - 1 && cell == cellAt(r + 1, c).cell)
-               continue;
+                continue;
 
             if ((rindx = r-cell->rowSpan() + 1) < 0)
                 rindx = 0;
@@ -511,9 +512,9 @@ int RenderTableSection::layoutRows(int toAdd)
         
             if (style()->direction() == RTL) {
                 cell->setPos(
-                   table()->columnPos[(int)totalCols] -
-                   table()->columnPos[table()->colToEffCol(cell->col()+cell->colSpan())] +
-                   leftOffset,
+                    table()->columnPos[(int)totalCols] -
+                    table()->columnPos[table()->colToEffCol(cell->col()+cell->colSpan())] +
+                    leftOffset,
                     rowPos[rindx]);
             } else
                 cell->setPos(table()->columnPos[c] + leftOffset, rowPos[rindx]);
@@ -551,49 +552,49 @@ void RenderTableSection::paint(PaintInfo& i, int tx, int ty)
     unsigned int startrow = 0;
     unsigned int endrow = totalRows;
     for (; startrow < totalRows; startrow++)
-       if (ty + rowPos[startrow+1] >= y - os)
-           break;
+        if (ty + rowPos[startrow+1] >= y - os)
+            break;
 
     for (; endrow > 0; endrow--)
-       if ( ty + rowPos[endrow-1] <= y + h + os)
+        if ( ty + rowPos[endrow-1] <= y + h + os)
             break;
 
     unsigned int startcol = 0;
     unsigned int endcol = totalCols;
     if (style()->direction() == LTR) {
-       for (; startcol < totalCols; startcol++) {
-           if (tx + table()->columnPos[startcol + 1] >= x - os)
+        for (; startcol < totalCols; startcol++) {
+            if (tx + table()->columnPos[startcol + 1] >= x - os)
                 break;
-       }
-       for (; endcol > 0; endcol--) {
-           if (tx + table()->columnPos[endcol - 1] <= x + w + os)
-               break;
-       }
+        }
+        for (; endcol > 0; endcol--) {
+            if (tx + table()->columnPos[endcol - 1] <= x + w + os)
+                break;
+        }
     }
 
     if (startcol < endcol) {
-       // draw the cells
-       for (unsigned int r = startrow; r < endrow; r++) {
-           unsigned int c = startcol;
-           // since a cell can be -1 (indicating a colspan) we might have to search backwards to include it
-           while (c && cellAt(r, c).inColSpan)
-               c--;
-           for (; c < endcol; c++) {
+        // draw the cells
+        for (unsigned int r = startrow; r < endrow; r++) {
+            unsigned int c = startcol;
+            // since a cell can be -1 (indicating a colspan) we might have to search backwards to include it
+            while (c && cellAt(r, c).inColSpan)
+                c--;
+            for (; c < endcol; c++) {
                 CellStruct current = cellAt(r, c);
                 RenderTableCell *cell = current.cell;
-               
+                
                 if (!cell || (cell->layer() && i.phase != PaintActionCollapsedTableBorders)) 
-                   continue;
+                    continue;
                 
                 // Cells must always paint in the order in which they appear taking into account
                 // their upper left originating row/column.  For cells with rowspans, avoid repainting
                 // if we've already seen the cell.
-               if (r > startrow && (cellAt(r-1, c).cell == cell))
-                   continue;
+                if (r > startrow && (cellAt(r-1, c).cell == cell))
+                    continue;
 
-               cell->paint(i, tx, ty);
-           }
-       }
+                cell->paint(i, tx, ty);
+            }
+        }
     }
 }
 
@@ -605,12 +606,12 @@ void RenderTableSection::recalcCells()
     gridRows = 0;
 
     for (RenderObject *row = firstChild(); row; row = row->nextSibling()) {
-       cRow++;
-       cCol = 0;
-       ensureRows(cRow + 1);
-       for (RenderObject *cell = row->firstChild(); cell; cell = cell->nextSibling())
-           if (cell->isTableCell())
-               addCell(static_cast<RenderTableCell *>(cell));
+        cRow++;
+        cCol = 0;
+        ensureRows(cRow + 1);
+        for (RenderObject *cell = row->firstChild(); cell; cell = cell->nextSibling())
+            if (cell->isTableCell())
+                addCell(static_cast<RenderTableCell *>(cell));
     }
     needCellRecalc = false;
     setNeedsLayout(true);
@@ -620,7 +621,22 @@ void RenderTableSection::clearGrid()
 {
     int rows = gridRows;
     while (rows--)
-       delete grid[rows].row;
+        delete grid[rows].row;
+}
+
+int RenderTableSection::numColumns() const
+{
+    int result = 0;
+    
+    for (int r = 0; r < gridRows; ++r) {
+        for (int c = result; c < table()->numEffCols(); ++c) {
+            const CellStruct& cell = cellAt(r, c);
+            if (cell.cell || cell.inColSpan)
+                result = c;
+        }
+    }
+    
+    return result + 1;
 }
 
 RenderObject* RenderTableSection::removeChildNode(RenderObject* child)
@@ -632,16 +648,16 @@ RenderObject* RenderTableSection::removeChildNode(RenderObject* child)
 #ifndef NDEBUG
 void RenderTableSection::dump(QTextStream *stream, QString ind) const
 {
-    *stream << endl << ind << "grid=(" << grid.size() << "," << table()->numEffCols() << ")" << endl << ind;
-    for (unsigned int r = 0; r < grid.size(); r++) {
-       for (int c = 0; c < table()->numEffCols(); c++) {
-           if (cellAt( r, c).cell && !cellAt(r, c).inColSpan)
-               *stream << "(" << cellAt(r, c).cell->row() << "," << cellAt(r, c).cell->col() << ","
-                       << cellAt(r, c).cell->rowSpan() << "," << cellAt(r, c).cell->colSpan() << ") ";
-           else
-               *stream << cellAt(r, c).cell << "null cell ";
-       }
-       *stream << endl << ind;
+    *stream << endl << ind << "grid=(" << gridRows << "," << table()->numEffCols() << ")" << endl << ind;
+    for (int r = 0; r < gridRows; r++) {
+        for (int c = 0; c < table()->numEffCols(); c++) {
+            if (cellAt( r, c).cell && !cellAt(r, c).inColSpan)
+                *stream << "(" << cellAt(r, c).cell->row() << "," << cellAt(r, c).cell->col() << ","
+                        << cellAt(r, c).cell->rowSpan() << "," << cellAt(r, c).cell->colSpan() << ") ";
+            else
+                *stream << cellAt(r, c).cell << "null cell ";
+        }
+        *stream << endl << ind;
     }
     RenderContainer::dump(stream,ind);
 }
index b8b948794a4ddbb522863db9c159baf7c7404bec..cf1bf2722a778dc1e18ad3cc4d71728c8acf62c7 100644 (file)
@@ -69,21 +69,22 @@ public:
     };
     typedef Array<CellStruct> Row;
     struct RowStruct {
-       Row *row;
-       int baseLine;
-       Length height;
+        Row *row;
+        int baseLine;
+        Length height;
     };
 
     CellStruct& cellAt(int row,  int col) {
-       return (*grid[row].row)[col];
+        return (*grid[row].row)[col];
     }
     const CellStruct& cellAt(int row, int col) const {
-       return (*grid[row].row)[col];
+        return (*grid[row].row)[col];
     }
 
     virtual void paint(PaintInfo& i, int tx, int ty);
 
     int numRows() const { return gridRows; }
+    int numColumns() const;
     int getBaseline(int row) {return grid[row].baseLine;}
 
     void setNeedCellRecalc() {
@@ -99,6 +100,7 @@ public:
     int gridRows;
     Array<int> rowPos;
 
+    // the current insertion position
     int cCol;
     int cRow;
     bool needCellRecalc;