OLD | NEW |
1 /* | 1 /* |
2 * (C) 1999 Lars Knoll (knoll@kde.org) | 2 * (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2000 Gunnstein Lye (gunnstein@netcom.no) | 3 * (C) 2000 Gunnstein Lye (gunnstein@netcom.no) |
4 * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) | 4 * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) |
5 * (C) 2001 Peter Kelly (pmk@post.com) | 5 * (C) 2001 Peter Kelly (pmk@post.com) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
7 * Copyright (C) 2011 Motorola Mobility. All rights reserved. | 7 * Copyright (C) 2011 Motorola Mobility. All rights reserved. |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 PassRefPtrWillBeRawPtr<Node> Range::processContentsBetweenOffsets(ActionType act
ion, PassRefPtrWillBeRawPtr<DocumentFragment> fragment, | 700 PassRefPtrWillBeRawPtr<Node> Range::processContentsBetweenOffsets(ActionType act
ion, PassRefPtrWillBeRawPtr<DocumentFragment> fragment, |
701 Node* container, unsigned startOffset, unsigned endOffset, ExceptionState& e
xceptionState) | 701 Node* container, unsigned startOffset, unsigned endOffset, ExceptionState& e
xceptionState) |
702 { | 702 { |
703 ASSERT(container); | 703 ASSERT(container); |
704 ASSERT(startOffset <= endOffset); | 704 ASSERT(startOffset <= endOffset); |
705 | 705 |
706 // This switch statement must be consistent with that of Node::lengthOfConte
nts. | 706 // This switch statement must be consistent with that of Node::lengthOfConte
nts. |
707 RefPtrWillBeRawPtr<Node> result = nullptr; | 707 RefPtrWillBeRawPtr<Node> result = nullptr; |
708 switch (container->nodeType()) { | 708 switch (container->nodeType()) { |
709 case Node::TEXT_NODE: | 709 case Node::TEXT_NODE: |
710 case Node::CDATA_SECTION_NODE: | |
711 case Node::COMMENT_NODE: | 710 case Node::COMMENT_NODE: |
712 endOffset = std::min(endOffset, toCharacterData(container)->length()); | 711 endOffset = std::min(endOffset, toCharacterData(container)->length()); |
713 if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { | 712 if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { |
714 RefPtrWillBeRawPtr<CharacterData> c = static_pointer_cast<CharacterD
ata>(container->cloneNode(true)); | 713 RefPtrWillBeRawPtr<CharacterData> c = static_pointer_cast<CharacterD
ata>(container->cloneNode(true)); |
715 deleteCharacterData(c, startOffset, endOffset, exceptionState); | 714 deleteCharacterData(c, startOffset, endOffset, exceptionState); |
716 if (fragment) { | 715 if (fragment) { |
717 result = fragment; | 716 result = fragment; |
718 result->appendChild(c.release(), exceptionState); | 717 result->appendChild(c.release(), exceptionState); |
719 } else | 718 } else |
720 result = c.release(); | 719 result = c.release(); |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
970 } | 969 } |
971 } | 970 } |
972 | 971 |
973 String Range::toString() const | 972 String Range::toString() const |
974 { | 973 { |
975 StringBuilder builder; | 974 StringBuilder builder; |
976 | 975 |
977 Node* pastLast = pastLastNode(); | 976 Node* pastLast = pastLastNode(); |
978 for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) { | 977 for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) { |
979 Node::NodeType type = n->nodeType(); | 978 Node::NodeType type = n->nodeType(); |
980 if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) { | 979 if (type == Node::TEXT_NODE) { |
981 String data = toCharacterData(n)->data(); | 980 String data = toCharacterData(n)->data(); |
982 int length = data.length(); | 981 int length = data.length(); |
983 int start = (n == m_start.container()) ? std::min(std::max(0, m_star
t.offset()), length) : 0; | 982 int start = (n == m_start.container()) ? std::min(std::max(0, m_star
t.offset()), length) : 0; |
984 int end = (n == m_end.container()) ? std::min(std::max(start, m_end.
offset()), length) : length; | 983 int end = (n == m_end.container()) ? std::min(std::max(start, m_end.
offset()), length) : length; |
985 builder.append(data, start, end - start); | 984 builder.append(data, start, end - start); |
986 } | 985 } |
987 } | 986 } |
988 | 987 |
989 return builder.toString(); | 988 return builder.toString(); |
990 } | 989 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 { | 1042 { |
1044 // This is now a no-op as per the DOM specification. | 1043 // This is now a no-op as per the DOM specification. |
1045 } | 1044 } |
1046 | 1045 |
1047 Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionState& exceptionStat
e) const | 1046 Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionState& exceptionStat
e) const |
1048 { | 1047 { |
1049 switch (n->nodeType()) { | 1048 switch (n->nodeType()) { |
1050 case Node::DOCUMENT_TYPE_NODE: | 1049 case Node::DOCUMENT_TYPE_NODE: |
1051 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + n->nodeName() + "'."); | 1050 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + n->nodeName() + "'."); |
1052 return nullptr; | 1051 return nullptr; |
1053 case Node::CDATA_SECTION_NODE: | |
1054 case Node::COMMENT_NODE: | 1052 case Node::COMMENT_NODE: |
1055 case Node::TEXT_NODE: | 1053 case Node::TEXT_NODE: |
1056 if (static_cast<unsigned>(offset) > toCharacterData(n)->length()) | 1054 if (static_cast<unsigned>(offset) > toCharacterData(n)->length()) |
1057 exceptionState.throwDOMException(IndexSizeError, "The offset " +
String::number(offset) + " is larger than or equal to the node's length (" + St
ring::number(toCharacterData(n)->length()) + ")."); | 1055 exceptionState.throwDOMException(IndexSizeError, "The offset " +
String::number(offset) + " is larger than or equal to the node's length (" + St
ring::number(toCharacterData(n)->length()) + ")."); |
1058 return nullptr; | 1056 return nullptr; |
1059 case Node::PROCESSING_INSTRUCTION_NODE: | 1057 case Node::PROCESSING_INSTRUCTION_NODE: |
1060 if (static_cast<unsigned>(offset) > toProcessingInstruction(n)->data
().length()) | 1058 if (static_cast<unsigned>(offset) > toProcessingInstruction(n)->data
().length()) |
1061 exceptionState.throwDOMException(IndexSizeError, "The offset " +
String::number(offset) + " is larger than or equal to than the node's length ("
+ String::number(toProcessingInstruction(n)->data().length()) + ")."); | 1059 exceptionState.throwDOMException(IndexSizeError, "The offset " +
String::number(offset) + " is larger than or equal to than the node's length ("
+ String::number(toProcessingInstruction(n)->data().length()) + ")."); |
1062 return nullptr; | 1060 return nullptr; |
1063 case Node::ATTRIBUTE_NODE: | 1061 case Node::ATTRIBUTE_NODE: |
(...skipping 27 matching lines...) Expand all Loading... |
1091 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); | 1089 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); |
1092 return; | 1090 return; |
1093 } | 1091 } |
1094 | 1092 |
1095 switch (n->nodeType()) { | 1093 switch (n->nodeType()) { |
1096 case Node::ATTRIBUTE_NODE: | 1094 case Node::ATTRIBUTE_NODE: |
1097 case Node::DOCUMENT_FRAGMENT_NODE: | 1095 case Node::DOCUMENT_FRAGMENT_NODE: |
1098 case Node::DOCUMENT_NODE: | 1096 case Node::DOCUMENT_NODE: |
1099 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + n->nodeName() + "'."); | 1097 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + n->nodeName() + "'."); |
1100 return; | 1098 return; |
1101 case Node::CDATA_SECTION_NODE: | |
1102 case Node::COMMENT_NODE: | 1099 case Node::COMMENT_NODE: |
1103 case Node::DOCUMENT_TYPE_NODE: | 1100 case Node::DOCUMENT_TYPE_NODE: |
1104 case Node::ELEMENT_NODE: | 1101 case Node::ELEMENT_NODE: |
1105 case Node::PROCESSING_INSTRUCTION_NODE: | 1102 case Node::PROCESSING_INSTRUCTION_NODE: |
1106 case Node::TEXT_NODE: | 1103 case Node::TEXT_NODE: |
1107 break; | 1104 break; |
1108 } | 1105 } |
1109 | 1106 |
1110 Node* root = n; | 1107 Node* root = n; |
1111 while (ContainerNode* parent = root->parentNode()) | 1108 while (ContainerNode* parent = root->parentNode()) |
1112 root = parent; | 1109 root = parent; |
1113 | 1110 |
1114 switch (root->nodeType()) { | 1111 switch (root->nodeType()) { |
1115 case Node::ATTRIBUTE_NODE: | 1112 case Node::ATTRIBUTE_NODE: |
1116 case Node::DOCUMENT_NODE: | 1113 case Node::DOCUMENT_NODE: |
1117 case Node::DOCUMENT_FRAGMENT_NODE: | 1114 case Node::DOCUMENT_FRAGMENT_NODE: |
1118 case Node::ELEMENT_NODE: | 1115 case Node::ELEMENT_NODE: |
1119 break; | 1116 break; |
1120 case Node::CDATA_SECTION_NODE: | |
1121 case Node::COMMENT_NODE: | 1117 case Node::COMMENT_NODE: |
1122 case Node::DOCUMENT_TYPE_NODE: | 1118 case Node::DOCUMENT_TYPE_NODE: |
1123 case Node::PROCESSING_INSTRUCTION_NODE: | 1119 case Node::PROCESSING_INSTRUCTION_NODE: |
1124 case Node::TEXT_NODE: | 1120 case Node::TEXT_NODE: |
1125 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + n->nodeName() + "'."); | 1121 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + n->nodeName() + "'."); |
1126 return; | 1122 return; |
1127 } | 1123 } |
1128 } | 1124 } |
1129 | 1125 |
1130 PassRefPtrWillBeRawPtr<Range> Range::cloneRange() const | 1126 PassRefPtrWillBeRawPtr<Range> Range::cloneRange() const |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); | 1166 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); |
1171 return; | 1167 return; |
1172 } | 1168 } |
1173 | 1169 |
1174 // InvalidNodeTypeError: Raised if an ancestor of refNode is an Entity, Nota
tion or | 1170 // InvalidNodeTypeError: Raised if an ancestor of refNode is an Entity, Nota
tion or |
1175 // DocumentType node or if refNode is a Document, DocumentFragment, ShadowRo
ot, Attr, Entity, or Notation | 1171 // DocumentType node or if refNode is a Document, DocumentFragment, ShadowRo
ot, Attr, Entity, or Notation |
1176 // node. | 1172 // node. |
1177 for (ContainerNode* anc = refNode->parentNode(); anc; anc = anc->parentNode(
)) { | 1173 for (ContainerNode* anc = refNode->parentNode(); anc; anc = anc->parentNode(
)) { |
1178 switch (anc->nodeType()) { | 1174 switch (anc->nodeType()) { |
1179 case Node::ATTRIBUTE_NODE: | 1175 case Node::ATTRIBUTE_NODE: |
1180 case Node::CDATA_SECTION_NODE: | |
1181 case Node::COMMENT_NODE: | 1176 case Node::COMMENT_NODE: |
1182 case Node::DOCUMENT_FRAGMENT_NODE: | 1177 case Node::DOCUMENT_FRAGMENT_NODE: |
1183 case Node::DOCUMENT_NODE: | 1178 case Node::DOCUMENT_NODE: |
1184 case Node::ELEMENT_NODE: | 1179 case Node::ELEMENT_NODE: |
1185 case Node::PROCESSING_INSTRUCTION_NODE: | 1180 case Node::PROCESSING_INSTRUCTION_NODE: |
1186 case Node::TEXT_NODE: | 1181 case Node::TEXT_NODE: |
1187 break; | 1182 break; |
1188 case Node::DOCUMENT_TYPE_NODE: | 1183 case Node::DOCUMENT_TYPE_NODE: |
1189 exceptionState.throwDOMException(InvalidNodeTypeError, "The node
provided has an ancestor of type '" + anc->nodeName() + "'."); | 1184 exceptionState.throwDOMException(InvalidNodeTypeError, "The node
provided has an ancestor of type '" + anc->nodeName() + "'."); |
1190 return; | 1185 return; |
1191 } | 1186 } |
1192 } | 1187 } |
1193 | 1188 |
1194 switch (refNode->nodeType()) { | 1189 switch (refNode->nodeType()) { |
1195 case Node::CDATA_SECTION_NODE: | |
1196 case Node::COMMENT_NODE: | 1190 case Node::COMMENT_NODE: |
1197 case Node::DOCUMENT_TYPE_NODE: | 1191 case Node::DOCUMENT_TYPE_NODE: |
1198 case Node::ELEMENT_NODE: | 1192 case Node::ELEMENT_NODE: |
1199 case Node::PROCESSING_INSTRUCTION_NODE: | 1193 case Node::PROCESSING_INSTRUCTION_NODE: |
1200 case Node::TEXT_NODE: | 1194 case Node::TEXT_NODE: |
1201 break; | 1195 break; |
1202 case Node::ATTRIBUTE_NODE: | 1196 case Node::ATTRIBUTE_NODE: |
1203 case Node::DOCUMENT_FRAGMENT_NODE: | 1197 case Node::DOCUMENT_FRAGMENT_NODE: |
1204 case Node::DOCUMENT_NODE: | 1198 case Node::DOCUMENT_NODE: |
1205 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + refNode->nodeName() + "'."); | 1199 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + refNode->nodeName() + "'."); |
(...skipping 12 matching lines...) Expand all Loading... |
1218 if (!refNode) { | 1212 if (!refNode) { |
1219 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); | 1213 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); |
1220 return; | 1214 return; |
1221 } | 1215 } |
1222 | 1216 |
1223 // InvalidNodeTypeError: Raised if refNode or an ancestor of refNode is an E
ntity, Notation | 1217 // InvalidNodeTypeError: Raised if refNode or an ancestor of refNode is an E
ntity, Notation |
1224 // or DocumentType node. | 1218 // or DocumentType node. |
1225 for (Node* n = refNode; n; n = n->parentNode()) { | 1219 for (Node* n = refNode; n; n = n->parentNode()) { |
1226 switch (n->nodeType()) { | 1220 switch (n->nodeType()) { |
1227 case Node::ATTRIBUTE_NODE: | 1221 case Node::ATTRIBUTE_NODE: |
1228 case Node::CDATA_SECTION_NODE: | |
1229 case Node::COMMENT_NODE: | 1222 case Node::COMMENT_NODE: |
1230 case Node::DOCUMENT_FRAGMENT_NODE: | 1223 case Node::DOCUMENT_FRAGMENT_NODE: |
1231 case Node::DOCUMENT_NODE: | 1224 case Node::DOCUMENT_NODE: |
1232 case Node::ELEMENT_NODE: | 1225 case Node::ELEMENT_NODE: |
1233 case Node::PROCESSING_INSTRUCTION_NODE: | 1226 case Node::PROCESSING_INSTRUCTION_NODE: |
1234 case Node::TEXT_NODE: | 1227 case Node::TEXT_NODE: |
1235 break; | 1228 break; |
1236 case Node::DOCUMENT_TYPE_NODE: | 1229 case Node::DOCUMENT_TYPE_NODE: |
1237 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + refNode->nodeName() + "'."); | 1230 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + refNode->nodeName() + "'."); |
1238 return; | 1231 return; |
1239 } | 1232 } |
1240 } | 1233 } |
1241 | 1234 |
1242 if (m_ownerDocument != refNode->document()) | 1235 if (m_ownerDocument != refNode->document()) |
1243 setDocument(refNode->document()); | 1236 setDocument(refNode->document()); |
1244 | 1237 |
1245 m_start.setToStartOfNode(*refNode); | 1238 m_start.setToStartOfNode(*refNode); |
1246 m_end.setToEndOfNode(*refNode); | 1239 m_end.setToEndOfNode(*refNode); |
1247 } | 1240 } |
1248 | 1241 |
1249 bool Range::selectNodeContents(Node* refNode, Position& start, Position& end) | 1242 bool Range::selectNodeContents(Node* refNode, Position& start, Position& end) |
1250 { | 1243 { |
1251 if (!refNode) { | 1244 if (!refNode) { |
1252 return false; | 1245 return false; |
1253 } | 1246 } |
1254 | 1247 |
1255 for (Node* n = refNode; n; n = n->parentNode()) { | 1248 for (Node* n = refNode; n; n = n->parentNode()) { |
1256 switch (n->nodeType()) { | 1249 switch (n->nodeType()) { |
1257 case Node::ATTRIBUTE_NODE: | 1250 case Node::ATTRIBUTE_NODE: |
1258 case Node::CDATA_SECTION_NODE: | |
1259 case Node::COMMENT_NODE: | 1251 case Node::COMMENT_NODE: |
1260 case Node::DOCUMENT_FRAGMENT_NODE: | 1252 case Node::DOCUMENT_FRAGMENT_NODE: |
1261 case Node::DOCUMENT_NODE: | 1253 case Node::DOCUMENT_NODE: |
1262 case Node::ELEMENT_NODE: | 1254 case Node::ELEMENT_NODE: |
1263 case Node::PROCESSING_INSTRUCTION_NODE: | 1255 case Node::PROCESSING_INSTRUCTION_NODE: |
1264 case Node::TEXT_NODE: | 1256 case Node::TEXT_NODE: |
1265 break; | 1257 break; |
1266 case Node::DOCUMENT_TYPE_NODE: | 1258 case Node::DOCUMENT_TYPE_NODE: |
1267 return false; | 1259 return false; |
1268 } | 1260 } |
(...skipping 30 matching lines...) Expand all Loading... |
1299 | 1291 |
1300 // InvalidNodeTypeError: Raised if node is an Attr, Entity, DocumentType, No
tation, | 1292 // InvalidNodeTypeError: Raised if node is an Attr, Entity, DocumentType, No
tation, |
1301 // Document, or DocumentFragment node. | 1293 // Document, or DocumentFragment node. |
1302 switch (newParent->nodeType()) { | 1294 switch (newParent->nodeType()) { |
1303 case Node::ATTRIBUTE_NODE: | 1295 case Node::ATTRIBUTE_NODE: |
1304 case Node::DOCUMENT_FRAGMENT_NODE: | 1296 case Node::DOCUMENT_FRAGMENT_NODE: |
1305 case Node::DOCUMENT_NODE: | 1297 case Node::DOCUMENT_NODE: |
1306 case Node::DOCUMENT_TYPE_NODE: | 1298 case Node::DOCUMENT_TYPE_NODE: |
1307 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + newParent->nodeName() + "'."); | 1299 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + newParent->nodeName() + "'."); |
1308 return; | 1300 return; |
1309 case Node::CDATA_SECTION_NODE: | |
1310 case Node::COMMENT_NODE: | 1301 case Node::COMMENT_NODE: |
1311 case Node::ELEMENT_NODE: | 1302 case Node::ELEMENT_NODE: |
1312 case Node::PROCESSING_INSTRUCTION_NODE: | 1303 case Node::PROCESSING_INSTRUCTION_NODE: |
1313 case Node::TEXT_NODE: | 1304 case Node::TEXT_NODE: |
1314 break; | 1305 break; |
1315 } | 1306 } |
1316 | 1307 |
1317 // Raise a HierarchyRequestError if m_start.container() doesn't accept child
ren like newParent. | 1308 // Raise a HierarchyRequestError if m_start.container() doesn't accept child
ren like newParent. |
1318 Node* parentOfNewParent = m_start.container(); | 1309 Node* parentOfNewParent = m_start.container(); |
1319 | 1310 |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1776 | 1767 |
1777 void showTree(const blink::Range* range) | 1768 void showTree(const blink::Range* range) |
1778 { | 1769 { |
1779 if (range && range->boundaryPointsValid()) { | 1770 if (range && range->boundaryPointsValid()) { |
1780 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); | 1771 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); |
1781 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); | 1772 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); |
1782 } | 1773 } |
1783 } | 1774 } |
1784 | 1775 |
1785 #endif | 1776 #endif |
OLD | NEW |