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;
}