Diff
Modified: trunk/Source/WebCore/ChangeLog (90932 => 90933)
--- trunk/Source/WebCore/ChangeLog 2011-07-13 17:50:18 UTC (rev 90932)
+++ trunk/Source/WebCore/ChangeLog 2011-07-13 17:55:20 UTC (rev 90933)
@@ -1,3 +1,24 @@
+2011-07-12 Ryosuke Niwa <[email protected]>
+
+ Don't reuse the last InsertTextCommand
+ https://bugs.webkit.org/show_bug.cgi?id=64416
+
+ Reviewed by Justin Garcia.
+
+ This patch makes the interface of InsertTextCommand less foreign. It now takes arguments in
+ its constructor and executes the command in doApply like other edit commands.
+
+ * editing/CompositeEditCommand.cpp:
+ (WebCore::CompositeEditCommand::applyCommandToComposite): Added.
+ * editing/CompositeEditCommand.h:
+ * editing/InsertTextCommand.cpp:
+ (WebCore::InsertTextCommand::InsertTextCommand): Takes arguments input used to take.
+ (WebCore::InsertTextCommand::doApply): Renamed from input.
+ * editing/InsertTextCommand.h:
+ (WebCore::InsertTextCommand::create): Takes arguments input used to take.
+ * editing/TypingCommand.cpp:
+ (WebCore::TypingCommand::insertTextRunWithoutNewlines): Creates InsertTextCommand.
+
2011-07-12 Dmitry Lomov <[email protected]>
https://bugs.webkit.org/show_bug.cgi?id=63041
Modified: trunk/Source/WebCore/editing/CompositeEditCommand.cpp (90932 => 90933)
--- trunk/Source/WebCore/editing/CompositeEditCommand.cpp 2011-07-13 17:50:18 UTC (rev 90932)
+++ trunk/Source/WebCore/editing/CompositeEditCommand.cpp 2011-07-13 17:55:20 UTC (rev 90933)
@@ -103,6 +103,17 @@
m_commands.append(cmd);
}
+void CompositeEditCommand::applyCommandToComposite(PassRefPtr<CompositeEditCommand> command, const VisibleSelection& selection)
+{
+ command->setParent(this);
+ if (selection != command->endingSelection()) {
+ command->setStartingSelection(selection);
+ command->setEndingSelection(selection);
+ }
+ command->apply();
+ m_commands.append(command);
+}
+
void CompositeEditCommand::applyStyle(const EditingStyle* style, EditAction editingAction)
{
applyCommandToComposite(ApplyStyleCommand::create(document(), style, editingAction));
Modified: trunk/Source/WebCore/editing/CompositeEditCommand.h (90932 => 90933)
--- trunk/Source/WebCore/editing/CompositeEditCommand.h 2011-07-13 17:50:18 UTC (rev 90932)
+++ trunk/Source/WebCore/editing/CompositeEditCommand.h 2011-07-13 17:55:20 UTC (rev 90933)
@@ -51,6 +51,7 @@
//
void appendNode(PassRefPtr<Node>, PassRefPtr<ContainerNode> parent);
void applyCommandToComposite(PassRefPtr<EditCommand>);
+ void applyCommandToComposite(PassRefPtr<CompositeEditCommand>, const VisibleSelection&);
void applyStyle(const EditingStyle*, EditAction = EditActionChangeAttributes);
void applyStyle(const EditingStyle*, const Position& start, const Position& end, EditAction = EditActionChangeAttributes);
void applyStyledElement(PassRefPtr<Element>);
Modified: trunk/Source/WebCore/editing/EditCommand.cpp (90932 => 90933)
--- trunk/Source/WebCore/editing/EditCommand.cpp 2011-07-13 17:50:18 UTC (rev 90932)
+++ trunk/Source/WebCore/editing/EditCommand.cpp 2011-07-13 17:55:20 UTC (rev 90933)
@@ -184,11 +184,6 @@
return false;
}
-bool EditCommand::isInsertTextCommand() const
-{
- return false;
-}
-
bool EditCommand::isTypingCommand() const
{
return false;
Modified: trunk/Source/WebCore/editing/EditCommand.h (90932 => 90933)
--- trunk/Source/WebCore/editing/EditCommand.h 2011-07-13 17:50:18 UTC (rev 90932)
+++ trunk/Source/WebCore/editing/EditCommand.h 2011-07-13 17:55:20 UTC (rev 90933)
@@ -52,8 +52,7 @@
Element* startingRootEditableElement() const { return m_startingRootEditableElement.get(); }
Element* endingRootEditableElement() const { return m_endingRootEditableElement.get(); }
-
- virtual bool isInsertTextCommand() const;
+
virtual bool isTypingCommand() const;
virtual bool isCreateLinkCommand() const;
Modified: trunk/Source/WebCore/editing/InsertTextCommand.cpp (90932 => 90933)
--- trunk/Source/WebCore/editing/InsertTextCommand.cpp 2011-07-13 17:50:18 UTC (rev 90932)
+++ trunk/Source/WebCore/editing/InsertTextCommand.cpp 2011-07-13 17:55:20 UTC (rev 90933)
@@ -38,15 +38,14 @@
namespace WebCore {
-InsertTextCommand::InsertTextCommand(Document *document)
+InsertTextCommand::InsertTextCommand(Document* document, const String& text, bool selectInsertedText, RebalanceType rebalanceType)
: CompositeEditCommand(document)
+ , m_text(text)
+ , m_selectInsertedText(selectInsertedText)
+ , m_rebalanceType(rebalanceType)
{
}
-void InsertTextCommand::doApply()
-{
-}
-
Position InsertTextCommand::positionInsideTextNode(const Position& p)
{
Position pos = p;
@@ -95,9 +94,9 @@
return true;
}
-void InsertTextCommand::input(const String& text, bool selectInsertedText, RebalanceType whitespaceRebalance)
+void InsertTextCommand::doApply()
{
- ASSERT(text.find('\n') == notFound);
+ ASSERT(m_text.find('\n') == notFound);
if (!endingSelection().isNonOrphanedCaretOrRange())
return;
@@ -105,7 +104,7 @@
// Delete the current selection.
// FIXME: This delete operation blows away the typing style.
if (endingSelection().isRange()) {
- if (performTrivialReplace(text, selectInsertedText))
+ if (performTrivialReplace(m_text, m_selectInsertedText))
return;
deleteSelection(false, true, true, false);
}
@@ -144,13 +143,13 @@
Position endPosition;
- if (text == "\t") {
+ if (m_text == "\t") {
endPosition = insertTab(startPosition);
startPosition = endPosition.previous();
if (placeholder.isNotNull())
removePlaceholderAt(placeholder);
} else {
- // Make sure the document is set up to receive text
+ // Make sure the document is set up to receive m_text
startPosition = positionInsideTextNode(startPosition);
ASSERT(startPosition.anchorType() == Position::PositionIsOffsetInAnchor);
ASSERT(startPosition.containerNode());
@@ -160,17 +159,17 @@
RefPtr<Text> textNode = startPosition.containerText();
const unsigned offset = startPosition.offsetInContainerNode();
- insertTextIntoNode(textNode, offset, text);
- endPosition = Position(textNode, offset + text.length());
+ insertTextIntoNode(textNode, offset, m_text);
+ endPosition = Position(textNode, offset + m_text.length());
- if (whitespaceRebalance == RebalanceLeadingAndTrailingWhitespaces) {
+ if (m_rebalanceType == 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))
+ if (!shouldRebalanceLeadingWhitespaceFor(m_text))
rebalanceWhitespaceAt(startPosition);
} else {
- ASSERT(whitespaceRebalance == RebalanceAllWhitespaces);
+ ASSERT(m_rebalanceType == RebalanceAllWhitespaces);
if (canRebalance(startPosition) && canRebalance(endPosition))
rebalanceWhitespaceOnTextSubstring(textNode, startPosition.offsetInContainerNode(), endPosition.offsetInContainerNode());
}
@@ -190,7 +189,7 @@
applyStyle(typingStyle.get());
}
- if (!selectInsertedText)
+ if (!m_selectInsertedText)
setEndingSelection(VisibleSelection(endingSelection().end(), endingSelection().affinity()));
}
@@ -233,9 +232,4 @@
return lastPositionInNode(spanNode.get());
}
-bool InsertTextCommand::isInsertTextCommand() const
-{
- return true;
}
-
-}
Modified: trunk/Source/WebCore/editing/InsertTextCommand.h (90932 => 90933)
--- trunk/Source/WebCore/editing/InsertTextCommand.h 2011-07-13 17:50:18 UTC (rev 90932)
+++ trunk/Source/WebCore/editing/InsertTextCommand.h 2011-07-13 17:55:20 UTC (rev 90933)
@@ -37,21 +37,19 @@
RebalanceAllWhitespaces
};
- static PassRefPtr<InsertTextCommand> create(Document* document)
+ static PassRefPtr<InsertTextCommand> create(Document* document, const String& text, bool selectInsertedText = false,
+ RebalanceType rebalanceType = RebalanceLeadingAndTrailingWhitespaces)
{
- return adoptRef(new InsertTextCommand(document));
+ return adoptRef(new InsertTextCommand(document, text, selectInsertedText, rebalanceType));
}
- void input(const String& text, bool selectInsertedText = false, RebalanceType = RebalanceLeadingAndTrailingWhitespaces);
-
private:
- InsertTextCommand(Document*);
+ InsertTextCommand(Document*, const String& text, bool selectInsertedText, RebalanceType);
void deleteCharacter();
-
+
virtual void doApply();
- virtual bool isInsertTextCommand() const;
Position positionInsideTextNode(const Position&);
Position insertTab(const Position&);
@@ -59,6 +57,10 @@
bool performTrivialReplace(const String&, bool selectInsertedText);
friend class TypingCommand;
+
+ String m_text;
+ bool m_selectInsertedText;
+ RebalanceType m_rebalanceType;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/editing/TypingCommand.cpp (90932 => 90933)
--- trunk/Source/WebCore/editing/TypingCommand.cpp 2011-07-13 17:50:18 UTC (rev 90932)
+++ trunk/Source/WebCore/editing/TypingCommand.cpp 2011-07-13 17:55:20 UTC (rev 90933)
@@ -391,22 +391,11 @@
void TypingCommand::insertTextRunWithoutNewlines(const String &text, bool selectInsertedText)
{
- RefPtr<InsertTextCommand> command;
- if (!document()->frame()->selection()->typingStyle() && !m_commands.isEmpty()) {
- EditCommand* lastCommand = m_commands.last().get();
- if (lastCommand->isInsertTextCommand())
- command = static_cast<InsertTextCommand*>(lastCommand);
- }
- if (!command) {
- command = InsertTextCommand::create(document());
- applyCommandToComposite(command);
- }
- if (endingSelection() != command->endingSelection()) {
- command->setStartingSelection(endingSelection());
- command->setEndingSelection(endingSelection());
- }
- command->input(text, selectInsertedText,
- m_compositionType == TextCompositionNone ? InsertTextCommand::RebalanceLeadingAndTrailingWhitespaces : InsertTextCommand::RebalanceAllWhitespaces);
+ RefPtr<InsertTextCommand> command = InsertTextCommand::create(document(), text, selectInsertedText,
+ m_compositionType == TextCompositionNone ? InsertTextCommand::RebalanceLeadingAndTrailingWhitespaces : InsertTextCommand::RebalanceAllWhitespaces);
+
+ applyCommandToComposite(command, endingSelection());
+
typingAddedToOpenCommand(InsertText);
}