diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/editing/EditCommand.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/editing/EditCommand.cpp')
-rw-r--r-- | Source/WebCore/editing/EditCommand.cpp | 153 |
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 |