| Index: Source/core/editing/ReplaceSelectionCommand.cpp
|
| diff --git a/Source/core/editing/ReplaceSelectionCommand.cpp b/Source/core/editing/ReplaceSelectionCommand.cpp
|
| index 40b1c380a54ca46172fc35903e39817d3b08c41f..896c57d5bda63276ab218c75d64ed7ceb6d69823 100644
|
| --- a/Source/core/editing/ReplaceSelectionCommand.cpp
|
| +++ b/Source/core/editing/ReplaceSelectionCommand.cpp
|
| @@ -77,16 +77,16 @@ public:
|
| bool hasInterchangeNewlineAtStart() const { return m_hasInterchangeNewlineAtStart; }
|
| bool hasInterchangeNewlineAtEnd() const { return m_hasInterchangeNewlineAtEnd; }
|
|
|
| - void removeNode(PassRefPtr<Node>);
|
| - void removeNodePreservingChildren(PassRefPtr<Node>);
|
| + void removeNode(PassRefPtrWillBeRawPtr<Node>);
|
| + void removeNodePreservingChildren(PassRefPtrWillBeRawPtr<Node>);
|
|
|
| private:
|
| - PassRefPtr<Element> insertFragmentForTestRendering(Node* rootEditableNode);
|
| + PassRefPtrWillBeRawPtr<Element> insertFragmentForTestRendering(Node* rootEditableNode);
|
| void removeUnrenderedNodes(Node*);
|
| void restoreAndRemoveTestRenderingNodesToFragment(Element*);
|
| void removeInterchangeNodes(Node*);
|
|
|
| - void insertNodeBefore(PassRefPtr<Node> node, Node* refNode);
|
| + void insertNodeBefore(PassRefPtrWillBeRawPtr<Node>, Node* refNode);
|
|
|
| RefPtrWillBeMember<Document> m_document;
|
| RefPtrWillBeMember<DocumentFragment> m_fragment;
|
| @@ -145,7 +145,7 @@ ReplacementFragment::ReplacementFragment(Document* document, DocumentFragment* f
|
| if (!m_fragment->firstChild())
|
| return;
|
|
|
| - RefPtr<Element> editableRoot = selection.rootEditableElement();
|
| + RefPtrWillBeRawPtr<Element> editableRoot = selection.rootEditableElement();
|
| ASSERT(editableRoot);
|
| if (!editableRoot)
|
| return;
|
| @@ -160,7 +160,7 @@ ReplacementFragment::ReplacementFragment(Document* document, DocumentFragment* f
|
| return;
|
| }
|
|
|
| - RefPtr<Element> holder = insertFragmentForTestRendering(editableRoot.get());
|
| + RefPtrWillBeRawPtr<Element> holder = insertFragmentForTestRendering(editableRoot.get());
|
| if (!holder) {
|
| removeInterchangeNodes(m_fragment.get());
|
| return;
|
| @@ -205,19 +205,19 @@ Node *ReplacementFragment::lastChild() const
|
| return m_fragment ? m_fragment->lastChild() : 0;
|
| }
|
|
|
| -void ReplacementFragment::removeNodePreservingChildren(PassRefPtr<Node> node)
|
| +void ReplacementFragment::removeNodePreservingChildren(PassRefPtrWillBeRawPtr<Node> node)
|
| {
|
| if (!node)
|
| return;
|
|
|
| - while (RefPtr<Node> n = node->firstChild()) {
|
| + while (RefPtrWillBeRawPtr<Node> n = node->firstChild()) {
|
| removeNode(n);
|
| insertNodeBefore(n.release(), node.get());
|
| }
|
| removeNode(node);
|
| }
|
|
|
| -void ReplacementFragment::removeNode(PassRefPtr<Node> node)
|
| +void ReplacementFragment::removeNode(PassRefPtrWillBeRawPtr<Node> node)
|
| {
|
| if (!node)
|
| return;
|
| @@ -229,7 +229,7 @@ void ReplacementFragment::removeNode(PassRefPtr<Node> node)
|
| parent->removeChild(node.get());
|
| }
|
|
|
| -void ReplacementFragment::insertNodeBefore(PassRefPtr<Node> node, Node* refNode)
|
| +void ReplacementFragment::insertNodeBefore(PassRefPtrWillBeRawPtr<Node> node, Node* refNode)
|
| {
|
| if (!node || !refNode)
|
| return;
|
| @@ -241,10 +241,10 @@ void ReplacementFragment::insertNodeBefore(PassRefPtr<Node> node, Node* refNode)
|
| parent->insertBefore(node, refNode);
|
| }
|
|
|
| -PassRefPtr<Element> ReplacementFragment::insertFragmentForTestRendering(Node* rootEditableElement)
|
| +PassRefPtrWillBeRawPtr<Element> ReplacementFragment::insertFragmentForTestRendering(Node* rootEditableElement)
|
| {
|
| ASSERT(m_document);
|
| - RefPtr<Element> holder = createDefaultParagraphElement(*m_document.get());
|
| + RefPtrWillBeRawPtr<Element> holder = createDefaultParagraphElement(*m_document.get());
|
|
|
| holder->appendChild(m_fragment);
|
| rootEditableElement->appendChild(holder.get());
|
| @@ -258,7 +258,7 @@ void ReplacementFragment::restoreAndRemoveTestRenderingNodesToFragment(Element*
|
| if (!holder)
|
| return;
|
|
|
| - while (RefPtr<Node> node = holder->firstChild()) {
|
| + while (RefPtrWillBeRawPtr<Node> node = holder->firstChild()) {
|
| holder->removeChild(node.get());
|
| m_fragment->appendChild(node.get());
|
| }
|
| @@ -268,7 +268,7 @@ void ReplacementFragment::restoreAndRemoveTestRenderingNodesToFragment(Element*
|
|
|
| void ReplacementFragment::removeUnrenderedNodes(Node* holder)
|
| {
|
| - Vector<RefPtr<Node> > unrendered;
|
| + WillBeHeapVector<RefPtrWillBeMember<Node> > unrendered;
|
|
|
| for (Node* node = holder->firstChild(); node; node = NodeTraversal::next(*node, holder))
|
| if (!isNodeRendered(node) && !isTableStructureNode(node))
|
| @@ -311,7 +311,7 @@ void ReplacementFragment::removeInterchangeNodes(Node* container)
|
|
|
| node = container->firstChild();
|
| while (node) {
|
| - RefPtr<Node> next = NodeTraversal::next(*node);
|
| + RefPtrWillBeRawPtr<Node> next = NodeTraversal::next(*node);
|
| if (isInterchangeConvertedSpaceSpan(node)) {
|
| next = NodeTraversal::nextSkippingChildren(*node);
|
| removeNodePreservingChildren(node);
|
| @@ -330,29 +330,29 @@ inline void ReplaceSelectionCommand::InsertedNodes::respondToNodeInsertion(Node&
|
|
|
| inline void ReplaceSelectionCommand::InsertedNodes::willRemoveNodePreservingChildren(Node& node)
|
| {
|
| - if (m_firstNodeInserted == node)
|
| + if (m_firstNodeInserted.get() == node)
|
| m_firstNodeInserted = NodeTraversal::next(node);
|
| - if (m_lastNodeInserted == node)
|
| + if (m_lastNodeInserted.get() == node)
|
| m_lastNodeInserted = node.lastChild() ? node.lastChild() : NodeTraversal::nextSkippingChildren(node);
|
| }
|
|
|
| inline void ReplaceSelectionCommand::InsertedNodes::willRemoveNode(Node& node)
|
| {
|
| - if (m_firstNodeInserted == node && m_lastNodeInserted == node) {
|
| + if (m_firstNodeInserted.get() == node && m_lastNodeInserted.get() == node) {
|
| m_firstNodeInserted = nullptr;
|
| m_lastNodeInserted = nullptr;
|
| - } else if (m_firstNodeInserted == node) {
|
| + } else if (m_firstNodeInserted.get() == node) {
|
| m_firstNodeInserted = NodeTraversal::nextSkippingChildren(*m_firstNodeInserted);
|
| - } else if (m_lastNodeInserted == node) {
|
| + } else if (m_lastNodeInserted.get() == node) {
|
| m_lastNodeInserted = NodeTraversal::previousSkippingChildren(*m_lastNodeInserted);
|
| }
|
| }
|
|
|
| inline void ReplaceSelectionCommand::InsertedNodes::didReplaceNode(Node& node, Node& newNode)
|
| {
|
| - if (m_firstNodeInserted == node)
|
| + if (m_firstNodeInserted.get() == node)
|
| m_firstNodeInserted = &newNode;
|
| - if (m_lastNodeInserted == node)
|
| + if (m_lastNodeInserted.get() == node)
|
| m_lastNodeInserted = &newNode;
|
| }
|
|
|
| @@ -462,9 +462,9 @@ bool ReplaceSelectionCommand::shouldMerge(const VisiblePosition& source, const V
|
| // a div inserted into a document with div { display:inline; }.
|
| void ReplaceSelectionCommand::removeRedundantStylesAndKeepStyleSpanInline(InsertedNodes& insertedNodes)
|
| {
|
| - RefPtr<Node> pastEndNode = insertedNodes.pastLastLeaf();
|
| - RefPtr<Node> next;
|
| - for (RefPtr<Node> node = insertedNodes.firstNodeInserted(); node && node != pastEndNode; node = next) {
|
| + RefPtrWillBeRawPtr<Node> pastEndNode = insertedNodes.pastLastLeaf();
|
| + RefPtrWillBeRawPtr<Node> next = nullptr;
|
| + for (RefPtrWillBeRawPtr<Node> node = insertedNodes.firstNodeInserted(); node && node != pastEndNode; node = next) {
|
| // FIXME: <rdar://problem/5371536> Style rules that match pasted content can change it's appearance
|
|
|
| next = NodeTraversal::next(*node);
|
| @@ -474,7 +474,7 @@ void ReplaceSelectionCommand::removeRedundantStylesAndKeepStyleSpanInline(Insert
|
| Element* element = toElement(node);
|
|
|
| const StylePropertySet* inlineStyle = element->inlineStyle();
|
| - RefPtr<EditingStyle> newInlineStyle = EditingStyle::create(inlineStyle);
|
| + RefPtrWillBeRawPtr<EditingStyle> newInlineStyle = EditingStyle::create(inlineStyle);
|
| if (inlineStyle) {
|
| if (element->isHTMLElement()) {
|
| Vector<QualifiedName> attributes;
|
| @@ -612,9 +612,9 @@ static bool isProhibitedParagraphChild(const AtomicString& name)
|
|
|
| void ReplaceSelectionCommand::makeInsertedContentRoundTrippableWithHTMLTreeBuilder(const InsertedNodes& insertedNodes)
|
| {
|
| - RefPtr<Node> pastEndNode = insertedNodes.pastLastLeaf();
|
| - RefPtr<Node> next;
|
| - for (RefPtr<Node> node = insertedNodes.firstNodeInserted(); node && node != pastEndNode; node = next) {
|
| + RefPtrWillBeRawPtr<Node> pastEndNode = insertedNodes.pastLastLeaf();
|
| + RefPtrWillBeRawPtr<Node> next = nullptr;
|
| + for (RefPtrWillBeRawPtr<Node> node = insertedNodes.firstNodeInserted(); node && node != pastEndNode; node = next) {
|
| next = NodeTraversal::next(*node);
|
|
|
| if (!node->isHTMLElement())
|
| @@ -632,10 +632,10 @@ void ReplaceSelectionCommand::makeInsertedContentRoundTrippableWithHTMLTreeBuild
|
| }
|
| }
|
|
|
| -void ReplaceSelectionCommand::moveNodeOutOfAncestor(PassRefPtr<Node> prpNode, PassRefPtr<Node> prpAncestor)
|
| +void ReplaceSelectionCommand::moveNodeOutOfAncestor(PassRefPtrWillBeRawPtr<Node> prpNode, PassRefPtrWillBeRawPtr<Node> prpAncestor)
|
| {
|
| - RefPtr<Node> node = prpNode;
|
| - RefPtr<Node> ancestor = prpAncestor;
|
| + RefPtrWillBeRawPtr<Node> node = prpNode;
|
| + RefPtrWillBeRawPtr<Node> ancestor = prpAncestor;
|
|
|
| if (!ancestor->parentNode()->rendererIsEditable())
|
| return;
|
| @@ -649,7 +649,7 @@ void ReplaceSelectionCommand::moveNodeOutOfAncestor(PassRefPtr<Node> prpNode, Pa
|
| else
|
| appendNode(node, ancestor->parentNode());
|
| } else {
|
| - RefPtr<Node> nodeToSplitTo = splitTreeToNode(node.get(), ancestor.get(), true);
|
| + RefPtrWillBeRawPtr<Node> nodeToSplitTo = splitTreeToNode(node.get(), ancestor.get(), true);
|
| removeNode(node);
|
| insertNodeBefore(node, nodeToSplitTo);
|
| }
|
| @@ -729,7 +729,7 @@ static bool handleStyleSpansBeforeInsertion(ReplacementFragment& fragment, const
|
| return false;
|
|
|
| Node* wrappingStyleSpan = topNode;
|
| - RefPtr<EditingStyle> styleAtInsertionPos = EditingStyle::create(insertionPos.parentAnchoredEquivalent());
|
| + RefPtrWillBeRawPtr<EditingStyle> styleAtInsertionPos = EditingStyle::create(insertionPos.parentAnchoredEquivalent());
|
| String styleText = styleAtInsertionPos->style()->asText();
|
|
|
| // FIXME: This string comparison is a naive way of comparing two styles.
|
| @@ -767,7 +767,7 @@ void ReplaceSelectionCommand::handleStyleSpans(InsertedNodes& insertedNodes)
|
| if (!wrappingStyleSpan)
|
| return;
|
|
|
| - RefPtr<EditingStyle> style = EditingStyle::create(wrappingStyleSpan->inlineStyle());
|
| + RefPtrWillBeRawPtr<EditingStyle> style = EditingStyle::create(wrappingStyleSpan->inlineStyle());
|
| ContainerNode* context = wrappingStyleSpan->parentNode();
|
|
|
| // If Mail wraps the fragment with a Paste as Quotation blockquote, or if you're pasting into a quoted region,
|
| @@ -820,7 +820,7 @@ void ReplaceSelectionCommand::mergeEndIfNeeded()
|
| // Merging forward could result in deleting the destination anchor node.
|
| // To avoid this, we add a placeholder node before the start of the paragraph.
|
| if (endOfParagraph(startOfParagraphToMove) == destination) {
|
| - RefPtr<Node> placeholder = createBreakElement(document());
|
| + RefPtrWillBeRawPtr<Node> placeholder = createBreakElement(document());
|
| insertNodeBefore(placeholder, startOfParagraphToMove.deepEquivalent().deprecatedNode());
|
| destination = VisiblePosition(positionBeforeNode(placeholder.get()));
|
| }
|
| @@ -993,7 +993,7 @@ void ReplaceSelectionCommand::doApply()
|
| if (endBR)
|
| originalVisPosBeforeEndBR = VisiblePosition(positionBeforeNode(endBR), DOWNSTREAM).previous();
|
|
|
| - RefPtr<Node> insertionBlock = enclosingBlock(insertionPos.deprecatedNode());
|
| + RefPtrWillBeRawPtr<Node> insertionBlock = enclosingBlock(insertionPos.deprecatedNode());
|
|
|
| // Adjust insertionPos to prevent nesting.
|
| // If the start was in a Mail blockquote, we will have already handled adjusting insertionPos above.
|
| @@ -1042,7 +1042,7 @@ void ReplaceSelectionCommand::doApply()
|
| insertionPos = firstPositionInNode(insertionPos.containerNode());
|
| }
|
|
|
| - if (RefPtr<Node> nodeToSplitTo = nodeToSplitToAvoidPastingIntoInlineNodesWithStyle(insertionPos)) {
|
| + if (RefPtrWillBeRawPtr<Node> nodeToSplitTo = nodeToSplitToAvoidPastingIntoInlineNodesWithStyle(insertionPos)) {
|
| if (insertionPos.containerNode() != nodeToSplitTo->parentNode()) {
|
| Node* splitStart = insertionPos.computeNodeAfterPosition();
|
| if (!splitStart)
|
| @@ -1067,9 +1067,9 @@ void ReplaceSelectionCommand::doApply()
|
| // 6) Select the replacement if requested, and match style if requested.
|
|
|
| InsertedNodes insertedNodes;
|
| - RefPtr<Node> refNode = fragment.firstChild();
|
| + RefPtrWillBeRawPtr<Node> refNode = fragment.firstChild();
|
| ASSERT(refNode);
|
| - RefPtr<Node> node = refNode->nextSibling();
|
| + RefPtrWillBeRawPtr<Node> node = refNode->nextSibling();
|
|
|
| fragment.removeNode(refNode);
|
|
|
| @@ -1089,7 +1089,7 @@ void ReplaceSelectionCommand::doApply()
|
| bool plainTextFragment = isPlainTextMarkup(refNode.get());
|
|
|
| while (node) {
|
| - RefPtr<Node> next = node->nextSibling();
|
| + RefPtrWillBeRawPtr<Node> next = node->nextSibling();
|
| fragment.removeNode(node.get());
|
| insertNodeAfter(node, refNode);
|
| insertedNodes.respondToNodeInsertion(*node);
|
| @@ -1126,7 +1126,7 @@ void ReplaceSelectionCommand::doApply()
|
| insertNodeAt(createBreakElement(document()).get(), startOfInsertedContent.deepEquivalent());
|
|
|
| if (endBR && (plainTextFragment || (shouldRemoveEndBR(endBR, originalVisPosBeforeEndBR) && !(fragment.hasInterchangeNewlineAtEnd() && selectionIsPlainText)))) {
|
| - RefPtr<Node> parent = endBR->parentNode();
|
| + RefPtrWillBeRawPtr<Node> parent = endBR->parentNode();
|
| insertedNodes.willRemoveNode(*endBR);
|
| removeNode(endBR);
|
| if (Node* nodeToRemove = highestNodeToRemoveInPruning(parent.get())) {
|
| @@ -1193,7 +1193,7 @@ void ReplaceSelectionCommand::doApply()
|
| setEndingSelection(endOfInsertedContent);
|
| Node* enclosingNode = enclosingBlock(endOfInsertedContent.deepEquivalent().deprecatedNode());
|
| if (isListItem(enclosingNode)) {
|
| - RefPtr<Node> newListItem = createListItemElement(document());
|
| + RefPtrWillBeRawPtr<Node> newListItem = createListItemElement(document());
|
| insertNodeAfter(newListItem, enclosingNode);
|
| setEndingSelection(VisiblePosition(firstPositionInNode(newListItem.get())));
|
| } else {
|
| @@ -1287,7 +1287,7 @@ void ReplaceSelectionCommand::addSpacesForSmartReplace()
|
| if (m_endOfInsertedContent.containerNode() == endNode)
|
| m_endOfInsertedContent.moveToOffset(m_endOfInsertedContent.offsetInContainerNode() + 1);
|
| } else {
|
| - RefPtr<Node> node = document().createEditingTextNode(collapseWhiteSpace ? nonBreakingSpaceString() : " ");
|
| + RefPtrWillBeRawPtr<Node> node = document().createEditingTextNode(collapseWhiteSpace ? nonBreakingSpaceString() : " ");
|
| insertNodeAfter(node, endNode);
|
| updateNodesInserted(node.get());
|
| }
|
| @@ -1311,7 +1311,7 @@ void ReplaceSelectionCommand::addSpacesForSmartReplace()
|
| if (m_endOfInsertedContent.containerNode() == startNode && m_endOfInsertedContent.offsetInContainerNode())
|
| m_endOfInsertedContent.moveToOffset(m_endOfInsertedContent.offsetInContainerNode() + 1);
|
| } else {
|
| - RefPtr<Node> node = document().createEditingTextNode(collapseWhiteSpace ? nonBreakingSpaceString() : " ");
|
| + RefPtrWillBeRawPtr<Node> node = document().createEditingTextNode(collapseWhiteSpace ? nonBreakingSpaceString() : " ");
|
| // Don't updateNodesInserted. Doing so would set m_endOfInsertedContent to be the node containing the leading space,
|
| // but m_endOfInsertedContent is supposed to mark the end of pasted content.
|
| insertNodeBefore(node, startNode);
|
| @@ -1436,7 +1436,7 @@ Node* ReplaceSelectionCommand::insertAsListItems(PassRefPtrWillBeRawPtr<HTMLElem
|
| splitTreeToNode(insertPos.deprecatedNode(), lastNode, true);
|
| }
|
|
|
| - while (RefPtr<Node> listItem = listElement->firstChild()) {
|
| + while (RefPtrWillBeRawPtr<Node> listItem = listElement->firstChild()) {
|
| listElement->removeChild(listItem.get(), ASSERT_NO_EXCEPTION);
|
| if (isStart || isMiddle) {
|
| insertNodeBefore(listItem, lastNode);
|
| @@ -1483,7 +1483,7 @@ bool ReplaceSelectionCommand::performTrivialReplace(const ReplacementFragment& f
|
| if (nodeToSplitToAvoidPastingIntoInlineNodesWithStyle(endingSelection().start()))
|
| return false;
|
|
|
| - RefPtr<Node> nodeAfterInsertionPos = endingSelection().end().downstream().anchorNode();
|
| + RefPtrWillBeRawPtr<Node> nodeAfterInsertionPos = endingSelection().end().downstream().anchorNode();
|
| Text* textNode = toText(fragment.firstChild());
|
| // Our fragment creation code handles tabs, spaces, and newlines, so we don't have to worry about those here.
|
|
|
| @@ -1503,4 +1503,13 @@ bool ReplaceSelectionCommand::performTrivialReplace(const ReplacementFragment& f
|
| return true;
|
| }
|
|
|
| +void ReplaceSelectionCommand::trace(Visitor* visitor)
|
| +{
|
| + visitor->trace(m_startOfInsertedContent);
|
| + visitor->trace(m_endOfInsertedContent);
|
| + visitor->trace(m_insertionStyle);
|
| + visitor->trace(m_documentFragment);
|
| + CompositeEditCommand::trace(visitor);
|
| +}
|
| +
|
| } // namespace WebCore
|
|
|