Reviewed by ggaren and harrison
<rdar://problem/
4744008>
9A270: Mail crashes when I try to paste large items from Safari
* editing/pasteboard/
4744008-expected.txt: Added.
* editing/pasteboard/
4744008.html: Added.
WebCore:
Reviewed by ggaren and harrison
<rdar://problem/
4744008>
9A270: Mail crashes when I try to paste large items from Safari
* editing/ReplaceSelectionCommand.cpp:
(WebCore::ReplaceSelectionCommand::removeRedundantStyles):
Even though we put nodes in the hash map in pre-order, they don't necessary
come out of the iterator that way. If a node is a redundant style span
and one of its pruned ancestors comes off the hash map after it, and that
ancestor is a redundant style span or font tag, we will try to remove it
even though it has already been removed and we'll crash.
The test case added with the fix depends on our hash map implementation
because it requires that a particular redundant style span come out of
the iterator before its parent. So, it may eventually not provide
coverage for the fix.
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@17051
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2006-10-13 Justin Garcia <justin.garcia@apple.com>
+
+ Reviewed by ggaren and harrison
+
+ <rdar://problem/4744008>
+ 9A270: Mail crashes when I try to paste large items from Safari
+
+ * editing/pasteboard/4744008-expected.txt: Added.
+ * editing/pasteboard/4744008.html: Added.
+
2006-10-13 Geoffrey Garen <ggaren@apple.com>
Tests for accessing renderer-dependent properties from a javascript: URL.
--- /dev/null
+EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document
+EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document toDOMRange:range from 3 of #text > DIV > BODY > HTML > #document to 3 of #text > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
+This tests for a crash on paste inside removeRedundantStyles. You should see 'foo bar' below.
+
+foo bar
+
--- /dev/null
+<p>This tests for a crash on paste inside removeRedundantStyles. You should see 'foo bar' below.</p>
+<div id="div" contenteditable="true"></div>
+
+<script>
+if (window.layoutTestController)
+ window.layoutTestController.dumpAsText();
+
+var div = document.getElementById("div");
+var sel = window.getSelection();
+
+sel.setPosition(div, 0);
+document.execCommand("InsertHTML", false, "foo <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><font><span class='Apple-style-span'></span></font>bar");
+</script>
+2006-10-13 Justin Garcia <justin.garcia@apple.com>
+
+ Reviewed by ggaren and harrison
+
+ <rdar://problem/4744008>
+ 9A270: Mail crashes when I try to paste large items from Safari
+
+ * editing/ReplaceSelectionCommand.cpp:
+ (WebCore::ReplaceSelectionCommand::removeRedundantStyles):
+ Even though we put nodes in the hash map in pre-order, they don't necessary
+ come out of the iterator that way. If a node is a redundant style span
+ and one of its pruned ancestors comes off the hash map after it, and that
+ ancestor is a redundant style span or font tag, we will try to remove it
+ even though it has already been removed and we'll crash.
+ The test case added with the fix depends on our hash map implementation
+ because it requires that a particular redundant style span come out of
+ the iterator before its parent. So, it may eventually not provide
+ coverage for the fix.
+
2006-10-13 Maciej Stachowiak <mjs@apple.com>
Reviewed by Darin.
NodeStyleMap::const_iterator e = map.end();
for (NodeStyleMap::const_iterator it = map.begin(); it != e; ++it) {
- Node *node = it->first;
+ Node* node = it->first;
+
+ // This node could have aleady been removed during pruning if one
+ // of its descendants came off of the hash map iterator before it
+ // and that descendant was a redundant style span or font tag.
+ if (!node->inDocument())
+ continue;
// Remove empty style spans.
if (isStyleSpan(node) && !node->hasChildNodes()) {