diff --git a/layout/html/tests/TestInline.html b/layout/html/tests/TestInline.html
new file mode 100644
index 000000000000..5857a3662c04
--- /dev/null
+++ b/layout/html/tests/TestInline.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+ This test uses the DOM to exercise incremental reflow for inline frames.
+ In particular, the test attempts to exercise all of the code paths for
+ appending, inserting and removing frames from an inline frame. See
+ TestInline.js for the source to the test.
+
+
+
diff --git a/layout/html/tests/TestInline.js b/layout/html/tests/TestInline.js
new file mode 100644
index 000000000000..906fc42c0dab
--- /dev/null
+++ b/layout/html/tests/TestInline.js
@@ -0,0 +1,131 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL. You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All Rights
+ * Reserved.
+ */
+function makeInline()
+{
+ var image = document.createElement("IMG");
+ image.setAttribute("SRC", "bluedot.gif");
+ image.setAttribute("WIDTH", "100");
+ image.setAttribute("HEIGHT", "40");
+ image.setAttribute("BORDER", "2");
+ return image;
+}
+
+function makeBlock()
+{
+ var block = document.createElement("DIV");
+ var text = document.createTextNode("Block Text");
+ block.appendChild(text);
+ return block;
+}
+
+function appendInline()
+{
+ var i = makeInline();
+ var it = document.getElementById("it");
+ it.appendChild(i);
+}
+
+function insertInline(index)
+{
+ var i = makeInline();
+ var it = document.getElementById("it");
+ var kids = it.childNodes;
+ if ((index < 0) || (index > kids.length)) index = 0;
+ var before = kids[index];
+ it.insertBefore(i, before);
+}
+
+function appendBlock()
+{
+ var b = makeBlock();
+ var it = document.getElementById("it");
+ it.appendChild(b);
+}
+
+function insertBlock(index)
+{
+ var b = makeBlock();
+ var it = document.getElementById("it");
+ var kids = it.childNodes;
+ if ((index < 0) || (index > kids.length)) index = 0;
+ var before = kids[index];
+ it.insertBefore(b, before);
+}
+
+function removeAllChildren()
+{
+ var it = document.getElementById("it");
+ var kids = it.childNodes;
+ var n = kids.length;
+ for (i = 0; i < n; i++) {
+ it.removeChild(kids[0]);
+ }
+}
+
+function testAppend()
+{
+ appendInline(); // case 3
+ appendBlock(); // case 2
+ appendInline(); // case 3
+ appendBlock(); // case 1
+ appendBlock(); // case 1
+ appendInline(); // case 3
+}
+
+function testInsert()
+{
+ // first test inserting inlines
+ insertInline(0); // case 1
+ insertInline(3); // case 2
+ insertInline(7); // case 3
+ insertInline(8); // case 4
+
+ // test inserting blocks
+ insertBlock(0); // case 2
+ insertBlock(1); // case 3
+ insertInline(0);
+ insertInline(0);
+ insertInline(11);
+ insertBlock(13); // case 4
+ insertInline(0);
+ insertInline(0);
+ insertBlock(2); // case 5
+
+ // Remove all the children before doing block case 1
+ if (false) {
+ removeAllChildren();
+ appendInline();
+ insertBlock(0); // case 1
+
+ removeAllChildren();
+ appendInline();
+ appendInline();
+ insertBlock(1); // case 6
+ }
+}
+
+function testRemove()
+{
+}
+
+function runTest()
+{
+ testAppend();
+ testInsert();
+ testRemove();
+}
diff --git a/layout/html/tests/bluedot.gif b/layout/html/tests/bluedot.gif
new file mode 100755
index 000000000000..4f4127fe2f9a
Binary files /dev/null and b/layout/html/tests/bluedot.gif differ