LayoutTests:
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Jul 2006 07:45:13 +0000 (07:45 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Jul 2006 07:45:13 +0000 (07:45 +0000)
        Reviewed by Hyatt.

        Test cases for <rdar://problem/4567031> REGRESSION: Crash at WebCore::RenderBlock::createLineBoxes (seems to be a security hole?)

        I included the test case from the bug plus variants for other broken cases that
        were similar but needed separate fixes.

        * fast/table/cell-in-row-before-misnested-text-crash-expected.txt: Added.
        * fast/table/cell-in-row-before-misnested-text-crash.xhtml: Added.
        * fast/table/form-in-row-before-misnested-text-crash-expected.txt: Added.
        * fast/table/form-in-row-before-misnested-text-crash.xhtml: Added.
        * fast/table/form-in-table-before-misnested-text-crash-expected.txt: Added.
        * fast/table/form-in-table-before-misnested-text-crash.xhtml: Added.
        * fast/table/form-in-tbody-before-misnested-text-crash-expected.txt: Added.
        * fast/table/form-in-tbody-before-misnested-text-crash.xhtml: Added.
        * fast/table/row-in-tbody-before-misnested-text-crash-expected.txt: Added.
        * fast/table/row-in-tbody-before-misnested-text-crash.xhtml: Added.
        * fast/table/section-in-table-before-misnested-text-crash-expected.txt: Added.
        * fast/table/section-in-table-before-misnested-text-crash.xhtml: Added.

WebCore:

        Reviewed by Hyatt.

        - fixed <rdar://problem/4567031> REGRESSION: Crash at WebCore::RenderBlock::createLineBoxes (seems to be a security hole?)

        I also fixed all the similar crash / assertion failure cases I could think of.

        * dom/Node.cpp:
        (WebCore::Node::nextRendererWithSameParent): Helper function for some of the above.
        * dom/Node.h:
        * rendering/RenderTable.cpp:
        (WebCore::RenderTable::addChild): Don't allow inserting forms when not in
        an HTML document, since we don't need that quirk and because parsing won't
        do certain render tree fixups. Also watch out for case when inserting before
        the renderer of a misnested child.
        * rendering/RenderTableRow.cpp:
        (WebCore::RenderTableRow::addChild): ditto
        * rendering/RenderTableSection.cpp:
        (WebCore::RenderTableSection::addChild): ditto

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

29 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-css-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-css.html [new file with mode: 0644]
LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/cell-in-row-before-misnested-text-crash.xhtml [new file with mode: 0644]
LayoutTests/fast/table/form-in-row-before-misnested-text-crash-css-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/form-in-row-before-misnested-text-crash-css.html [new file with mode: 0644]
LayoutTests/fast/table/form-in-row-before-misnested-text-crash-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/form-in-row-before-misnested-text-crash.xhtml [new file with mode: 0644]
LayoutTests/fast/table/form-in-table-before-misnested-text-crash-css-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/form-in-table-before-misnested-text-crash-css.html [new file with mode: 0644]
LayoutTests/fast/table/form-in-table-before-misnested-text-crash-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/form-in-table-before-misnested-text-crash.xhtml [new file with mode: 0644]
LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-css-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-css.html [new file with mode: 0644]
LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash.xhtml [new file with mode: 0644]
LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-css-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-css.html [new file with mode: 0644]
LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash.xhtml [new file with mode: 0644]
LayoutTests/fast/table/section-in-table-before-misnested-text-crash-css-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/section-in-table-before-misnested-text-crash-css.html [new file with mode: 0644]
LayoutTests/fast/table/section-in-table-before-misnested-text-crash-expected.txt [new file with mode: 0644]
LayoutTests/fast/table/section-in-table-before-misnested-text-crash.xhtml [new file with mode: 0644]
WebCore/ChangeLog
WebCore/rendering/RenderTable.cpp
WebCore/rendering/RenderTableRow.cpp
WebCore/rendering/RenderTableSection.cpp

index cd665f1a545a93ca13a4de5f3348cacfc3c26ce4..bd90f41d941f32085a6b7f4b82396b56e76fbdf7 100644 (file)
@@ -1,3 +1,25 @@
+2006-07-12  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Hyatt.
+        
+        Test cases for <rdar://problem/4567031> REGRESSION: Crash at WebCore::RenderBlock::createLineBoxes (seems to be a security hole?)
+        
+        I included the test case from the bug plus variants for other broken cases that
+        were similar but needed separate fixes.
+
+        * fast/table/cell-in-row-before-misnested-text-crash-expected.txt: Added.
+        * fast/table/cell-in-row-before-misnested-text-crash.xhtml: Added.
+        * fast/table/form-in-row-before-misnested-text-crash-expected.txt: Added.
+        * fast/table/form-in-row-before-misnested-text-crash.xhtml: Added.
+        * fast/table/form-in-table-before-misnested-text-crash-expected.txt: Added.
+        * fast/table/form-in-table-before-misnested-text-crash.xhtml: Added.
+        * fast/table/form-in-tbody-before-misnested-text-crash-expected.txt: Added.
+        * fast/table/form-in-tbody-before-misnested-text-crash.xhtml: Added.
+        * fast/table/row-in-tbody-before-misnested-text-crash-expected.txt: Added.
+        * fast/table/row-in-tbody-before-misnested-text-crash.xhtml: Added.
+        * fast/table/section-in-table-before-misnested-text-crash-expected.txt: Added.
+        * fast/table/section-in-table-before-misnested-text-crash.xhtml: Added.
+
 2006-07-13  Mitz Pettel  <opendarwin.org@mitzpettel.com>
 
         Reviewed by Hyatt.
diff --git a/LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-css-expected.txt b/LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-css-expected.txt
new file mode 100644 (file)
index 0000000..19c430e
--- /dev/null
@@ -0,0 +1,3 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 xxx  Whee
+
diff --git a/LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-css.html b/LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-css.html
new file mode 100644 (file)
index 0000000..af06554
--- /dev/null
@@ -0,0 +1,52 @@
+<html>
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.createElement("td"), xxx);
+}
+
+</script>
+<style>
+.table {
+    display: table;
+}
+
+.tbody {
+    display: table-row-group;
+}
+
+.tr {
+    display: table-row;
+}
+
+.td {
+    display: table-cell;
+}
+
+</style>
+
+</head>
+
+<body onload="boom()">
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<div class="table" border="1">
+ <div class="tr" id="tr1"> xxx
+  <div class="td">Whee</div>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-expected.txt b/LayoutTests/fast/table/cell-in-row-before-misnested-text-crash-expected.txt
new file mode 100644 (file)
index 0000000..19c430e
--- /dev/null
@@ -0,0 +1,3 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 xxx  Whee
+
diff --git a/LayoutTests/fast/table/cell-in-row-before-misnested-text-crash.xhtml b/LayoutTests/fast/table/cell-in-row-before-misnested-text-crash.xhtml
new file mode 100644 (file)
index 0000000..c722179
--- /dev/null
@@ -0,0 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.createElementNS("http://www.w3.org/1999/xhtml", "td"), xxx);
+}
+
+
+
+</script>
+</head>
+
+<body onload="boom()">
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<table border="1">
+ <tr id="tr1"> xxx
+  <td>Whee</td>
+ </tr>
+</table>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/form-in-row-before-misnested-text-crash-css-expected.txt b/LayoutTests/fast/table/form-in-row-before-misnested-text-crash-css-expected.txt
new file mode 100644 (file)
index 0000000..6f7353a
--- /dev/null
@@ -0,0 +1,6 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
+QQQ
+xxx    Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/form-in-row-before-misnested-text-crash-css.html b/LayoutTests/fast/table/form-in-row-before-misnested-text-crash-css.html
new file mode 100644 (file)
index 0000000..9a8e524
--- /dev/null
@@ -0,0 +1,55 @@
+<html>
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.getElementById("f1").cloneNode(true), xxx);
+}
+
+
+
+</script>
+<style>
+.table {
+    display: table;
+}
+
+.tbody {
+    display: table-row-group;
+}
+
+.tr {
+    display: table-row;
+}
+
+.td {
+    display: table-cell;
+}
+
+</style>
+</head>
+
+<body onload="boom()">
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<div class="table" border="1">
+ <div class="tr" id="tr1"> xxx
+  <div class="td">Whee</div>
+ </div>
+</div>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/form-in-row-before-misnested-text-crash-expected.txt b/LayoutTests/fast/table/form-in-row-before-misnested-text-crash-expected.txt
new file mode 100644 (file)
index 0000000..6f7353a
--- /dev/null
@@ -0,0 +1,6 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
+QQQ
+xxx    Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/form-in-row-before-misnested-text-crash.xhtml b/LayoutTests/fast/table/form-in-row-before-misnested-text-crash.xhtml
new file mode 100644 (file)
index 0000000..8a16723
--- /dev/null
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.getElementById("f1").cloneNode(true), xxx);
+}
+
+
+
+</script>
+</head>
+
+<body onload="boom()">
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<table border="1">
+ <tr id="tr1"> xxx
+  <td>Whee</td>
+ </tr>
+</table>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/form-in-table-before-misnested-text-crash-css-expected.txt b/LayoutTests/fast/table/form-in-table-before-misnested-text-crash-css-expected.txt
new file mode 100644 (file)
index 0000000..c39dd02
--- /dev/null
@@ -0,0 +1,7 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
+QQQ
+xxx 
+Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/form-in-table-before-misnested-text-crash-css.html b/LayoutTests/fast/table/form-in-table-before-misnested-text-crash-css.html
new file mode 100644 (file)
index 0000000..f9699ef
--- /dev/null
@@ -0,0 +1,55 @@
+<html>
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.getElementById("f1").cloneNode(true), xxx);
+}
+</script>
+<style>
+.table {
+    display: table;
+}
+
+.tbody {
+    display: table-row-group;
+}
+
+.tr {
+    display: table-row;
+}
+
+.td {
+    display: table-cell;
+}
+
+</style>
+</head>
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<body onload="boom()">
+
+<div class="table" border="1" id="tr1">
+ xxx
+<div class="tbody">
+ <div class="tr">
+  <div class="td">Whee</div>
+ </div>
+</div>
+</div>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/form-in-table-before-misnested-text-crash-expected.txt b/LayoutTests/fast/table/form-in-table-before-misnested-text-crash-expected.txt
new file mode 100644 (file)
index 0000000..c39dd02
--- /dev/null
@@ -0,0 +1,7 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
+QQQ
+xxx 
+Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/form-in-table-before-misnested-text-crash.xhtml b/LayoutTests/fast/table/form-in-table-before-misnested-text-crash.xhtml
new file mode 100644 (file)
index 0000000..1ff6b81
--- /dev/null
@@ -0,0 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.getElementById("f1").cloneNode(true), xxx);
+}
+
+
+
+</script>
+</head>
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<body onload="boom()">
+
+<table border="1" id="tr1">
+ xxx
+<tbody>
+ <tr>
+  <td>Whee</td>
+ </tr>
+</tbody>
+</table>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-css-expected.txt b/LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-css-expected.txt
new file mode 100644 (file)
index 0000000..36d5030
--- /dev/null
@@ -0,0 +1,7 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
+QQQ
+xxx
+Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-css.html b/LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-css.html
new file mode 100644 (file)
index 0000000..b1ec421
--- /dev/null
@@ -0,0 +1,54 @@
+<html>
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.getElementById("f1").cloneNode(true), xxx);
+}
+</script>
+<style>
+.table {
+    display: table;
+}
+
+.tbody {
+    display: table-row-group;
+}
+
+.tr {
+    display: table-row;
+}
+
+.td {
+    display: table-cell;
+}
+
+</style>
+</head>
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<body onload="boom()">
+
+<div class="table" border="1">
+<div class="tbody" id="tr1"> xxx
+ <div class="tr">
+  <div class="td">Whee</div>
+ </div>
+</div>
+</div>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-expected.txt b/LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash-expected.txt
new file mode 100644 (file)
index 0000000..36d5030
--- /dev/null
@@ -0,0 +1,7 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
+QQQ
+xxx
+Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash.xhtml b/LayoutTests/fast/table/form-in-tbody-before-misnested-text-crash.xhtml
new file mode 100644 (file)
index 0000000..436eb79
--- /dev/null
@@ -0,0 +1,39 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.getElementById("f1").cloneNode(true), xxx);
+}
+
+
+
+</script>
+</head>
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<body onload="boom()">
+
+<table border="1">
+<tbody id="tr1"> xxx
+ <tr>
+  <td>Whee</td>
+ </tr>
+</tbody>
+</table>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-css-expected.txt b/LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-css-expected.txt
new file mode 100644 (file)
index 0000000..75d9870
--- /dev/null
@@ -0,0 +1,6 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
+ xxx
+Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-css.html b/LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-css.html
new file mode 100644 (file)
index 0000000..9592388
--- /dev/null
@@ -0,0 +1,54 @@
+<html>
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.createElementNS("http://www.w3.org/1999/xhtml", "tr"), xxx);
+}
+</script>
+<style>
+.table {
+    display: table;
+}
+
+.tbody {
+    display: table-row-group;
+}
+
+.tr {
+    display: table-row;
+}
+
+.td {
+    display: table-cell;
+}
+
+</style>
+</head>
+
+<body onload="boom()">
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<div class="table" border="1">
+<div class="tbody" id="tr1"> xxx
+ <div class="tr">
+  <div class="td">Whee</div>
+ </div>
+</div>
+</div>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-expected.txt b/LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash-expected.txt
new file mode 100644 (file)
index 0000000..75d9870
--- /dev/null
@@ -0,0 +1,6 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
+ xxx
+Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash.xhtml b/LayoutTests/fast/table/row-in-tbody-before-misnested-text-crash.xhtml
new file mode 100644 (file)
index 0000000..5413d20
--- /dev/null
@@ -0,0 +1,39 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.createElementNS("http://www.w3.org/1999/xhtml", "tr"), xxx);
+}
+
+
+
+</script>
+</head>
+
+<body onload="boom()">
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<table border="1">
+<tbody id="tr1"> xxx
+ <tr>
+  <td>Whee</td>
+ </tr>
+</tbody>
+</table>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/section-in-table-before-misnested-text-crash-css-expected.txt b/LayoutTests/fast/table/section-in-table-before-misnested-text-crash-css-expected.txt
new file mode 100644 (file)
index 0000000..f7129ce
--- /dev/null
@@ -0,0 +1,5 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 xxx 
+Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/section-in-table-before-misnested-text-crash-css.html b/LayoutTests/fast/table/section-in-table-before-misnested-text-crash-css.html
new file mode 100644 (file)
index 0000000..661c1e7
--- /dev/null
@@ -0,0 +1,55 @@
+<html>
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.createElementNS("http://www.w3.org/1999/xhtml", "thead"), xxx);
+}
+</script>
+<style>
+.table {
+    display: table;
+}
+
+.tbody {
+    display: table-row-group;
+}
+
+.tr {
+    display: table-row;
+}
+
+.td {
+    display: table-cell;
+}
+
+</style>
+</head>
+
+<body onload="boom()">
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<div class="table" border="1" id="tr1">
+ xxx
+<div class="tbody">
+ <div class="tr">
+  <div class="td">Whee</div>
+ </div>
+</div>
+</div>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/table/section-in-table-before-misnested-text-crash-expected.txt b/LayoutTests/fast/table/section-in-table-before-misnested-text-crash-expected.txt
new file mode 100644 (file)
index 0000000..f7129ce
--- /dev/null
@@ -0,0 +1,5 @@
+This test checks whether a particular odd arrangement of DOM nodes results in render tree consistency violations.
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 xxx 
+Whee
+QQQ
+
diff --git a/LayoutTests/fast/table/section-in-table-before-misnested-text-crash.xhtml b/LayoutTests/fast/table/section-in-table-before-misnested-text-crash.xhtml
new file mode 100644 (file)
index 0000000..c15ccb5
--- /dev/null
@@ -0,0 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript">
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function boom()
+{
+  var tr = document.getElementById("tr1");
+  var xxx = document.getElementById("tr1").firstChild;
+
+  tr.insertBefore(document.createTextNode("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99"), xxx);
+
+  tr.insertBefore(document.createElementNS("http://www.w3.org/1999/xhtml", "thead"), xxx);
+}
+
+
+
+</script>
+</head>
+
+<body onload="boom()">
+
+<div>This test checks whether a particular odd arrangement of DOM
+nodes results in render tree consistency violations.</div>
+
+<table border="1" id="tr1">
+ xxx
+<tbody>
+ <tr>
+  <td>Whee</td>
+ </tr>
+</tbody>
+</table>
+
+<form id="f1">QQQ</form>
+
+</body>
+</html>
index 92e5371e0829c458417d176d25c14981c11f7a49..0fa9ec43edd23a252a2ac07957941a3ea682879e 100644 (file)
@@ -1,3 +1,24 @@
+2006-07-14  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Hyatt.
+
+        - fixed <rdar://problem/4567031> REGRESSION: Crash at WebCore::RenderBlock::createLineBoxes (seems to be a security hole?)
+        
+        I also fixed all the similar crash / assertion failure cases I could think of.
+
+        * dom/Node.cpp:
+        (WebCore::Node::nextRendererWithSameParent): Helper function for some of the above.
+        * dom/Node.h:
+        * rendering/RenderTable.cpp:
+        (WebCore::RenderTable::addChild): Don't allow inserting forms when not in
+        an HTML document, since we don't need that quirk and because parsing won't
+        do certain render tree fixups. Also watch out for case when inserting before
+        the renderer of a misnested child.
+        * rendering/RenderTableRow.cpp:
+        (WebCore::RenderTableRow::addChild): ditto
+        * rendering/RenderTableSection.cpp:
+        (WebCore::RenderTableSection::addChild): ditto
+
 2006-07-13  Adele Peterson  <adele@apple.com>
 
         Reviewed by Maciej.
index 552104b3094a394cf78f35ed16476f2606fcbdc4..1f8cdd2574ebe807155005f45f6f25c119a15182 100644 (file)
@@ -153,11 +153,16 @@ void RenderTable::addChild(RenderObject* child, RenderObject* beforeChild)
         case RUN_IN:
         case TABLE:
             // Allow a form to just sit at the top level.
-            wrapInAnonymousSection = !isTableElement || !child->element() || !child->element()->hasTagName(formTag);
+            wrapInAnonymousSection = !isTableElement || !child->element() || !(child->element()->hasTagName(formTag) && document()->isHTMLDocument());
             break;
         }
 
     if (!wrapInAnonymousSection) {
+        
+        // If the next renderer is actually wrapped in an anonymous table section, we need to go up and find that
+        while (beforeChild && !beforeChild->isTableSection())
+            beforeChild = beforeChild->parent();
+
         RenderContainer::addChild(child, beforeChild);
         return;
     }
index c28316d9566d133cbc380ac5f954192cbf2e0f03..3b4112fc4058980ac6499027c6dcb4a51937c055 100644 (file)
@@ -65,7 +65,7 @@ void RenderTableRow::addChild(RenderObject* child, RenderObject* beforeChild)
     bool isTableRow = element() && element()->hasTagName(trTag);
     
     if (!child->isTableCell()) {
-        if (isTableRow && child->element() && child->element()->hasTagName(formTag)) {
+        if (isTableRow && child->element() && child->element()->hasTagName(formTag) && document()->isHTMLDocument()) {
             RenderContainer::addChild(child, beforeChild);
             return;
         }
@@ -92,12 +92,16 @@ void RenderTableRow::addChild(RenderObject* child, RenderObject* beforeChild)
         addChild(cell, beforeChild);
         cell->addChild(child);
         return;
-    }
+    } 
+    
+    // If the next renderer is actually wrapped in an anonymous table cell, we need to go up and find that
+    while (beforeChild && !beforeChild->isTableCell())
+        beforeChild = beforeChild->parent();
 
     RenderTableCell* cell = static_cast<RenderTableCell*>(child);
 
     section()->addCell(cell, this);
-    
+
     RenderContainer::addChild(cell, beforeChild);
 
     if (beforeChild || nextSibling())
index e7f6b8de3e8e280f83b084fad3ce746ec4ed66aa..67abf18b879cc9e2c4ed7a361221d609d059d921 100644 (file)
@@ -89,7 +89,7 @@ void RenderTableSection::addChild(RenderObject* child, RenderObject* beforeChild
     bool isTableSection = element() && (element()->hasTagName(theadTag) || element()->hasTagName(tbodyTag) || element()->hasTagName(tfootTag));
 
     if (!child->isTableRow()) {
-        if (isTableSection && child->element() && child->element()->hasTagName(formTag)) {
+        if (isTableSection && child->element() && child->element()->hasTagName(formTag) && document()->isHTMLDocument()) {
             RenderContainer::addChild(child, beforeChild);
             return;
         }
@@ -137,6 +137,10 @@ void RenderTableSection::addChild(RenderObject* child, RenderObject* beforeChild
             grid[cRow].height = Length();
     }
 
+    // If the next renderer is actually wrapped in an anonymous table row, we need to go up and find that
+    while (beforeChild && !beforeChild->isTableRow())
+        beforeChild = beforeChild->parent();
+
     RenderContainer::addChild(child, beforeChild);
 }