| Index: Source/WebCore/editing/ReplaceSelectionCommand.cpp
|
| diff --git a/Source/WebCore/editing/ReplaceSelectionCommand.cpp b/Source/WebCore/editing/ReplaceSelectionCommand.cpp
|
| index c4132fafaa375f631790ee31c05657c1a67f355f..df213ccae542ea8c64c8abbc0c3332663873e8ff 100644
|
| --- a/Source/WebCore/editing/ReplaceSelectionCommand.cpp
|
| +++ b/Source/WebCore/editing/ReplaceSelectionCommand.cpp
|
| @@ -378,15 +378,7 @@ ReplaceSelectionCommand::ReplaceSelectionCommand(Document* document, PassRefPtr<
|
| {
|
| }
|
|
|
| -static bool hasMatchingQuoteLevel(VisiblePosition endOfExistingContent, VisiblePosition endOfInsertedContent)
|
| -{
|
| - Position existing = endOfExistingContent.deepEquivalent();
|
| - Position inserted = endOfInsertedContent.deepEquivalent();
|
| - bool isInsideMailBlockquote = enclosingNodeOfType(inserted, isMailBlockquote, CanCrossEditingBoundary);
|
| - return isInsideMailBlockquote && (numEnclosingMailBlockquotes(existing) == numEnclosingMailBlockquotes(inserted));
|
| -}
|
| -
|
| -bool ReplaceSelectionCommand::shouldMergeStart(bool selectionStartWasStartOfParagraph, bool fragmentHasInterchangeNewlineAtStart, bool selectionStartWasInsideMailBlockquote)
|
| +bool ReplaceSelectionCommand::shouldMergeStart(bool selectionStartWasStartOfParagraph, bool fragmentHasInterchangeNewlineAtStart)
|
| {
|
| if (m_movingParagraph)
|
| return false;
|
| @@ -395,14 +387,6 @@ bool ReplaceSelectionCommand::shouldMergeStart(bool selectionStartWasStartOfPara
|
| VisiblePosition prev = startOfInsertedContent.previous(CannotCrossEditingBoundary);
|
| if (prev.isNull())
|
| return false;
|
| -
|
| - // When we have matching quote levels, its ok to merge more frequently.
|
| - // For a successful merge, we still need to make sure that the inserted content starts with the beginning of a paragraph.
|
| - // And we should only merge here if the selection start was inside a mail blockquote. This prevents against removing a
|
| - // blockquote from newly pasted quoted content that was pasted into an unquoted position. If that unquoted position happens
|
| - // to be right after another blockquote, we don't want to merge and risk stripping a valid block (and newline) from the pasted content.
|
| - if (isStartOfParagraph(startOfInsertedContent) && selectionStartWasInsideMailBlockquote && hasMatchingQuoteLevel(prev, positionAtEndOfInsertedContent()))
|
| - return true;
|
|
|
| return !selectionStartWasStartOfParagraph
|
| && !fragmentHasInterchangeNewlineAtStart
|
| @@ -424,11 +408,6 @@ bool ReplaceSelectionCommand::shouldMergeEnd(bool selectionEndWasEndOfParagraph)
|
| && shouldMerge(endOfInsertedContent, next);
|
| }
|
|
|
| -static bool isMailPasteAsQuotationNode(const Node* node)
|
| -{
|
| - return node && node->hasTagName(blockquoteTag) && node->isElementNode() && toElement(node)->getAttribute(classAttr) == ApplePasteAsQuotation;
|
| -}
|
| -
|
| static bool isHeaderElement(const Node* a)
|
| {
|
| if (!a)
|
| @@ -456,8 +435,7 @@ bool ReplaceSelectionCommand::shouldMerge(const VisiblePosition& source, const V
|
| Node* destinationNode = destination.deepEquivalent().deprecatedNode();
|
| Node* sourceBlock = enclosingBlock(sourceNode);
|
| Node* destinationBlock = enclosingBlock(destinationNode);
|
| - return !enclosingNodeOfType(source.deepEquivalent(), &isMailPasteAsQuotationNode) &&
|
| - sourceBlock && (!sourceBlock->hasTagName(blockquoteTag) || isMailBlockquote(sourceBlock)) &&
|
| + return sourceBlock && !sourceBlock->hasTagName(blockquoteTag) &&
|
| enclosingListChild(sourceBlock) == enclosingListChild(destinationNode) &&
|
| enclosingTableCell(source.deepEquivalent()) == enclosingTableCell(destination.deepEquivalent()) &&
|
| (!isHeaderElement(sourceBlock) || haveSameTagName(sourceBlock, destinationBlock)) &&
|
| @@ -503,12 +481,6 @@ void ReplaceSelectionCommand::removeRedundantStylesAndKeepStyleSpanInline(Insert
|
|
|
| ContainerNode* context = element->parentNode();
|
|
|
| - // If Mail wraps the fragment with a Paste as Quotation blockquote, or if you're pasting into a quoted region,
|
| - // styles from blockquoteNode are allowed to override those from the source document, see <rdar://problem/4930986> and <rdar://problem/5089327>.
|
| - Node* blockquoteNode = isMailPasteAsQuotationNode(context) ? context : enclosingNodeOfType(firstPositionInNode(context), isMailBlockquote, CanCrossEditingBoundary);
|
| - if (blockquoteNode)
|
| - newInlineStyle->removeStyleFromRulesAndContext(element, document()->documentElement());
|
| -
|
| newInlineStyle->removeStyleFromRulesAndContext(element, context);
|
| }
|
|
|
| @@ -720,11 +692,6 @@ static bool handleStyleSpansBeforeInsertion(ReplacementFragment& fragment, const
|
| {
|
| Node* topNode = fragment.firstChild();
|
|
|
| - // Handling the case where we are doing Paste as Quotation or pasting into quoted content is more complicated (see handleStyleSpans)
|
| - // and doesn't receive the optimization.
|
| - if (isMailPasteAsQuotationNode(topNode) || enclosingNodeOfType(firstPositionInOrBeforeNode(topNode), isMailBlockquote, CanCrossEditingBoundary))
|
| - return false;
|
| -
|
| // Either there are no style spans in the fragment or a WebKit client has added content to the fragment
|
| // before inserting it. Look for and handle style spans after insertion.
|
| if (!isLegacyAppleStyleSpan(topNode))
|
| @@ -772,12 +739,6 @@ void ReplaceSelectionCommand::handleStyleSpans(InsertedNodes& insertedNodes)
|
| RefPtr<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,
|
| - // styles from blockquoteNode are allowed to override those from the source document, see <rdar://problem/4930986> and <rdar://problem/5089327>.
|
| - Node* blockquoteNode = isMailPasteAsQuotationNode(context) ? context : enclosingNodeOfType(firstPositionInNode(context), isMailBlockquote, CanCrossEditingBoundary);
|
| - if (blockquoteNode)
|
| - context = document()->documentElement();
|
| -
|
| // This operation requires that only editing styles to be removed from sourceDocumentStyle.
|
| style->prepareToApplyAt(firstPositionInNode(context));
|
|
|
| @@ -868,8 +829,7 @@ static bool isInlineNodeWithStyle(const Node* node)
|
| const HTMLElement* element = static_cast<const HTMLElement*>(node);
|
| const AtomicString& classAttributeValue = element->getAttribute(classAttr);
|
| if (classAttributeValue == AppleTabSpanClass
|
| - || classAttributeValue == AppleConvertedSpace
|
| - || classAttributeValue == ApplePasteAsQuotation)
|
| + || classAttributeValue == AppleConvertedSpace)
|
| return true;
|
|
|
| return EditingStyle::elementIsStyledSpanOrHTMLEquivalent(element);
|
| @@ -915,11 +875,10 @@ void ReplaceSelectionCommand::doApply()
|
| Node* startBlock = enclosingBlock(visibleStart.deepEquivalent().deprecatedNode());
|
|
|
| Position insertionPos = selection.start();
|
| - bool startIsInsideMailBlockquote = enclosingNodeOfType(insertionPos, isMailBlockquote, CanCrossEditingBoundary);
|
| bool selectionIsPlainText = !selection.isContentRichlyEditable();
|
| Element* currentRoot = selection.rootEditableElement();
|
|
|
| - if ((selectionStartWasStartOfParagraph && selectionEndWasEndOfParagraph && !startIsInsideMailBlockquote) ||
|
| + if ((selectionStartWasStartOfParagraph && selectionEndWasEndOfParagraph) ||
|
| startBlock == currentRoot || isListItem(startBlock) || selectionIsPlainText)
|
| m_preventNesting = false;
|
|
|
| @@ -928,9 +887,7 @@ void ReplaceSelectionCommand::doApply()
|
| // spans multiple blocks, not merging may leave an empty line.
|
| // When the start of the selection being pasted into is at the start of a block, not merging
|
| // will leave hanging block(s).
|
| - // Merge blocks if the start of the selection was in a Mail blockquote, since we handle
|
| - // that case specially to prevent nesting.
|
| - bool mergeBlocksAfterDelete = startIsInsideMailBlockquote || isEndOfParagraph(visibleEnd) || isStartOfBlock(visibleStart);
|
| + bool mergeBlocksAfterDelete = isEndOfParagraph(visibleEnd) || isStartOfBlock(visibleStart);
|
| // FIXME: We should only expand to include fully selected special elements if we are copying a
|
| // selection and pasting it on top of itself.
|
| deleteSelection(false, mergeBlocksAfterDelete, true, false);
|
| @@ -958,27 +915,13 @@ void ReplaceSelectionCommand::doApply()
|
| // For example paste <div>foo</div><div>bar</div><div>baz</div> into <div>x^x</div>, where ^ is the caret.
|
| // As long as the div styles are the same, visually you'd expect: <div>xbar</div><div>bar</div><div>bazx</div>,
|
| // not <div>xbar<div>bar</div><div>bazx</div></div>.
|
| - // Don't do this if the selection started in a Mail blockquote.
|
| - if (m_preventNesting && !startIsInsideMailBlockquote && !isEndOfParagraph(visibleStart) && !isStartOfParagraph(visibleStart)) {
|
| + if (m_preventNesting && !isEndOfParagraph(visibleStart) && !isStartOfParagraph(visibleStart)) {
|
| insertParagraphSeparator();
|
| setEndingSelection(endingSelection().visibleStart().previous());
|
| }
|
| insertionPos = endingSelection().start();
|
| }
|
|
|
| - // We don't want any of the pasted content to end up nested in a Mail blockquote, so first break
|
| - // out of any surrounding Mail blockquotes. Unless we're inserting in a table, in which case
|
| - // breaking the blockquote will prevent the content from actually being inserted in the table.
|
| - if (startIsInsideMailBlockquote && m_preventNesting && !(enclosingNodeOfType(insertionPos, &isTableStructureNode))) {
|
| - applyCommandToComposite(BreakBlockquoteCommand::create(document()));
|
| - // This will leave a br between the split.
|
| - Node* br = endingSelection().start().deprecatedNode();
|
| - ASSERT(br->hasTagName(brTag));
|
| - // Insert content between the two blockquotes, but remove the br (since it was just a placeholder).
|
| - insertionPos = positionInParentBeforeNode(br);
|
| - removeNode(br);
|
| - }
|
| -
|
| // Inserting content could cause whitespace to collapse, e.g. inserting <div>foo</div> into hello^ world.
|
| prepareWhitespaceAtPositionForSplit(insertionPos);
|
|
|
| @@ -997,8 +940,7 @@ void ReplaceSelectionCommand::doApply()
|
| startBlock = enclosingBlock(insertionPos.deprecatedNode());
|
|
|
| // Adjust insertionPos to prevent nesting.
|
| - // If the start was in a Mail blockquote, we will have already handled adjusting insertionPos above.
|
| - if (m_preventNesting && startBlock && !isTableCell(startBlock) && !startIsInsideMailBlockquote) {
|
| + if (m_preventNesting && startBlock && !isTableCell(startBlock)) {
|
| ASSERT(startBlock != currentRoot);
|
| VisiblePosition visibleInsertionPos(insertionPos);
|
| if (isEndOfBlock(visibleInsertionPos) && !(isStartOfBlock(visibleInsertionPos) && fragment.hasInterchangeNewlineAtEnd()))
|
| @@ -1145,7 +1087,7 @@ void ReplaceSelectionCommand::doApply()
|
| // the start merge so that the start merge doesn't effect our decision.
|
| m_shouldMergeEnd = shouldMergeEnd(selectionEndWasEndOfParagraph);
|
|
|
| - if (shouldMergeStart(selectionStartWasStartOfParagraph, fragment.hasInterchangeNewlineAtStart(), startIsInsideMailBlockquote)) {
|
| + if (shouldMergeStart(selectionStartWasStartOfParagraph, fragment.hasInterchangeNewlineAtStart())) {
|
| VisiblePosition startOfParagraphToMove = positionAtStartOfInsertedContent();
|
| VisiblePosition destination = startOfParagraphToMove.previous();
|
| // We need to handle the case where we need to merge the end
|
| @@ -1194,8 +1136,7 @@ void ReplaceSelectionCommand::doApply()
|
| } else {
|
| // Use a default paragraph element (a plain div) for the empty paragraph, using the last paragraph
|
| // block's style seems to annoy users.
|
| - insertParagraphSeparator(true, !startIsInsideMailBlockquote && highestEnclosingNodeOfType(endOfInsertedContent.deepEquivalent(),
|
| - isMailBlockquote, CannotCrossEditingBoundary, insertedNodes.firstNodeInserted()->parentNode()));
|
| + insertParagraphSeparator(true);
|
| }
|
|
|
| // Select up to the paragraph separator that was added.
|
| @@ -1210,9 +1151,6 @@ void ReplaceSelectionCommand::doApply()
|
| } else
|
| mergeEndIfNeeded();
|
|
|
| - if (Node* mailBlockquote = enclosingNodeOfType(positionAtStartOfInsertedContent().deepEquivalent(), isMailPasteAsQuotationNode))
|
| - removeNodeAttribute(toElement(mailBlockquote), classAttr);
|
| -
|
| if (shouldPerformSmartReplace())
|
| addSpacesForSmartReplace();
|
|
|
|
|