diff options
Diffstat (limited to 'Source/WebCore/editing/InsertTextCommand.cpp')
-rw-r--r-- | Source/WebCore/editing/InsertTextCommand.cpp | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/Source/WebCore/editing/InsertTextCommand.cpp b/Source/WebCore/editing/InsertTextCommand.cpp index fc18e91..1ec11ad 100644 --- a/Source/WebCore/editing/InsertTextCommand.cpp +++ b/Source/WebCore/editing/InsertTextCommand.cpp @@ -26,7 +26,6 @@ #include "config.h" #include "InsertTextCommand.h" -#include "CharacterNames.h" #include "CSSComputedStyleDeclaration.h" #include "CSSMutableStyleDeclaration.h" #include "CSSPropertyNames.h" @@ -41,6 +40,7 @@ #include "TextIterator.h" #include "TypingCommand.h" #include "visible_units.h" +#include <wtf/unicode/CharacterNames.h> namespace WebCore { @@ -61,13 +61,13 @@ Position InsertTextCommand::prepareForTextInsertion(const Position& p) if (!pos.node()->isTextNode()) { RefPtr<Node> textNode = document()->createEditingTextNode(""); insertNodeAt(textNode.get(), pos); - return Position(textNode.get(), 0); + return firstPositionInNode(textNode.get()); } if (isTabSpanTextNode(pos.node())) { RefPtr<Node> textNode = document()->createEditingTextNode(""); insertNodeAtTabSpanPosition(textNode.get(), pos); - return Position(textNode.get(), 0); + return firstPositionInNode(textNode.get()); } return pos; @@ -83,30 +83,32 @@ bool InsertTextCommand::performTrivialReplace(const String& text, bool selectIns if (text.contains('\t') || text.contains(' ') || text.contains('\n')) return false; - Position start = endingSelection().start(); - Position end = endingSelection().end(); - - if (start.node() != end.node() || !start.node()->isTextNode() || isTabSpanTextNode(start.node())) + Position start = endingSelection().start().parentAnchoredEquivalent(); + Position end = endingSelection().end().parentAnchoredEquivalent(); + ASSERT(start.anchorType() == Position::PositionIsOffsetInAnchor); + ASSERT(end.anchorType() == Position::PositionIsOffsetInAnchor); + + if (start.containerNode() != end.containerNode() || !start.containerNode()->isTextNode() || isTabSpanTextNode(start.containerNode())) return false; - - replaceTextInNode(static_cast<Text*>(start.node()), start.deprecatedEditingOffset(), end.deprecatedEditingOffset() - start.deprecatedEditingOffset(), text); - - Position endPosition(start.node(), start.deprecatedEditingOffset() + text.length()); - + + replaceTextInNode(static_cast<Text*>(start.containerNode()), start.offsetInContainerNode(), end.offsetInContainerNode() - start.offsetInContainerNode(), text); + + Position endPosition(start.containerNode(), start.offsetInContainerNode() + text.length()); + // We could have inserted a part of composed character sequence, // so we are basically treating ending selection as a range to avoid validation. // <http://bugs.webkit.org/show_bug.cgi?id=15781> VisibleSelection forcedEndingSelection; forcedEndingSelection.setWithoutValidation(start, endPosition); setEndingSelection(forcedEndingSelection); - + if (!selectInsertedText) setEndingSelection(VisibleSelection(endingSelection().visibleEnd())); return true; } -void InsertTextCommand::input(const String& text, bool selectInsertedText) +void InsertTextCommand::input(const String& text, bool selectInsertedText, RebalanceType whitespaceRebalance) { ASSERT(text.find('\n') == notFound); @@ -170,13 +172,19 @@ void InsertTextCommand::input(const String& text, bool selectInsertedText) int offset = startPosition.deprecatedEditingOffset(); insertTextIntoNode(textNode, offset, text); - endPosition = Position(textNode, offset + text.length()); - - // The insertion may require adjusting adjacent whitespace, if it is present. - rebalanceWhitespaceAt(endPosition); - // Rebalancing on both sides isn't necessary if we've inserted a space. - if (text != " ") - rebalanceWhitespaceAt(startPosition); + endPosition = Position(textNode, offset + text.length(), Position::PositionIsOffsetInAnchor); + + if (whitespaceRebalance == RebalanceLeadingAndTrailingWhitespaces) { + // The insertion may require adjusting adjacent whitespace, if it is present. + rebalanceWhitespaceAt(endPosition); + // Rebalancing on both sides isn't necessary if we've inserted only spaces. + if (!shouldRebalanceLeadingWhitespaceFor(text)) + rebalanceWhitespaceAt(startPosition); + } else { + ASSERT(whitespaceRebalance == RebalanceAllWhitespaces); + if (canRebalance(startPosition) && canRebalance(endPosition)) + rebalanceWhitespaceOnTextSubstring(textNode, startPosition.deprecatedEditingOffset(), endPosition.deprecatedEditingOffset()); + } } // We could have inserted a part of composed character sequence, @@ -207,7 +215,7 @@ Position InsertTextCommand::insertTab(const Position& pos) // keep tabs coalesced in tab span if (isTabSpanTextNode(node)) { insertTextIntoNode(static_cast<Text *>(node), offset, "\t"); - return Position(node, offset + 1); + return Position(node, offset + 1, Position::PositionIsOffsetInAnchor); } // create new tab span @@ -230,9 +238,9 @@ Position InsertTextCommand::insertTab(const Position& pos) insertNodeBefore(spanNode, textNode); } } - + // return the position following the new tab - return Position(spanNode->lastChild(), caretMaxOffset(spanNode->lastChild())); + return lastPositionInNode(spanNode.get()); } bool InsertTextCommand::isInsertTextCommand() const |