summaryrefslogtreecommitdiff
path: root/Source/WebCore/editing/EditCommand.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/editing/EditCommand.cpp')
-rw-r--r--Source/WebCore/editing/EditCommand.cpp153
1 files changed, 137 insertions, 16 deletions
diff --git a/Source/WebCore/editing/EditCommand.cpp b/Source/WebCore/editing/EditCommand.cpp
index 104195d03..5ded31647 100644
--- a/Source/WebCore/editing/EditCommand.cpp
+++ b/Source/WebCore/editing/EditCommand.cpp
@@ -10,10 +10,10 @@
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
@@ -26,29 +26,107 @@
#include "config.h"
#include "EditCommand.h"
+#include "AXObjectCache.h"
#include "CompositeEditCommand.h"
#include "Document.h"
#include "Editor.h"
#include "Element.h"
-#include "EventNames.h"
#include "Frame.h"
+#include "HTMLInputElement.h"
+#include "HTMLTextAreaElement.h"
#include "NodeTraversal.h"
#include "htmlediting.h"
namespace WebCore {
-EditCommand::EditCommand(Document& document)
+String inputTypeNameForEditingAction(EditAction action)
+{
+ switch (action) {
+ case EditActionJustify:
+ case EditActionAlignLeft:
+ return ASCIILiteral("formatJustifyLeft");
+ case EditActionAlignRight:
+ return ASCIILiteral("formatJustifyRight");
+ case EditActionCenter:
+ return ASCIILiteral("formatJustifyCenter");
+ case EditActionSubscript:
+ return ASCIILiteral("formatSubscript");
+ case EditActionSuperscript:
+ return ASCIILiteral("formatSuperscript");
+ case EditActionUnderline:
+ return ASCIILiteral("formatUnderline");
+ case EditActionSetColor:
+ return ASCIILiteral("formatForeColor");
+ case EditActionDeleteByDrag:
+ return ASCIILiteral("deleteByDrag");
+ case EditActionCut:
+ return ASCIILiteral("deleteByCut");
+ case EditActionBold:
+ return ASCIILiteral("formatBold");
+ case EditActionItalics:
+ return ASCIILiteral("formatItalic");
+ case EditActionPaste:
+ return ASCIILiteral("insertFromPaste");
+ case EditActionDelete:
+ case EditActionTypingDeleteSelection:
+ return ASCIILiteral("deleteContent");
+ case EditActionTypingDeleteBackward:
+ return ASCIILiteral("deleteContentBackward");
+ case EditActionTypingDeleteForward:
+ return ASCIILiteral("deleteContentForward");
+ case EditActionTypingDeleteWordBackward:
+ return ASCIILiteral("deleteWordBackward");
+ case EditActionTypingDeleteWordForward:
+ return ASCIILiteral("deleteWordForward");
+ case EditActionTypingDeleteLineBackward:
+ return ASCIILiteral("deleteHardLineBackward");
+ case EditActionTypingDeleteLineForward:
+ return ASCIILiteral("deleteHardLineForward");
+ case EditActionTypingDeletePendingComposition:
+ return ASCIILiteral("deleteCompositionText");
+ case EditActionTypingDeleteFinalComposition:
+ return ASCIILiteral("deleteByComposition");
+ case EditActionInsert:
+ case EditActionTypingInsertText:
+ return ASCIILiteral("insertText");
+ case EditActionInsertReplacement:
+ return ASCIILiteral("insertReplacementText");
+ case EditActionInsertFromDrop:
+ return ASCIILiteral("insertFromDrop");
+ case EditActionTypingInsertLineBreak:
+ return ASCIILiteral("insertLineBreak");
+ case EditActionTypingInsertParagraph:
+ return ASCIILiteral("insertParagraph");
+ case EditActionInsertOrderedList:
+ return ASCIILiteral("insertOrderedList");
+ case EditActionInsertUnorderedList:
+ return ASCIILiteral("insertUnorderedList");
+ case EditActionTypingInsertPendingComposition:
+ return ASCIILiteral("insertCompositionText");
+ case EditActionTypingInsertFinalComposition:
+ return ASCIILiteral("insertFromComposition");
+ case EditActionIndent:
+ return ASCIILiteral("formatIndent");
+ case EditActionOutdent:
+ return ASCIILiteral("formatOutdent");
+ case EditActionSetWritingDirection:
+ return ASCIILiteral("formatSetInlineTextDirection");
+ default:
+ return emptyString();
+ }
+}
+
+EditCommand::EditCommand(Document& document, EditAction editingAction)
: m_document(document)
- , m_parent(0)
+ , m_editingAction(editingAction)
{
ASSERT(document.frame());
- setStartingSelection(m_document->frame()->editor().avoidIntersectionWithDeleteButtonController(m_document->frame()->selection().selection()));
+ setStartingSelection(m_document->frame()->selection().selection());
setEndingSelection(m_startingSelection);
}
EditCommand::EditCommand(Document& document, const VisibleSelection& startingSelection, const VisibleSelection& endingSelection)
: m_document(document)
- , m_parent(0)
{
ASSERT(document.frame());
setStartingSelection(startingSelection);
@@ -65,9 +143,15 @@ Frame& EditCommand::frame()
return *document().frame();
}
+const Frame& EditCommand::frame() const
+{
+ ASSERT(document().frame());
+ return *document().frame();
+}
+
EditAction EditCommand::editingAction() const
{
- return EditActionUnspecified;
+ return m_editingAction;
}
static inline EditCommandComposition* compositionIfPossible(EditCommand* command)
@@ -77,13 +161,28 @@ static inline EditCommandComposition* compositionIfPossible(EditCommand* command
return toCompositeEditCommand(command)->composition();
}
+bool EditCommand::isEditingTextAreaOrTextInput() const
+{
+ auto* frame = m_document->frame();
+ if (!frame)
+ return false;
+
+ auto* container = frame->selection().selection().start().containerNode();
+ if (!container)
+ return false;
+
+ auto* ancestor = container->shadowHost();
+ if (!ancestor)
+ return false;
+
+ return is<HTMLTextAreaElement>(*ancestor) || (is<HTMLInputElement>(*ancestor) && downcast<HTMLInputElement>(*ancestor).isText());
+}
+
void EditCommand::setStartingSelection(const VisibleSelection& s)
{
for (EditCommand* cmd = this; ; cmd = cmd->m_parent) {
- if (EditCommandComposition* composition = compositionIfPossible(cmd)) {
- ASSERT(cmd->isTopLevelCommand());
+ if (auto* composition = compositionIfPossible(cmd))
composition->setStartingSelection(s);
- }
cmd->m_startingSelection = s;
if (!cmd->m_parent || cmd->m_parent->isFirstCommand(cmd))
break;
@@ -93,10 +192,8 @@ void EditCommand::setStartingSelection(const VisibleSelection& s)
void EditCommand::setEndingSelection(const VisibleSelection &s)
{
for (EditCommand* cmd = this; cmd; cmd = cmd->m_parent) {
- if (EditCommandComposition* composition = compositionIfPossible(cmd)) {
- ASSERT(cmd->isTopLevelCommand());
+ if (auto* composition = compositionIfPossible(cmd))
composition->setEndingSelection(s);
- }
cmd->m_endingSelection = s;
}
}
@@ -104,7 +201,6 @@ void EditCommand::setEndingSelection(const VisibleSelection &s)
void EditCommand::setParent(CompositeEditCommand* parent)
{
ASSERT((parent && !m_parent) || (!parent && m_parent));
- ASSERT(!parent || !isCompositeEditCommand() || !toCompositeEditCommand(this)->composition());
m_parent = parent;
if (parent) {
m_startingSelection = parent->m_endingSelection;
@@ -112,6 +208,31 @@ void EditCommand::setParent(CompositeEditCommand* parent)
}
}
+void EditCommand::postTextStateChangeNotification(AXTextEditType type, const String& text)
+{
+ if (!AXObjectCache::accessibilityEnabled())
+ return;
+ postTextStateChangeNotification(type, text, frame().selection().selection().start());
+}
+
+void EditCommand::postTextStateChangeNotification(AXTextEditType type, const String& text, const VisiblePosition& position)
+{
+ if (!AXObjectCache::accessibilityEnabled())
+ return;
+ if (!text.length())
+ return;
+ auto* cache = document().existingAXObjectCache();
+ if (!cache)
+ return;
+ auto* node = highestEditableRoot(position.deepEquivalent(), HasEditableAXRole);
+ cache->postTextStateChangeNotification(node, type, text, position);
+}
+
+SimpleEditCommand::SimpleEditCommand(Document& document, EditAction editingAction)
+ : EditCommand(document, editingAction)
+{
+}
+
void SimpleEditCommand::doReapply()
{
doApply();
@@ -120,7 +241,7 @@ void SimpleEditCommand::doReapply()
#ifndef NDEBUG
void SimpleEditCommand::addNodeAndDescendants(Node* startNode, HashSet<Node*>& nodes)
{
- for (Node* node = startNode; node; node = NodeTraversal::next(node, startNode))
+ for (Node* node = startNode; node; node = NodeTraversal::next(*node, startNode))
nodes.add(node);
}
#endif