2011-03-31  Benjamin Kalman  <kalman@chromium.org>

        Reviewed by Ojan Vafai.

        DeleteSelectionCommand::removeNode tries to insert block placeholder in non-editable table cell positions
        https://bugs.webkit.org/show_bug.cgi?id=57079

        Add regression test.

        * editing/execCommand/delete-table-with-empty-contents-expected.txt: Added.
        * editing/execCommand/delete-table-with-empty-contents.html: Added.
2011-03-31  Benjamin Kalman  <kalman@chromium.org>

        Reviewed by Ojan Vafai.

        DeleteSelectionCommand::removeNode tries to insert block placeholder in non-editable table cell positions
        https://bugs.webkit.org/show_bug.cgi?id=57079

        Test: editing/execCommand/delete-table-with-empty-contents.html

        This bug results in an ASSERT fail in CompositeEditCommand::insertNodeAt, so is only observable in debug builds
        of WebKit.

        * editing/DeleteSelectionCommand.cpp:
        (WebCore::firstEditablePositionInNode):
        (WebCore::DeleteSelectionCommand::removeNode): Use firstEditablePositionInNode rather than firstPositionInNode
        to find anchor node for the placeholder's position, if any.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@82550 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/editing/DeleteSelectionCommand.cpp b/Source/WebCore/editing/DeleteSelectionCommand.cpp
index cbebe54..af8473f 100644
--- a/Source/WebCore/editing/DeleteSelectionCommand.cpp
+++ b/Source/WebCore/editing/DeleteSelectionCommand.cpp
@@ -335,6 +335,15 @@
     }
 }
 
+static Position firstEditablePositionInNode(Node* node)
+{
+    ASSERT(node);
+    Node* next = node;
+    while (next && !next->rendererIsEditable())
+        next = next->traverseNextNode(node);
+    return next ? firstPositionInOrBeforeNode(next) : Position();
+}
+
 void DeleteSelectionCommand::removeNode(PassRefPtr<Node> node)
 {
     if (!node)
@@ -372,11 +381,14 @@
             removeNode(remove);
         }
         
-        // make sure empty cell has some height
+        // Make sure empty cell has some height, if a placeholder can be inserted.
         updateLayout();
         RenderObject *r = node->renderer();
-        if (r && r->isTableCell() && toRenderTableCell(r)->contentHeight() <= 0)
-            insertBlockPlaceholder(firstPositionInNode(node.get()));
+        if (r && r->isTableCell() && toRenderTableCell(r)->contentHeight() <= 0) {
+            Position firstEditablePosition = firstEditablePositionInNode(node.get());
+            if (firstEditablePosition.isNotNull())
+                insertBlockPlaceholder(firstEditablePosition);
+        }
         return;
     }