| Index: third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
|
| diff --git a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
|
| index be7c50135b4d1bf6efab0bfefaf2300d84a36705..114e8543491a09cf284e8fc10fe4fc55a10228b0 100644
|
| --- a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
|
| @@ -672,39 +672,6 @@ void ReplaceSelectionCommand::removeRedundantStylesAndKeepStyleSpanInline(
|
| hasRichlyEditableStyle(*element)) {
|
| removeElementAttribute(element, contenteditableAttr);
|
| }
|
| -
|
| - // WebKit used to not add display: inline and float: none on copy.
|
| - // Keep this code around for backward compatibility
|
| - if (isLegacyAppleHTMLSpanElement(element)) {
|
| - if (!element->hasChildren()) {
|
| - insertedNodes.willRemoveNodePreservingChildren(*element);
|
| - removeNodePreservingChildren(element, editingState);
|
| - if (editingState->isAborted())
|
| - return;
|
| - continue;
|
| - }
|
| - // There are other styles that style rules can give to style spans, but
|
| - // these are the two important ones because they'll prevent inserted
|
| - // content from appearing in the right paragraph.
|
| - // FIXME: Hyatt is concerned that selectively using display:inline will
|
| - // give inconsistent results. We already know one issue because td
|
| - // elements ignore their display property in quirks mode (which Mail.app
|
| - // is always in). We should look for an alternative.
|
| -
|
| - // Mutate using the CSSOM wrapper so we get the same event behavior as a
|
| - // script.
|
| - if (isEnclosingBlock(element)) {
|
| - element->style()->setPropertyInternal(CSSPropertyDisplay, String(),
|
| - "inline", false,
|
| - IGNORE_EXCEPTION_FOR_TESTING);
|
| - }
|
| - if (element->layoutObject() &&
|
| - element->layoutObject()->style()->isFloating()) {
|
| - element->style()->setPropertyInternal(CSSPropertyFloat, String(),
|
| - "none", false,
|
| - IGNORE_EXCEPTION_FOR_TESTING);
|
| - }
|
| - }
|
| }
|
| }
|
|
|
| @@ -898,11 +865,11 @@ static bool followBlockElementStyle(const Node* node) {
|
|
|
| // Remove style spans before insertion if they are unnecessary. It's faster
|
| // because we'll avoid doing a layout.
|
| -static bool handleStyleSpansBeforeInsertion(ReplacementFragment& fragment,
|
| +static void handleStyleSpansBeforeInsertion(ReplacementFragment& fragment,
|
| const Position& insertionPos) {
|
| Node* topNode = fragment.firstChild();
|
| if (!isHTMLSpanElement(topNode))
|
| - return false;
|
| + return;
|
|
|
| // Handling the case where we are doing Paste as Quotation or pasting into
|
| // quoted content is more complicated (see handleStyleSpans) and doesn't
|
| @@ -910,7 +877,7 @@ static bool handleStyleSpansBeforeInsertion(ReplacementFragment& fragment,
|
| if (isMailPasteAsQuotationHTMLBlockQuoteElement(topNode) ||
|
| enclosingNodeOfType(firstPositionInOrBeforeNode(topNode),
|
| isMailHTMLBlockquoteElement, CanCrossEditingBoundary))
|
| - return false;
|
| + return;
|
|
|
| // Remove style spans to follow the styles of parent block element when
|
| // |fragment| becomes a part of it. See bugs http://crbug.com/226941 and
|
| @@ -923,20 +890,14 @@ static bool handleStyleSpansBeforeInsertion(ReplacementFragment& fragment,
|
| if (isInline(node)) {
|
| node = enclosingBlock(insertionPos.anchorNode());
|
| if (!node)
|
| - return false;
|
| + return;
|
| }
|
|
|
| if (followBlockElementStyle(node)) {
|
| fragment.removeNodePreservingChildren(wrappingStyleSpan);
|
| - return true;
|
| + return;
|
| }
|
|
|
| - // 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 (!isLegacyAppleHTMLSpanElement(topNode))
|
| - return false;
|
| -
|
| EditingStyle* styleAtInsertionPos =
|
| EditingStyle::create(insertionPos.parentAnchoredEquivalent());
|
| String styleText = styleAtInsertionPos->style()->asText();
|
| @@ -944,82 +905,9 @@ static bool handleStyleSpansBeforeInsertion(ReplacementFragment& fragment,
|
| // FIXME: This string comparison is a naive way of comparing two styles.
|
| // We should be taking the diff and check that the diff is empty.
|
| if (styleText != wrappingStyleSpan->getAttribute(styleAttr))
|
| - return false;
|
| -
|
| - fragment.removeNodePreservingChildren(wrappingStyleSpan);
|
| - return true;
|
| -}
|
| -
|
| -// At copy time, WebKit wraps copied content in a span that contains the source
|
| -// document's default styles. If the copied Range inherits any other styles
|
| -// from its ancestors, we put those styles on a second span. This function
|
| -// removes redundant styles from those spans, and removes the
|
| -// spans if all their styles are redundant.
|
| -// We should remove the Apple-style-span class when we're done, see
|
| -// <rdar://problem/5685600>.
|
| -// We should remove styles from spans that are overridden by all of their
|
| -// children, either here or at copy time.
|
| -void ReplaceSelectionCommand::handleStyleSpans(InsertedNodes& insertedNodes,
|
| - EditingState* editingState) {
|
| - if (!insertedNodes.firstNodeInserted())
|
| - return;
|
| -
|
| - HTMLSpanElement* wrappingStyleSpan = nullptr;
|
| - // The style span that contains the source document's default style should be
|
| - // at the top of the fragment, but Mail sometimes adds a wrapper (for Paste As
|
| - // Quotation), so search for the top level style span instead of assuming it's
|
| - // at the top.
|
| -
|
| - for (Node& node :
|
| - NodeTraversal::startsAt(*insertedNodes.firstNodeInserted())) {
|
| - if (isLegacyAppleHTMLSpanElement(&node)) {
|
| - wrappingStyleSpan = toHTMLSpanElement(&node);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // There might not be any style spans if we're pasting from another
|
| - // application or if we are here because of a
|
| - // document.execCommand("InsertHTML", ...) call.
|
| - if (!wrappingStyleSpan)
|
| return;
|
|
|
| - 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 blockquoteElement are
|
| - // allowed to override those from the source document, see
|
| - // <rdar://problem/4930986> and <rdar://problem/5089327>.
|
| - HTMLQuoteElement* blockquoteElement =
|
| - isMailPasteAsQuotationHTMLBlockQuoteElement(context)
|
| - ? toHTMLQuoteElement(context)
|
| - : toHTMLQuoteElement(enclosingNodeOfType(
|
| - Position::firstPositionInNode(context),
|
| - isMailHTMLBlockquoteElement, CanCrossEditingBoundary));
|
| - if (blockquoteElement)
|
| - context = document().documentElement();
|
| -
|
| - // This operation requires that only editing styles to be removed from
|
| - // sourceDocumentStyle.
|
| - style->prepareToApplyAt(Position::firstPositionInNode(context));
|
| -
|
| - // Remove block properties in the span's style. This prevents properties that
|
| - // probably have no effect currently from affecting blocks later if the style
|
| - // is cloned for a new block element during a future
|
| - // editing operation.
|
| - // FIXME: They *can* have an effect currently if blocks beneath the style span
|
| - // aren't individually marked with block styles by the editing engine used to
|
| - // style them. WebKit doesn't do this, but others might.
|
| - style->removeBlockProperties();
|
| -
|
| - if (style->isEmpty() || !wrappingStyleSpan->hasChildren()) {
|
| - insertedNodes.willRemoveNodePreservingChildren(*wrappingStyleSpan);
|
| - removeNodePreservingChildren(wrappingStyleSpan, editingState);
|
| - } else {
|
| - setNodeAttribute(wrappingStyleSpan, styleAttr,
|
| - AtomicString(style->style()->asText()));
|
| - }
|
| + fragment.removeNodePreservingChildren(wrappingStyleSpan);
|
| }
|
|
|
| void ReplaceSelectionCommand::mergeEndIfNeeded(EditingState* editingState) {
|
| @@ -1373,8 +1261,7 @@ void ReplaceSelectionCommand::doApply(EditingState* editingState) {
|
| // Paste into run of tabs splits the tab span.
|
| insertionPos = positionOutsideTabSpan(insertionPos);
|
|
|
| - bool handledStyleSpans =
|
| - handleStyleSpansBeforeInsertion(fragment, insertionPos);
|
| + handleStyleSpansBeforeInsertion(fragment, insertionPos);
|
|
|
| // We're finished if there is nothing to add.
|
| if (fragment.isEmpty() || !fragment.firstChild())
|
| @@ -1436,8 +1323,7 @@ void ReplaceSelectionCommand::doApply(EditingState* editingState) {
|
|
|
| Element* blockStart = enclosingBlock(insertionPos.anchorNode());
|
| if ((isHTMLListElement(insertedNodes.refNode()) ||
|
| - (isLegacyAppleHTMLSpanElement(insertedNodes.refNode()) &&
|
| - isHTMLListElement(insertedNodes.refNode()->firstChild()))) &&
|
| + (isHTMLListElement(insertedNodes.refNode()->firstChild()))) &&
|
| blockStart && blockStart->layoutObject()->isListItem() &&
|
| hasEditableStyle(*blockStart->parentNode())) {
|
| insertedNodes.setRefNode(
|
| @@ -1479,12 +1365,6 @@ void ReplaceSelectionCommand::doApply(EditingState* editingState) {
|
| if (isRichlyEditablePosition(insertionPos))
|
| removeUnrenderedTextNodesAtEnds(insertedNodes);
|
|
|
| - if (!handledStyleSpans) {
|
| - handleStyleSpans(insertedNodes, editingState);
|
| - if (editingState->isAborted())
|
| - return;
|
| - }
|
| -
|
| document().updateStyleAndLayoutIgnorePendingStylesheets();
|
|
|
| // Mutation events (bug 20161) may have already removed the inserted content
|
|
|