| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved. | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions | |
| 6 * are met: | |
| 7 * 1. Redistributions of source code must retain the above copyright | |
| 8 * notice, this list of conditions and the following disclaimer. | |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | |
| 10 * notice, this list of conditions and the following disclaimer in the | |
| 11 * documentation and/or other materials provided with the distribution. | |
| 12 * | |
| 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | |
| 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | |
| 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
| 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 24 */ | |
| 25 | |
| 26 #ifndef CompositeEditCommand_h | |
| 27 #define CompositeEditCommand_h | |
| 28 | |
| 29 #include "core/CSSPropertyNames.h" | |
| 30 #include "core/editing/EditCommand.h" | |
| 31 #include "core/editing/UndoStep.h" | |
| 32 #include "wtf/Vector.h" | |
| 33 | |
| 34 namespace blink { | |
| 35 | |
| 36 class EditingStyle; | |
| 37 class Element; | |
| 38 class HTMLBRElement; | |
| 39 class HTMLElement; | |
| 40 class HTMLSpanElement; | |
| 41 class Text; | |
| 42 | |
| 43 class EditCommandComposition final : public UndoStep { | |
| 44 public: | |
| 45 static PassRefPtrWillBeRawPtr<EditCommandComposition> create(Document*, cons
t VisibleSelection&, const VisibleSelection&, EditAction); | |
| 46 | |
| 47 bool belongsTo(const LocalFrame&) const override; | |
| 48 void unapply() override; | |
| 49 void reapply() override; | |
| 50 EditAction editingAction() const override { return m_editAction; } | |
| 51 void append(SimpleEditCommand*); | |
| 52 | |
| 53 const VisibleSelection& startingSelection() const { return m_startingSelecti
on; } | |
| 54 const VisibleSelection& endingSelection() const { return m_endingSelection;
} | |
| 55 void setStartingSelection(const VisibleSelection&); | |
| 56 void setEndingSelection(const VisibleSelection&); | |
| 57 Element* startingRootEditableElement() const { return m_startingRootEditable
Element.get(); } | |
| 58 Element* endingRootEditableElement() const { return m_endingRootEditableElem
ent.get(); } | |
| 59 | |
| 60 DECLARE_VIRTUAL_TRACE(); | |
| 61 | |
| 62 private: | |
| 63 EditCommandComposition(Document*, const VisibleSelection& startingSelection,
const VisibleSelection& endingSelection, EditAction); | |
| 64 | |
| 65 RefPtrWillBeMember<Document> m_document; | |
| 66 VisibleSelection m_startingSelection; | |
| 67 VisibleSelection m_endingSelection; | |
| 68 WillBeHeapVector<RefPtrWillBeMember<SimpleEditCommand>> m_commands; | |
| 69 RefPtrWillBeMember<Element> m_startingRootEditableElement; | |
| 70 RefPtrWillBeMember<Element> m_endingRootEditableElement; | |
| 71 EditAction m_editAction; | |
| 72 }; | |
| 73 | |
| 74 class CompositeEditCommand : public EditCommand { | |
| 75 public: | |
| 76 ~CompositeEditCommand() override; | |
| 77 | |
| 78 void apply(); | |
| 79 bool isFirstCommand(EditCommand* command) { return !m_commands.isEmpty() &&
m_commands.first() == command; } | |
| 80 EditCommandComposition* composition() { return m_composition.get(); } | |
| 81 EditCommandComposition* ensureComposition(); | |
| 82 | |
| 83 virtual bool isTypingCommand() const; | |
| 84 virtual bool preservesTypingStyle() const; | |
| 85 virtual void setShouldRetainAutocorrectionIndicator(bool); | |
| 86 virtual bool shouldStopCaretBlinking() const { return false; } | |
| 87 | |
| 88 DECLARE_VIRTUAL_TRACE(); | |
| 89 | |
| 90 protected: | |
| 91 explicit CompositeEditCommand(Document&); | |
| 92 | |
| 93 // | |
| 94 // sugary-sweet convenience functions to help create and apply edit commands
in composite commands | |
| 95 // | |
| 96 void appendNode(PassRefPtrWillBeRawPtr<Node>, PassRefPtrWillBeRawPtr<Contain
erNode> parent); | |
| 97 void applyCommandToComposite(PassRefPtrWillBeRawPtr<EditCommand>); | |
| 98 void applyCommandToComposite(PassRefPtrWillBeRawPtr<CompositeEditCommand>, c
onst VisibleSelection&); | |
| 99 void applyStyle(const EditingStyle*, EditAction = EditActionChangeAttributes
); | |
| 100 void applyStyle(const EditingStyle*, const Position& start, const Position&
end, EditAction = EditActionChangeAttributes); | |
| 101 void applyStyledElement(PassRefPtrWillBeRawPtr<Element>); | |
| 102 void removeStyledElement(PassRefPtrWillBeRawPtr<Element>); | |
| 103 void deleteSelection(bool smartDelete = false, bool mergeBlocksAfterDelete =
true, bool expandForSpecialElements = true, bool sanitizeMarkup = true); | |
| 104 void deleteSelection(const VisibleSelection&, bool smartDelete = false, bool
mergeBlocksAfterDelete = true, bool expandForSpecialElements = true, bool sanit
izeMarkup = true); | |
| 105 virtual void deleteTextFromNode(PassRefPtrWillBeRawPtr<Text>, unsigned offse
t, unsigned count); | |
| 106 bool isRemovableBlock(const Node*); | |
| 107 void insertNodeAfter(PassRefPtrWillBeRawPtr<Node>, PassRefPtrWillBeRawPtr<No
de> refChild); | |
| 108 void insertNodeAt(PassRefPtrWillBeRawPtr<Node>, const Position&); | |
| 109 void insertNodeAtTabSpanPosition(PassRefPtrWillBeRawPtr<Node>, const Positio
n&); | |
| 110 void insertNodeBefore(PassRefPtrWillBeRawPtr<Node>, PassRefPtrWillBeRawPtr<N
ode> refChild, ShouldAssumeContentIsAlwaysEditable = DoNotAssumeContentIsAlwaysE
ditable); | |
| 111 void insertParagraphSeparator(bool useDefaultParagraphElement = false, bool
pasteBlockqutoeIntoUnquotedArea = false); | |
| 112 void insertTextIntoNode(PassRefPtrWillBeRawPtr<Text>, unsigned offset, const
String& text); | |
| 113 void mergeIdenticalElements(PassRefPtrWillBeRawPtr<Element>, PassRefPtrWillB
eRawPtr<Element>); | |
| 114 void rebalanceWhitespace(); | |
| 115 void rebalanceWhitespaceAt(const Position&); | |
| 116 void rebalanceWhitespaceOnTextSubstring(PassRefPtrWillBeRawPtr<Text>, int st
artOffset, int endOffset); | |
| 117 void prepareWhitespaceAtPositionForSplit(Position&); | |
| 118 void replaceCollapsibleWhitespaceWithNonBreakingSpaceIfNeeded(const VisibleP
osition&); | |
| 119 bool canRebalance(const Position&) const; | |
| 120 bool shouldRebalanceLeadingWhitespaceFor(const String&) const; | |
| 121 void removeCSSProperty(PassRefPtrWillBeRawPtr<Element>, CSSPropertyID); | |
| 122 void removeElementAttribute(PassRefPtrWillBeRawPtr<Element>, const Qualified
Name& attribute); | |
| 123 void removeChildrenInRange(PassRefPtrWillBeRawPtr<Node>, unsigned from, unsi
gned to); | |
| 124 virtual void removeNode(PassRefPtrWillBeRawPtr<Node>, ShouldAssumeContentIsA
lwaysEditable = DoNotAssumeContentIsAlwaysEditable); | |
| 125 HTMLSpanElement* replaceElementWithSpanPreservingChildrenAndAttributes(PassR
efPtrWillBeRawPtr<HTMLElement>); | |
| 126 void removeNodePreservingChildren(PassRefPtrWillBeRawPtr<Node>, ShouldAssume
ContentIsAlwaysEditable = DoNotAssumeContentIsAlwaysEditable); | |
| 127 void removeNodeAndPruneAncestors(PassRefPtrWillBeRawPtr<Node>, Node* exclude
Node = nullptr); | |
| 128 void moveRemainingSiblingsToNewParent(Node*, Node* pastLastNodeToMove, PassR
efPtrWillBeRawPtr<Element> prpNewParent); | |
| 129 void updatePositionForNodeRemovalPreservingChildren(Position&, Node&); | |
| 130 void prune(PassRefPtrWillBeRawPtr<Node>, Node* excludeNode = nullptr); | |
| 131 void replaceTextInNode(PassRefPtrWillBeRawPtr<Text>, unsigned offset, unsign
ed count, const String& replacementText); | |
| 132 Position replaceSelectedTextInNode(const String&); | |
| 133 void replaceTextInNodePreservingMarkers(PassRefPtrWillBeRawPtr<Text>, unsign
ed offset, unsigned count, const String& replacementText); | |
| 134 Position positionOutsideTabSpan(const Position&); | |
| 135 void setNodeAttribute(PassRefPtrWillBeRawPtr<Element>, const QualifiedName&
attribute, const AtomicString& value); | |
| 136 void splitElement(PassRefPtrWillBeRawPtr<Element>, PassRefPtrWillBeRawPtr<No
de> atChild); | |
| 137 void splitTextNode(PassRefPtrWillBeRawPtr<Text>, unsigned offset); | |
| 138 void splitTextNodeContainingElement(PassRefPtrWillBeRawPtr<Text>, unsigned o
ffset); | |
| 139 void wrapContentsInDummySpan(PassRefPtrWillBeRawPtr<Element>); | |
| 140 | |
| 141 void deleteInsignificantText(PassRefPtrWillBeRawPtr<Text>, unsigned start, u
nsigned end); | |
| 142 void deleteInsignificantText(const Position& start, const Position& end); | |
| 143 void deleteInsignificantTextDownstream(const Position&); | |
| 144 | |
| 145 PassRefPtrWillBeRawPtr<HTMLBRElement> appendBlockPlaceholder(PassRefPtrWillB
eRawPtr<Element>); | |
| 146 PassRefPtrWillBeRawPtr<HTMLBRElement> insertBlockPlaceholder(const Position&
); | |
| 147 PassRefPtrWillBeRawPtr<HTMLBRElement> addBlockPlaceholderIfNeeded(Element*); | |
| 148 void removePlaceholderAt(const Position&); | |
| 149 | |
| 150 PassRefPtrWillBeRawPtr<HTMLElement> insertNewDefaultParagraphElementAt(const
Position&); | |
| 151 | |
| 152 PassRefPtrWillBeRawPtr<HTMLElement> moveParagraphContentsToNewBlockIfNecessa
ry(const Position&); | |
| 153 | |
| 154 void pushAnchorElementDown(Element*); | |
| 155 | |
| 156 // FIXME: preserveSelection and preserveStyle should be enums | |
| 157 void moveParagraph(const VisiblePosition&, const VisiblePosition&, const Vis
iblePosition&, bool preserveSelection = false, bool preserveStyle = true, Node*
constrainingAncestor = nullptr); | |
| 158 void moveParagraphs(const VisiblePosition&, const VisiblePosition&, const Vi
siblePosition&, bool preserveSelection = false, bool preserveStyle = true, Node*
constrainingAncestor = nullptr); | |
| 159 void moveParagraphWithClones(const VisiblePosition& startOfParagraphToMove,
const VisiblePosition& endOfParagraphToMove, HTMLElement* blockElement, Node* ou
terNode); | |
| 160 void cloneParagraphUnderNewElement(const Position& start, const Position& en
d, Node* outerNode, Element* blockElement); | |
| 161 void cleanupAfterDeletion(VisiblePosition destination = VisiblePosition()); | |
| 162 | |
| 163 bool breakOutOfEmptyListItem(); | |
| 164 bool breakOutOfEmptyMailBlockquotedParagraph(); | |
| 165 | |
| 166 Position positionAvoidingSpecialElementBoundary(const Position&); | |
| 167 | |
| 168 PassRefPtrWillBeRawPtr<Node> splitTreeToNode(Node*, Node*, bool splitAncesto
r = false); | |
| 169 | |
| 170 WillBeHeapVector<RefPtrWillBeMember<EditCommand>> m_commands; | |
| 171 | |
| 172 private: | |
| 173 bool isCompositeEditCommand() const final { return true; } | |
| 174 | |
| 175 RefPtrWillBeMember<EditCommandComposition> m_composition; | |
| 176 }; | |
| 177 | |
| 178 DEFINE_TYPE_CASTS(CompositeEditCommand, EditCommand, command, command->isComposi
teEditCommand(), command.isCompositeEditCommand()); | |
| 179 | |
| 180 } // namespace blink | |
| 181 | |
| 182 #endif // CompositeEditCommand_h | |
| OLD | NEW |