Reviewed by harrison
Pasted content would end up inside the block that contained the end of
the selection that was pasted into and not the block that contained
the start of the selection that was pasted into:
* editing/pasteboard/merge-end-5-expected.checksum: Added.
* editing/pasteboard/merge-end-5-expected.png: Added.
* editing/pasteboard/merge-end-5-expected.txt: Added.
* editing/pasteboard/merge-end-5.html: Added.
Inserting a paragraph separator was splitting and cloning the body element
if the html element was editable:
* editing/inserting/editable-html-element-expected.checksum: Added.
* editing/inserting/editable-html-element-expected.png: Added.
* editing/inserting/editable-html-element-expected.txt: Added.
* editing/inserting/editable-html-element.html: Added.
Since we now sometimes merge backward (from content already in the
document to just inserted content) during the end merge, the node that
contains the old caret is removed more often during paste. The editing
delegate notifications in these tests reflect this:
* editing/pasteboard/paste-line-endings-007-expected.txt:
* editing/pasteboard/paste-line-endings-008-expected.txt:
* editing/pasteboard/paste-line-endings-009-expected.txt:
Now demonstrates a bug where the html element is focused, but its contents
aren't selected:
* editing/selection/focus_editable_html-expected.checksum:
* editing/selection/focus_editable_html-expected.png:
* editing/selection/focus_editable_html-expected.txt:
* editing/selection/focus_editable_html.html:
WebCore:
Reviewed by harrison
* dom/Node.cpp:
(WebCore::Node::rootEditableElement):
Restored code to stop at the body tag. Editing shouldn't be allowed to
happen outside the body, so it needs to be the editable root even if the
html element is contentEditable.
* editing/ReplaceSelectionCommand.cpp:
(WebCore::ReplaceSelectionCommand::shouldMergeEnd):
Now takes in more information so it can be "the decider".
(WebCore::ReplaceSelectionCommand::doApply):
Merging two paragraphs will destroy the moved one's block styles. Perform
the end merge backward (from content already in the document to just inserted
content) if moving forward would move the paragraph that contained the start of
the selection being pasted into, since we always want to preserve that paragraph's
block style.
Moving backward in this case is also helpful because otherwise it would be
difficult to remember the position where inserted content began (since merging
would remove m_firstNodeInserted). That position is needed in order to select
the replacement and to add smart replace whitespace.
(WebCore::ReplaceSelectionCommand::removeEndBRIfNeeded):
If [br, 0] is at the end of a block, the br is not necessarily collapsed
in quirks mode. [br, 0] needs to also not be at the start of a block.
* editing/ReplaceSelectionCommand.h:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@14195
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2006-05-04 Justin Garcia <justin.garcia@apple.com>
+
+ Reviewed by harrison
+
+ Pasted content would end up inside the block that contained the end of
+ the selection that was pasted into and not the block that contained
+ the start of the selection that was pasted into:
+ * editing/pasteboard/merge-end-5-expected.checksum: Added.
+ * editing/pasteboard/merge-end-5-expected.png: Added.
+ * editing/pasteboard/merge-end-5-expected.txt: Added.
+ * editing/pasteboard/merge-end-5.html: Added.
+
+ Inserting a paragraph separator was splitting and cloning the body element
+ if the html element was editable:
+ * editing/inserting/editable-html-element-expected.checksum: Added.
+ * editing/inserting/editable-html-element-expected.png: Added.
+ * editing/inserting/editable-html-element-expected.txt: Added.
+ * editing/inserting/editable-html-element.html: Added.
+
+ Since we now sometimes merge backward (from content already in the
+ document to just inserted content) during the end merge, the node that
+ contains the old caret is removed more often during paste. The editing
+ delegate notifications in these tests reflect this:
+ * editing/pasteboard/paste-line-endings-007-expected.txt:
+ * editing/pasteboard/paste-line-endings-008-expected.txt:
+ * editing/pasteboard/paste-line-endings-009-expected.txt:
+
+ Now demonstrates a bug where the html element is focused, but its contents
+ aren't selected:
+ * editing/selection/focus_editable_html-expected.checksum:
+ * editing/selection/focus_editable_html-expected.png:
+ * editing/selection/focus_editable_html-expected.txt:
+ * editing/selection/focus_editable_html.html:
+
2006-05-04 Beth Dakin <bdakin@apple.com>
Reviewed by Hyatt.
--- /dev/null
+d53960e87b7f062db7c195bd7a7a7f9a
\ No newline at end of file
--- /dev/null
+EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of HTML > #document to 2 of HTML > #document
+EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of BODY > HTML > #document to 0 of BODY > HTML > #document toDOMRange:range from 259 of #text > BODY > HTML > #document to 259 of #text > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 259 of #text > BODY > HTML > #document to 259 of #text > BODY > HTML > #document toDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
+layer at (0,0) size 800x600
+ RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderBlock {HTML} at (0,0) size 800x600
+ RenderBody {BODY} at (8,8) size 784x584
+ RenderBlock (anonymous) at (0,0) size 784x54
+ RenderText {#text} at (0,0) size 783x54
+ text run at (0,0) width 714: "This tests to make sure that when the enclosing block is the body element, and when the html element is editable, "
+ text run at (714,0) width 69: "inserting a "
+ text run at (0,18) width 755: "paragraph separator doesn't split the body (inserting a paragraph separator usually splits/clones the enclosing block flow "
+ text run at (0,36) width 58: "element)."
+ RenderBlock {DIV} at (0,54) size 784x18
+ RenderBR {BR} at (0,0) size 0x18
+caret: position 0 of child 0 {BR} of child 2 {DIV} of child 1 {BODY} of child 0 {HTML} of document
--- /dev/null
+<html contenteditable="true">
+<script>
+function runTest() {
+ var s = window.getSelection();
+ var e = document.getElementById("test");
+
+ s.setPosition(e, 0);
+ document.execCommand("InsertText", false, "This tests to make sure that when the enclosing block is the body element, and when the html element is editable, inserting a paragraph separator doesn't split the body (inserting a paragraph separator usually splits/clones the enclosing block flow element).");
+ s.setPosition(e, 0);
+ s.modify("move", "forward", "line");
+ s.modify("move", "forward", "line");
+ s.modify("move", "forward", "line");
+ document.execCommand("InsertParagraph");
+}
+</script>
+<body id="test" onLoad="runTest();"></body>
+</html>
\ No newline at end of file
--- /dev/null
+139f3f0fa86488b5ad811ca6c2aedc1d
\ No newline at end of file
--- /dev/null
+EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > BODY > HTML > #document to 2 of DIV > BODY > HTML > #document
+EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: shouldChangeSelectedDOMRange:(null) toDOMRange:range from 36 of #text > DIV > DIV > BODY > HTML > #document to 36 of #text > DIV > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
+layer at (0,0) size 800x600
+ RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderBlock {HTML} at (0,0) size 800x600
+ RenderBody {BODY} at (8,8) size 784x584
+ RenderBlock {P} at (0,0) size 784x36
+ RenderText {#text} at (0,0) size 779x36
+ text run at (0,0) width 779: "Pasting a paragraph or less into a selection that spans multiple blocks should insert content into the block containing the start"
+ text run at (0,18) width 99: "of the selection."
+ RenderBlock {DIV} at (0,52) size 784x20
+ RenderBlock {DIV} at (0,0) size 784x20 [border: (1px solid #FF0000)]
+ RenderText {#text} at (1,1) size 32x18
+ text run at (1,1) width 32: "This "
+ RenderText {#text} at (33,1) size 231x18
+ text run at (33,1) width 231: "text should have a red border around"
+ RenderText {#text} at (264,1) size 16x18
+ text run at (264,1) width 16: " it."
+caret: position 36 of child 1 {#text} of child 0 {DIV} of child 2 {DIV} of child 0 {BODY} of child 0 {HTML} of document
--- /dev/null
+<p>Pasting a paragraph or less into a selection that spans multiple blocks should insert content into the block containing the start of the selection.</p>
+<div id="test" contenteditable="true"><div style="border: 1px solid red;">This x</div><div style="border: 1px solid blue;">x it.</div></div>
+
+<script>
+var s = window.getSelection();
+var e = document.getElementById("test");
+
+s.setPosition(e, 0);
+
+s.modify("move", "forward", "word");
+s.modify("move", "forward", "character");
+s.modify("extend", "forward", "word");
+s.modify("extend", "forward", "word");
+
+document.execCommand("InsertHTML", false, "<div><div>text should have a red border around</div></div>");
+</script>
\ No newline at end of file
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: shouldInsertNode:#document-fragment replacingDOMRange:range from 9 of #text > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > BODY > HTML > #document givenAction:WebViewInsertActionPasted
-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 9 of #text > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > BODY > HTML > #document toDOMRange:range from 1 of #text > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: shouldChangeSelectedDOMRange:(null) toDOMRange:range from 1 of #text > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
layer at (0,0) size 800x600
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: shouldInsertNode:#document-fragment replacingDOMRange:range from 8 of #text > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > BODY > HTML > #document givenAction:WebViewInsertActionPasted
-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 8 of #text > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > BODY > HTML > #document toDOMRange:range from 1 of #text > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: shouldChangeSelectedDOMRange:(null) toDOMRange:range from 1 of #text > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
layer at (0,0) size 800x600
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: shouldInsertNode:#document-fragment replacingDOMRange:range from 8 of #text > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > DIV > BODY > HTML > #document givenAction:WebViewInsertActionPasted
-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 8 of #text > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > DIV > BODY > HTML > #document toDOMRange:range from 1 of #text > DIV > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: shouldChangeSelectedDOMRange:(null) toDOMRange:range from 1 of #text > DIV > DIV > DIV > DIV > BODY > HTML > #document to 1 of #text > DIV > DIV > DIV > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
layer at (0,0) size 800x600
-c3bcb36ef50d4a8e133ce53c9769bf25
\ No newline at end of file
+2b32e27839b60eda65fb9513e21e39be
\ No newline at end of file
EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of HTML > #document to 1 of HTML > #document
EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification
-EDITING DELEGATE: shouldChangeSelectedDOMRange:(null) toDOMRange:range from 1 of #text > BODY > HTML > #document to 42 of #text > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: shouldChangeSelectedDOMRange:(null) toDOMRange:range from 0 of HTML > #document to 0 of HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 2008x2070
+layer at (0,0) size 2008x2088
RenderCanvas at (0,0) size 785x585
-layer at (0,0) size 2008x2070
- RenderBlock {HTML} at (0,0) size 785x2070
- RenderBody {BODY} at (8,8) size 769x2054
- RenderBlock (anonymous) at (0,0) size 769x36
+layer at (0,0) size 2008x2088
+ RenderBlock {HTML} at (0,0) size 785x2088
+ RenderBody {BODY} at (8,8) size 769x2072
+ RenderBlock (anonymous) at (0,0) size 769x54
RenderText {#text} at (0,0) size 583x18
text run at (0,0) width 583: "This test makes sure that we don't scroll unnecessarily to reveal an editable HTML Element. "
RenderBR {BR} at (583,14) size 0x0
RenderText {#text} at (0,18) size 262x18
text run at (0,18) width 262: "If the document doesn't scroll, test passes."
- RenderBlock {DIV} at (0,36) size 2000x2000
- RenderBlock (anonymous) at (0,2036) size 769x18
+ RenderBR {BR} at (262,32) size 0x0
+ RenderInline {B} at (0,0) size 528x18
+ RenderText {#text} at (0,36) size 528x18
+ text run at (0,36) width 528: "This demonstrates a bug: normally, focusing an element will select its contents."
+ RenderText {#text} at (0,0) size 0x0
+ RenderBlock {DIV} at (0,54) size 2000x2000
+ RenderBlock (anonymous) at (0,2054) size 769x18
RenderText {#text} at (0,0) size 237x18
text run at (0,0) width 237: "If the document scrolls here, test fails."
RenderText {#text} at (0,0) size 0x0
-selection start: position 1 of child 0 {#text} of child 0 {BODY} of child 0 {HTML} of document
-selection end: position 42 of child 4 {#text} of child 0 {BODY} of child 0 {HTML} of document
-scrolled to 0,8
+caret: position 0 of child 0 {HTML} of document
<html id="hElem" contenteditable=true>
<body onload="document.getElementById('hElem').focus()">
This test makes sure that we don't scroll unnecessarily to reveal an editable HTML Element.
-<br> If the document doesn't scroll, test passes.
+<br> If the document doesn't scroll, test passes.<br>
+<b>This demonstrates a bug: normally, focusing an element will select its contents.</b>
<div style="width:2000px;height:2000px;"></div>
If the document scrolls here, test fails.
</body>
+2006-05-04 Justin Garcia <justin.garcia@apple.com>
+
+ Reviewed by harrison
+
+ * dom/Node.cpp:
+ (WebCore::Node::rootEditableElement):
+ Restored code to stop at the body tag. Editing shouldn't be allowed to
+ happen outside the body, so it needs to be the editable root even if the
+ html element is contentEditable.
+ * editing/ReplaceSelectionCommand.cpp:
+ (WebCore::ReplaceSelectionCommand::shouldMergeEnd):
+ Now takes in more information so it can be "the decider".
+ (WebCore::ReplaceSelectionCommand::doApply):
+ Merging two paragraphs will destroy the moved one's block styles. Perform
+ the end merge backward (from content already in the document to just inserted
+ content) if moving forward would move the paragraph that contained the start of
+ the selection being pasted into, since we always want to preserve that paragraph's
+ block style.
+ Moving backward in this case is also helpful because otherwise it would be
+ difficult to remember the position where inserted content began (since merging
+ would remove m_firstNodeInserted). That position is needed in order to select
+ the replacement and to add smart replace whitespace.
+ (WebCore::ReplaceSelectionCommand::removeEndBRIfNeeded):
+ If [br, 0] is at the end of a block, the br is not necessarily collapsed
+ in quirks mode. [br, 0] needs to also not be at the start of a block.
+
+ * editing/ReplaceSelectionCommand.h:
+
2006-05-04 Tim Omernick <timo@apple.com>
Reviewed by Darin.
Element* Node::rootEditableElement() const
{
Element* result = 0;
- for (Node* n = const_cast<Node*>(this); n && n->isContentEditable(); n = n->parentNode())
+ for (Node* n = const_cast<Node*>(this); n && n->isContentEditable(); n = n->parentNode()) {
if (n->isBlockFlow() && n->isElementNode())
result = static_cast<Element*>(n);
+ if (n->hasTagName(bodyTag))
+ break;
+ }
return result;
}
return false;
}
-bool ReplaceSelectionCommand::shouldMergeEnd(const ReplacementFragment& incomingFragment, const VisiblePosition& endOfInsertedContent, const VisiblePosition& destination)
+bool ReplaceSelectionCommand::shouldMergeEnd(const VisiblePosition& endOfInsertedContent, bool fragmentHadInterchangeNewlineAtEnd, bool selectionEndWasEndOfParagraph)
{
Node* endNode = endOfInsertedContent.deepEquivalent().node();
- Node* destinationNode = destination.deepEquivalent().node();
+ Node* nextNode = endOfInsertedContent.next().deepEquivalent().node();
// FIXME: Unify the naming scheme for these enclosing element getters.
- return !incomingFragment.hasInterchangeNewlineAtEnd() &&
+ return !selectionEndWasEndOfParagraph &&
+ !fragmentHadInterchangeNewlineAtEnd &&
isEndOfParagraph(endOfInsertedContent) &&
- nearestMailBlockquote(endNode) == nearestMailBlockquote(destinationNode) &&
- enclosingListChild(endNode) == enclosingListChild(destinationNode) &&
- enclosingTableCell(endNode) == enclosingTableCell(destinationNode) &&
+ nearestMailBlockquote(endNode) == nearestMailBlockquote(nextNode) &&
+ enclosingListChild(endNode) == enclosingListChild(nextNode) &&
+ enclosingTableCell(endNode) == enclosingTableCell(nextNode) &&
!endNode->hasTagName(hrTag);
}
// Make sure that content after the end of the selection being pasted into is in the same paragraph as the
// last bit of content that was inserted.
VisiblePosition endOfInsertedContent(Position(m_lastNodeInserted.get(), maxDeepOffset(m_lastNodeInserted.get())));
- VisiblePosition destination = endOfInsertedContent.next();
- if (!endWasEndOfParagraph && shouldMergeEnd(fragment, endOfInsertedContent, destination)) {
- VisiblePosition startOfParagraphToMove = startOfParagraph(endOfInsertedContent);
- moveParagraph(startOfParagraphToMove, endOfInsertedContent, destination);
+ VisiblePosition startOfInsertedContent(Position(m_firstNodeInserted.get(), 0));
+ if (shouldMergeEnd(endOfInsertedContent, fragment.hasInterchangeNewlineAtEnd(), endWasEndOfParagraph)) {
+ // Merging two paragraphs will destroy the moved one's block styles. Always move forward to preserve
+ // the block style of the paragraph already in the document, unless the paragraph to move would include the
+ // what was the start of the selection that was pasted into.
+ bool mergeForward = !inSameParagraph(startOfInsertedContent, endOfInsertedContent);
+
+ VisiblePosition destination = mergeForward ? endOfInsertedContent.next() : endOfInsertedContent;
+ VisiblePosition startOfParagraphToMove = mergeForward ? startOfParagraph(endOfInsertedContent) : endOfInsertedContent.next();
+
+ moveParagraph(startOfParagraphToMove, endOfParagraph(startOfParagraphToMove), destination);
+ // Merging forward will remove the last node inserted from the document.
+ // FIXME: Maintain positions for the start and end of inserted content instead of keeping nodes. The nodes are
+ // only ever used to create positions where inserted content starts/ends.
+ if (mergeForward)
+ m_lastNodeInserted = destination.previous().deepEquivalent().node();
}
completeHTMLReplacement(lastPositionToSelect);
VisiblePosition visiblePos(Position(endBR, 0));
if (// The br is collapsed away and so is unnecessary.
- !document()->inStrictMode() && isEndOfBlock(visiblePos) ||
+ !document()->inStrictMode() && isEndOfBlock(visiblePos) && !isStartOfBlock(visiblePos) ||
// A br that was originally holding a line open should be displaced by inserted content.
// A br that was originally acting as a line break should still be acting as a line break, not as a placeholder.
isStartOfParagraph(visiblePos) && isEndOfParagraph(visiblePos))
void removeEndBRIfNeeded(Node*);
bool shouldMergeStart(const ReplacementFragment&, const Selection&);
- bool shouldMergeEnd(const ReplacementFragment&, const VisiblePosition&, const VisiblePosition&);
+ bool shouldMergeEnd(const VisiblePosition&, bool, bool);
RefPtr<Node> m_firstNodeInserted;
RefPtr<Node> m_lastNodeInserted;