summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/editing/InsertTextCommand.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/editing/InsertTextCommand.cpp')
-rw-r--r--Source/WebCore/editing/InsertTextCommand.cpp56
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