OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2009, 2010, 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2009, 2010, 2011 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 29 #include "bindings/core/v8/ExceptionStatePlaceholder.h" |
30 #include "core/CSSPropertyNames.h" | 30 #include "core/CSSPropertyNames.h" |
31 #include "core/HTMLNames.h" | 31 #include "core/HTMLNames.h" |
32 #include "core/InputTypeNames.h" | 32 #include "core/InputTypeNames.h" |
33 #include "core/css/CSSStyleDeclaration.h" | 33 #include "core/css/CSSStyleDeclaration.h" |
34 #include "core/css/StylePropertySet.h" | 34 #include "core/css/StylePropertySet.h" |
35 #include "core/dom/Document.h" | 35 #include "core/dom/Document.h" |
36 #include "core/dom/DocumentFragment.h" | 36 #include "core/dom/DocumentFragment.h" |
37 #include "core/dom/Element.h" | 37 #include "core/dom/Element.h" |
| 38 #include "core/dom/NodeComputedStyle.h" |
38 #include "core/dom/Text.h" | 39 #include "core/dom/Text.h" |
39 #include "core/editing/EditingUtilities.h" | 40 #include "core/editing/EditingUtilities.h" |
40 #include "core/editing/FrameSelection.h" | 41 #include "core/editing/FrameSelection.h" |
41 #include "core/editing/VisibleUnits.h" | 42 #include "core/editing/VisibleUnits.h" |
42 #include "core/editing/commands/ApplyStyleCommand.h" | 43 #include "core/editing/commands/ApplyStyleCommand.h" |
43 #include "core/editing/commands/BreakBlockquoteCommand.h" | 44 #include "core/editing/commands/BreakBlockquoteCommand.h" |
44 #include "core/editing/commands/SimplifyMarkupCommand.h" | 45 #include "core/editing/commands/SimplifyMarkupCommand.h" |
45 #include "core/editing/commands/SmartReplace.h" | 46 #include "core/editing/commands/SmartReplace.h" |
46 #include "core/editing/iterators/TextIterator.h" | 47 #include "core/editing/iterators/TextIterator.h" |
47 #include "core/editing/serializers/HTMLInterchange.h" | 48 #include "core/editing/serializers/HTMLInterchange.h" |
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 || isHTMLStyleElement(*node) | 788 || isHTMLStyleElement(*node) |
788 || isHTMLTitleElement(*node)) { | 789 || isHTMLTitleElement(*node)) { |
789 next = NodeTraversal::nextSkippingChildren(*node); | 790 next = NodeTraversal::nextSkippingChildren(*node); |
790 fragment.removeNode(node); | 791 fragment.removeNode(node); |
791 } else { | 792 } else { |
792 next = NodeTraversal::next(*node); | 793 next = NodeTraversal::next(*node); |
793 } | 794 } |
794 } | 795 } |
795 } | 796 } |
796 | 797 |
| 798 static bool followBlockElementStyle(const Node* node) |
| 799 { |
| 800 if (!node->isHTMLElement()) |
| 801 return false; |
| 802 |
| 803 const HTMLElement& element = toHTMLElement(*node); |
| 804 return element.computedStyle()->display() == LIST_ITEM |
| 805 || element.computedStyle()->display() == TABLE_CELL |
| 806 || element.hasTagName(preTag) |
| 807 || element.hasTagName(h1Tag) |
| 808 || element.hasTagName(h2Tag) |
| 809 || element.hasTagName(h3Tag) |
| 810 || element.hasTagName(h4Tag) |
| 811 || element.hasTagName(h5Tag) |
| 812 || element.hasTagName(h6Tag); |
| 813 } |
| 814 |
797 // Remove style spans before insertion if they are unnecessary. It's faster bec
ause we'll | 815 // Remove style spans before insertion if they are unnecessary. It's faster bec
ause we'll |
798 // avoid doing a layout. | 816 // avoid doing a layout. |
799 static bool handleStyleSpansBeforeInsertion(ReplacementFragment& fragment, const
Position& insertionPos) | 817 static bool handleStyleSpansBeforeInsertion(ReplacementFragment& fragment, const
Position& insertionPos) |
800 { | 818 { |
801 Node* topNode = fragment.firstChild(); | 819 Node* topNode = fragment.firstChild(); |
802 if (!isHTMLSpanElement(topNode)) | 820 if (!isHTMLSpanElement(topNode)) |
803 return false; | 821 return false; |
804 | 822 |
805 // Handling the case where we are doing Paste as Quotation or pasting into q
uoted content is more complicated (see handleStyleSpans) | 823 // Handling the case where we are doing Paste as Quotation or pasting into q
uoted content is more complicated (see handleStyleSpans) |
806 // and doesn't receive the optimization. | 824 // and doesn't receive the optimization. |
807 if (isMailPasteAsQuotationHTMLBlockQuoteElement(topNode) || enclosingNodeOfT
ype(firstPositionInOrBeforeNode(topNode), isMailHTMLBlockquoteElement, CanCrossE
ditingBoundary)) | 825 if (isMailPasteAsQuotationHTMLBlockQuoteElement(topNode) || enclosingNodeOfT
ype(firstPositionInOrBeforeNode(topNode), isMailHTMLBlockquoteElement, CanCrossE
ditingBoundary)) |
808 return false; | 826 return false; |
809 | 827 |
810 // Remove style spans to follow the styles of list item when |fragment| beco
mes a list item. | 828 // Remove style spans to follow the styles of parent block element when |fra
gment| becomes a part of it. |
811 // See bug http://crbug.com/335955. | 829 // See bugs http://crbug.com/226941 and http://crbug.com/335955. |
812 HTMLSpanElement* wrappingStyleSpan = toHTMLSpanElement(topNode); | 830 HTMLSpanElement* wrappingStyleSpan = toHTMLSpanElement(topNode); |
813 if (isListItem(enclosingBlock(insertionPos.anchorNode()))) { | 831 const Node* node = insertionPos.anchorNode(); |
| 832 // |node| can be an inline element like <br> under <li> |
| 833 // e.g.) editing/execCommand/switch-list-type.html |
| 834 // editing/deleting/backspace-merge-into-block.html |
| 835 if (node->computedStyle()->display() == INLINE) { |
| 836 if (!(node = enclosingBlock(insertionPos.anchorNode()))) |
| 837 return false; |
| 838 } |
| 839 |
| 840 if (followBlockElementStyle(node)) { |
814 fragment.removeNodePreservingChildren(wrappingStyleSpan); | 841 fragment.removeNodePreservingChildren(wrappingStyleSpan); |
815 return true; | 842 return true; |
816 } | 843 } |
817 | 844 |
818 // Either there are no style spans in the fragment or a WebKit client has ad
ded content to the fragment | 845 // Either there are no style spans in the fragment or a WebKit client has ad
ded content to the fragment |
819 // before inserting it. Look for and handle style spans after insertion. | 846 // before inserting it. Look for and handle style spans after insertion. |
820 if (!isLegacyAppleHTMLSpanElement(topNode)) | 847 if (!isLegacyAppleHTMLSpanElement(topNode)) |
821 return false; | 848 return false; |
822 | 849 |
823 EditingStyle* styleAtInsertionPos = EditingStyle::create(insertionPos.parent
AnchoredEquivalent()); | 850 EditingStyle* styleAtInsertionPos = EditingStyle::create(insertionPos.parent
AnchoredEquivalent()); |
(...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1729 visitor->trace(m_startOfInsertedContent); | 1756 visitor->trace(m_startOfInsertedContent); |
1730 visitor->trace(m_endOfInsertedContent); | 1757 visitor->trace(m_endOfInsertedContent); |
1731 visitor->trace(m_insertionStyle); | 1758 visitor->trace(m_insertionStyle); |
1732 visitor->trace(m_documentFragment); | 1759 visitor->trace(m_documentFragment); |
1733 visitor->trace(m_startOfInsertedRange); | 1760 visitor->trace(m_startOfInsertedRange); |
1734 visitor->trace(m_endOfInsertedRange); | 1761 visitor->trace(m_endOfInsertedRange); |
1735 CompositeEditCommand::trace(visitor); | 1762 CompositeEditCommand::trace(visitor); |
1736 } | 1763 } |
1737 | 1764 |
1738 } // namespace blink | 1765 } // namespace blink |
OLD | NEW |