https://bugs.webkit.org/show_bug.cgi?id=78567
Reviewed by Eric Seidel.
Source/WebCore:
Fix the crash. Also update layout at the beginning of each call to deleteInsignificantText
since the previous call may have mutated the DOM.
Test: editing/inserting/delete-insignificant-text-crash.html
* editing/CompositeEditCommand.cpp:
(WebCore::CompositeEditCommand::deleteInsignificantText):
LayoutTests:
Add a regression test.
* editing/inserting/delete-insignificant-text-crash.html: Added.
* editing/inserting/delete-insignificant-text-crash.txt: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@107761
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2012-02-14 Ryosuke Niwa <rniwa@webkit.org>
+
+ Crash in deleteInsignificantText
+ https://bugs.webkit.org/show_bug.cgi?id=78567
+
+ Reviewed by Eric Seidel.
+
+ Add a regression test.
+
+ * editing/inserting/delete-insignificant-text-crash.html: Added.
+ * editing/inserting/delete-insignificant-text-crash.txt: Added.
+
2012-02-14 Noel Gordon <noel.gordon@gmail.com>
[chromium] Rebaseline JPEG image results after r107389
--- /dev/null
+This tests deleting a node in DOMCharacterDataModified doesn't result in a crash.
+
+PASS
--- /dev/null
+<!DOCTYPE html>
+<html>
+<body>
+<p>This tests deleting a node in DOMCharacterDataModified doesn't result in a crash.</p>
+<div id="test" contenteditable></div>
+<script>
+
+if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+var test = document.getElementById('test');
+test.appendChild(document.createTextNode('a '));
+test.appendChild(document.createTextNode(' '));
+test.appendChild(document.createTextNode('b'));
+test.appendChild(document.createTextNode(' '));
+getSelection().setPosition(test.firstChild.nextSibling, 0);
+document.body.addEventListener('DOMCharacterDataModified', function () {
+ test.removeChild(test.firstChild.nextSibling);
+ if (window.GCController)
+ GCController.collect();
+}, false);
+document.execCommand("InsertText", false, "c");
+
+test.textContent = '';
+document.writeln('PASS');
+
+</script>
+</body>
+</html>
+2012-02-14 Ryosuke Niwa <rniwa@webkit.org>
+
+ Crash in deleteInsignificantText
+ https://bugs.webkit.org/show_bug.cgi?id=78567
+
+ Reviewed by Eric Seidel.
+
+ Fix the crash. Also update layout at the beginning of each call to deleteInsignificantText
+ since the previous call may have mutated the DOM.
+
+ Test: editing/inserting/delete-insignificant-text-crash.html
+
+ * editing/CompositeEditCommand.cpp:
+ (WebCore::CompositeEditCommand::deleteInsignificantText):
+
2012-02-14 Levi Weintraub <leviw@chromium.org>
Prepare RenderLayerBacking and RenderLayerCompositor for subpixel layout
if (!textNode || start >= end)
return;
+ document()->updateLayout();
+
RenderText* textRenderer = toRenderText(textNode->renderer());
if (!textRenderer)
return;
if (comparePositions(start, end) >= 0)
return;
- Node* next;
- for (Node* node = start.deprecatedNode(); node; node = next) {
- next = node->traverseNextNode();
- if (node->isTextNode()) {
- Text* textNode = toText(node);
- int startOffset = node == start.deprecatedNode() ? start.deprecatedEditingOffset() : 0;
- int endOffset = node == end.deprecatedNode() ? end.deprecatedEditingOffset() : static_cast<int>(textNode->length());
- deleteInsignificantText(textNode, startOffset, endOffset);
- }
+ Vector<RefPtr<Text> > nodes;
+ for (Node* node = start.deprecatedNode(); node; node = node->traverseNextNode()) {
+ if (node->isTextNode())
+ nodes.append(toText(node));
if (node == end.deprecatedNode())
break;
}
+
+ for (size_t i = 0; i < nodes.size(); ++i) {
+ Text* textNode = nodes[i].get();
+ int startOffset = textNode == start.deprecatedNode() ? start.deprecatedEditingOffset() : 0;
+ int endOffset = textNode == end.deprecatedNode() ? end.deprecatedEditingOffset() : static_cast<int>(textNode->length());
+ deleteInsignificantText(textNode, startOffset, endOffset);
+ }
}
void CompositeEditCommand::deleteInsignificantTextDownstream(const Position& pos)