OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
3 * Copyright (C) 2008, 2009, 2010, 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2008, 2009, 2010, 2011 Google Inc. All rights reserved. |
4 * Copyright (C) 2011 Igalia S.L. | 4 * Copyright (C) 2011 Igalia S.L. |
5 * Copyright (C) 2011 Motorola Mobility. All rights reserved. | 5 * Copyright (C) 2011 Motorola Mobility. All rights reserved. |
6 * | 6 * |
7 * Redistribution and use in source and binary forms, with or without | 7 * Redistribution and use in source and binary forms, with or without |
8 * modification, are permitted provided that the following conditions | 8 * modification, are permitted provided that the following conditions |
9 * are met: | 9 * are met: |
10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 #include "core/frame/LocalFrame.h" | 53 #include "core/frame/LocalFrame.h" |
54 #include "core/html/HTMLBodyElement.h" | 54 #include "core/html/HTMLBodyElement.h" |
55 #include "core/html/HTMLElement.h" | 55 #include "core/html/HTMLElement.h" |
56 #include "core/html/HTMLTableCellElement.h" | 56 #include "core/html/HTMLTableCellElement.h" |
57 #include "core/html/HTMLTextFormControlElement.h" | 57 #include "core/html/HTMLTextFormControlElement.h" |
58 #include "core/rendering/RenderObject.h" | 58 #include "core/rendering/RenderObject.h" |
59 #include "platform/weborigin/KURL.h" | 59 #include "platform/weborigin/KURL.h" |
60 #include "wtf/StdLibExtras.h" | 60 #include "wtf/StdLibExtras.h" |
61 #include "wtf/text/StringBuilder.h" | 61 #include "wtf/text/StringBuilder.h" |
62 | 62 |
63 using namespace std; | |
64 | |
65 namespace WebCore { | 63 namespace WebCore { |
66 | 64 |
67 using namespace HTMLNames; | 65 using namespace HTMLNames; |
68 | 66 |
69 static bool propertyMissingOrEqualToNone(StylePropertySet*, CSSPropertyID); | 67 static bool propertyMissingOrEqualToNone(StylePropertySet*, CSSPropertyID); |
70 | 68 |
71 class AttributeChange { | 69 class AttributeChange { |
72 ALLOW_ONLY_INLINE_ALLOCATION(); | 70 ALLOW_ONLY_INLINE_ALLOCATION(); |
73 public: | 71 public: |
74 AttributeChange() | 72 AttributeChange() |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 if (!element->hasAttributes()) | 111 if (!element->hasAttributes()) |
114 continue; | 112 continue; |
115 AttributeIteratorAccessor attributes = element->attributesIterator(); | 113 AttributeIteratorAccessor attributes = element->attributesIterator(); |
116 AttributeConstIterator end = attributes.end(); | 114 AttributeConstIterator end = attributes.end(); |
117 for (AttributeConstIterator it = attributes.begin(); it != end; ++it) { | 115 for (AttributeConstIterator it = attributes.begin(); it != end; ++it) { |
118 if (element->isURLAttribute(**it) && !it->value().isEmpty()) | 116 if (element->isURLAttribute(**it) && !it->value().isEmpty()) |
119 changes.append(AttributeChange(element, it->name(), KURL(parsedB
aseURL, it->value()).string())); | 117 changes.append(AttributeChange(element, it->name(), KURL(parsedB
aseURL, it->value()).string())); |
120 } | 118 } |
121 } | 119 } |
122 | 120 |
123 size_t numChanges = changes.size(); | 121 std::size_t numChanges = changes.size(); |
124 for (size_t i = 0; i < numChanges; ++i) | 122 for (std::size_t i = 0; i < numChanges; ++i) |
125 changes[i].apply(); | 123 changes[i].apply(); |
126 } | 124 } |
127 | 125 |
128 class StyledMarkupAccumulator FINAL : public MarkupAccumulator { | 126 class StyledMarkupAccumulator FINAL : public MarkupAccumulator { |
129 public: | 127 public: |
130 enum RangeFullySelectsNode { DoesFullySelectNode, DoesNotFullySelectNode }; | 128 enum RangeFullySelectsNode { DoesFullySelectNode, DoesNotFullySelectNode }; |
131 | 129 |
132 StyledMarkupAccumulator(WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes,
EAbsoluteURLs, EAnnotateForInterchange, RawPtr<const Range>, Node* highestNodeTo
BeSerialized = 0); | 130 StyledMarkupAccumulator(WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes,
EAbsoluteURLs, EAnnotateForInterchange, RawPtr<const Range>, Node* highestNodeTo
BeSerialized = 0); |
133 Node* serializeNodes(Node* startNode, Node* pastEnd); | 131 Node* serializeNodes(Node* startNode, Node* pastEnd); |
134 void appendString(const String& s) { return MarkupAccumulator::appendString(
s); } | 132 void appendString(const String& s) { return MarkupAccumulator::appendString(
s); } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 DEFINE_STATIC_LOCAL(const String, divClose, ("</div>")); | 204 DEFINE_STATIC_LOCAL(const String, divClose, ("</div>")); |
207 DEFINE_STATIC_LOCAL(const String, styleSpanClose, ("</span>")); | 205 DEFINE_STATIC_LOCAL(const String, styleSpanClose, ("</span>")); |
208 return isBlock ? divClose : styleSpanClose; | 206 return isBlock ? divClose : styleSpanClose; |
209 } | 207 } |
210 | 208 |
211 String StyledMarkupAccumulator::takeResults() | 209 String StyledMarkupAccumulator::takeResults() |
212 { | 210 { |
213 StringBuilder result; | 211 StringBuilder result; |
214 result.reserveCapacity(totalLength(m_reversedPrecedingMarkup) + length()); | 212 result.reserveCapacity(totalLength(m_reversedPrecedingMarkup) + length()); |
215 | 213 |
216 for (size_t i = m_reversedPrecedingMarkup.size(); i > 0; --i) | 214 for (std::size_t i = m_reversedPrecedingMarkup.size(); i > 0; --i) |
217 result.append(m_reversedPrecedingMarkup[i - 1]); | 215 result.append(m_reversedPrecedingMarkup[i - 1]); |
218 | 216 |
219 concatenateMarkup(result); | 217 concatenateMarkup(result); |
220 | 218 |
221 // We remove '\0' characters because they are not visibly rendered to the us
er. | 219 // We remove '\0' characters because they are not visibly rendered to the us
er. |
222 return result.toString().replace(0, ""); | 220 return result.toString().replace(0, ""); |
223 } | 221 } |
224 | 222 |
225 void StyledMarkupAccumulator::appendText(StringBuilder& out, Text& text) | 223 void StyledMarkupAccumulator::appendText(StringBuilder& out, Text& text) |
226 { | 224 { |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 paragraph->appendChild(createBlockPlaceholderElement(document)); | 763 paragraph->appendChild(createBlockPlaceholderElement(document)); |
766 return; | 764 return; |
767 } | 765 } |
768 | 766 |
769 ASSERT(string.find('\n') == kNotFound); | 767 ASSERT(string.find('\n') == kNotFound); |
770 | 768 |
771 Vector<String> tabList; | 769 Vector<String> tabList; |
772 string.split('\t', true, tabList); | 770 string.split('\t', true, tabList); |
773 StringBuilder tabText; | 771 StringBuilder tabText; |
774 bool first = true; | 772 bool first = true; |
775 size_t numEntries = tabList.size(); | 773 std::size_t numEntries = tabList.size(); |
776 for (size_t i = 0; i < numEntries; ++i) { | 774 for (std::size_t i = 0; i < numEntries; ++i) { |
777 const String& s = tabList[i]; | 775 const String& s = tabList[i]; |
778 | 776 |
779 // append the non-tab textual part | 777 // append the non-tab textual part |
780 if (!s.isEmpty()) { | 778 if (!s.isEmpty()) { |
781 if (!tabText.isEmpty()) { | 779 if (!tabText.isEmpty()) { |
782 paragraph->appendChild(createTabSpanElement(document, tabText.to
String())); | 780 paragraph->appendChild(createTabSpanElement(document, tabText.to
String())); |
783 tabText.clear(); | 781 tabText.clear(); |
784 } | 782 } |
785 RefPtrWillBeRawPtr<Node> textNode = document.createTextNode(stringWi
thRebalancedWhitespace(s, first, i + 1 == numEntries)); | 783 RefPtrWillBeRawPtr<Node> textNode = document.createTextNode(stringWi
thRebalancedWhitespace(s, first, i + 1 == numEntries)); |
786 paragraph->appendChild(textNode.release()); | 784 paragraph->appendChild(textNode.release()); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 Element* block = toElement(blockNode); | 862 Element* block = toElement(blockNode); |
865 bool useClonesOfEnclosingBlock = blockNode | 863 bool useClonesOfEnclosingBlock = blockNode |
866 && blockNode->isElementNode() | 864 && blockNode->isElementNode() |
867 && !isHTMLBodyElement(*block) | 865 && !isHTMLBodyElement(*block) |
868 && !isHTMLHtmlElement(*block) | 866 && !isHTMLHtmlElement(*block) |
869 && block != editableRootForPosition(context->startPosition()); | 867 && block != editableRootForPosition(context->startPosition()); |
870 bool useLineBreak = enclosingTextFormControl(context->startPosition()); | 868 bool useLineBreak = enclosingTextFormControl(context->startPosition()); |
871 | 869 |
872 Vector<String> list; | 870 Vector<String> list; |
873 string.split('\n', true, list); // true gets us empty strings in the list | 871 string.split('\n', true, list); // true gets us empty strings in the list |
874 size_t numLines = list.size(); | 872 std::size_t numLines = list.size(); |
875 for (size_t i = 0; i < numLines; ++i) { | 873 for (std::size_t i = 0; i < numLines; ++i) { |
876 const String& s = list[i]; | 874 const String& s = list[i]; |
877 | 875 |
878 RefPtrWillBeRawPtr<Element> element = nullptr; | 876 RefPtrWillBeRawPtr<Element> element = nullptr; |
879 if (s.isEmpty() && i + 1 == numLines) { | 877 if (s.isEmpty() && i + 1 == numLines) { |
880 // For last line, use the "magic BR" rather than a P. | 878 // For last line, use the "magic BR" rather than a P. |
881 element = createBreakElement(document); | 879 element = createBreakElement(document); |
882 element->setAttribute(classAttr, AppleInterchangeNewline); | 880 element->setAttribute(classAttr, AppleInterchangeNewline); |
883 } else if (useLineBreak) { | 881 } else if (useLineBreak) { |
884 element = createBreakElement(document); | 882 element = createBreakElement(document); |
885 fillContainerFromString(fragment.get(), s); | 883 fillContainerFromString(fragment.get(), s); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 return; | 1077 return; |
1080 | 1078 |
1081 RefPtrWillBeRawPtr<Text> textNode = toText(node.get()); | 1079 RefPtrWillBeRawPtr<Text> textNode = toText(node.get()); |
1082 RefPtrWillBeRawPtr<Text> textNext = toText(next); | 1080 RefPtrWillBeRawPtr<Text> textNext = toText(next); |
1083 textNode->appendData(textNext->data()); | 1081 textNode->appendData(textNext->data()); |
1084 if (textNext->parentNode()) // Might have been removed by mutation event. | 1082 if (textNext->parentNode()) // Might have been removed by mutation event. |
1085 textNext->remove(exceptionState); | 1083 textNext->remove(exceptionState); |
1086 } | 1084 } |
1087 | 1085 |
1088 } | 1086 } |
OLD | NEW |