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 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 } | 614 } |
615 | 615 |
616 PassRefPtrWillBeRawPtr<Node> Range::processContentsBetweenOffsets(ActionType act
ion, PassRefPtrWillBeRawPtr<DocumentFragment> fragment, | 616 PassRefPtrWillBeRawPtr<Node> Range::processContentsBetweenOffsets(ActionType act
ion, PassRefPtrWillBeRawPtr<DocumentFragment> fragment, |
617 Node* container, unsigned startOffset, unsigned endOffset, ExceptionState& e
xceptionState) | 617 Node* container, unsigned startOffset, unsigned endOffset, ExceptionState& e
xceptionState) |
618 { | 618 { |
619 ASSERT(container); | 619 ASSERT(container); |
620 ASSERT(startOffset <= endOffset); | 620 ASSERT(startOffset <= endOffset); |
621 | 621 |
622 // This switch statement must be consistent with that of Node::lengthOfConte
nts. | 622 // This switch statement must be consistent with that of Node::lengthOfConte
nts. |
623 RefPtrWillBeRawPtr<Node> result = nullptr; | 623 RefPtrWillBeRawPtr<Node> result = nullptr; |
624 switch (container->nodeType()) { | 624 switch (container->getNodeType()) { |
625 case Node::TEXT_NODE: | 625 case Node::TEXT_NODE: |
626 case Node::CDATA_SECTION_NODE: | 626 case Node::CDATA_SECTION_NODE: |
627 case Node::COMMENT_NODE: | 627 case Node::COMMENT_NODE: |
628 case Node::PROCESSING_INSTRUCTION_NODE: | 628 case Node::PROCESSING_INSTRUCTION_NODE: |
629 endOffset = std::min(endOffset, toCharacterData(container)->length()); | 629 endOffset = std::min(endOffset, toCharacterData(container)->length()); |
630 if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { | 630 if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { |
631 RefPtrWillBeRawPtr<CharacterData> c = static_pointer_cast<CharacterD
ata>(container->cloneNode(true)); | 631 RefPtrWillBeRawPtr<CharacterData> c = static_pointer_cast<CharacterD
ata>(container->cloneNode(true)); |
632 deleteCharacterData(c, startOffset, endOffset, exceptionState); | 632 deleteCharacterData(c, startOffset, endOffset, exceptionState); |
633 if (fragment) { | 633 if (fragment) { |
634 result = fragment; | 634 result = fragment; |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 } | 776 } |
777 | 777 |
778 // In the case where the container is a text node, we check against the cont
ainer's parent, because | 778 // In the case where the container is a text node, we check against the cont
ainer's parent, because |
779 // text nodes get split up upon insertion. | 779 // text nodes get split up upon insertion. |
780 Node* checkAgainst; | 780 Node* checkAgainst; |
781 if (startIsText) | 781 if (startIsText) |
782 checkAgainst = m_start.container()->parentNode(); | 782 checkAgainst = m_start.container()->parentNode(); |
783 else | 783 else |
784 checkAgainst = m_start.container(); | 784 checkAgainst = m_start.container(); |
785 | 785 |
786 Node::NodeType newNodeType = newNode->nodeType(); | 786 Node::NodeType newNodeType = newNode->getNodeType(); |
787 int numNewChildren; | 787 int numNewChildren; |
788 if (newNodeType == Node::DOCUMENT_FRAGMENT_NODE && !newNode->isShadowRoot())
{ | 788 if (newNodeType == Node::DOCUMENT_FRAGMENT_NODE && !newNode->isShadowRoot())
{ |
789 // check each child node, not the DocumentFragment itself | 789 // check each child node, not the DocumentFragment itself |
790 numNewChildren = 0; | 790 numNewChildren = 0; |
791 for (Node* c = toDocumentFragment(newNode)->firstChild(); c; c = c->next
Sibling()) { | 791 for (Node* c = toDocumentFragment(newNode)->firstChild(); c; c = c->next
Sibling()) { |
792 if (!checkAgainst->childTypeAllowed(c->nodeType())) { | 792 if (!checkAgainst->childTypeAllowed(c->getNodeType())) { |
793 exceptionState.throwDOMException(HierarchyRequestError, "The nod
e to be inserted contains a '" + c->nodeName() + "' node, which may not be inser
ted here."); | 793 exceptionState.throwDOMException(HierarchyRequestError, "The nod
e to be inserted contains a '" + c->nodeName() + "' node, which may not be inser
ted here."); |
794 return; | 794 return; |
795 } | 795 } |
796 ++numNewChildren; | 796 ++numNewChildren; |
797 } | 797 } |
798 } else { | 798 } else { |
799 numNewChildren = 1; | 799 numNewChildren = 1; |
800 if (!checkAgainst->childTypeAllowed(newNodeType)) { | 800 if (!checkAgainst->childTypeAllowed(newNodeType)) { |
801 exceptionState.throwDOMException(HierarchyRequestError, "The node to
be inserted is a '" + newNode->nodeName() + "' node, which may not be inserted
here."); | 801 exceptionState.throwDOMException(HierarchyRequestError, "The node to
be inserted is a '" + newNode->nodeName() + "' node, which may not be inserted
here."); |
802 return; | 802 return; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 m_end.set(m_start.container(), m_start.offset() + numNewChildren, la
stChild.get()); | 870 m_end.set(m_start.container(), m_start.offset() + numNewChildren, la
stChild.get()); |
871 } | 871 } |
872 } | 872 } |
873 | 873 |
874 String Range::toString() const | 874 String Range::toString() const |
875 { | 875 { |
876 StringBuilder builder; | 876 StringBuilder builder; |
877 | 877 |
878 Node* pastLast = pastLastNode(); | 878 Node* pastLast = pastLastNode(); |
879 for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) { | 879 for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) { |
880 Node::NodeType type = n->nodeType(); | 880 Node::NodeType type = n->getNodeType(); |
881 if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) { | 881 if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) { |
882 String data = toCharacterData(n)->data(); | 882 String data = toCharacterData(n)->data(); |
883 int length = data.length(); | 883 int length = data.length(); |
884 int start = (n == m_start.container()) ? std::min(std::max(0, m_star
t.offset()), length) : 0; | 884 int start = (n == m_start.container()) ? std::min(std::max(0, m_star
t.offset()), length) : 0; |
885 int end = (n == m_end.container()) ? std::min(std::max(start, m_end.
offset()), length) : length; | 885 int end = (n == m_end.container()) ? std::min(std::max(start, m_end.
offset()), length) : length; |
886 builder.append(data, start, end - start); | 886 builder.append(data, start, end - start); |
887 } | 887 } |
888 } | 888 } |
889 | 889 |
890 return builder.toString(); | 890 return builder.toString(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 } | 940 } |
941 | 941 |
942 | 942 |
943 void Range::detach() | 943 void Range::detach() |
944 { | 944 { |
945 // This is now a no-op as per the DOM specification. | 945 // This is now a no-op as per the DOM specification. |
946 } | 946 } |
947 | 947 |
948 Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionState& exceptionStat
e) const | 948 Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionState& exceptionStat
e) const |
949 { | 949 { |
950 switch (n->nodeType()) { | 950 switch (n->getNodeType()) { |
951 case Node::DOCUMENT_TYPE_NODE: | 951 case Node::DOCUMENT_TYPE_NODE: |
952 exceptionState.throwDOMException(InvalidNodeTypeError, "The node provide
d is of type '" + n->nodeName() + "'."); | 952 exceptionState.throwDOMException(InvalidNodeTypeError, "The node provide
d is of type '" + n->nodeName() + "'."); |
953 return nullptr; | 953 return nullptr; |
954 case Node::CDATA_SECTION_NODE: | 954 case Node::CDATA_SECTION_NODE: |
955 case Node::COMMENT_NODE: | 955 case Node::COMMENT_NODE: |
956 case Node::TEXT_NODE: | 956 case Node::TEXT_NODE: |
957 if (static_cast<unsigned>(offset) > toCharacterData(n)->length()) | 957 if (static_cast<unsigned>(offset) > toCharacterData(n)->length()) |
958 exceptionState.throwDOMException(IndexSizeError, "The offset " + Str
ing::number(offset) + " is larger than or equal to the node's length (" + String
::number(toCharacterData(n)->length()) + ")."); | 958 exceptionState.throwDOMException(IndexSizeError, "The offset " + Str
ing::number(offset) + " is larger than or equal to the node's length (" + String
::number(toCharacterData(n)->length()) + ")."); |
959 return nullptr; | 959 return nullptr; |
960 case Node::PROCESSING_INSTRUCTION_NODE: | 960 case Node::PROCESSING_INSTRUCTION_NODE: |
(...skipping 26 matching lines...) Expand all Loading... |
987 | 987 |
988 // InvalidNodeTypeError: Raised if the root container of refNode is not an | 988 // InvalidNodeTypeError: Raised if the root container of refNode is not an |
989 // Attr, Document, DocumentFragment or ShadowRoot node, or part of a SVG sha
dow DOM tree, | 989 // Attr, Document, DocumentFragment or ShadowRoot node, or part of a SVG sha
dow DOM tree, |
990 // or if refNode is a Document, DocumentFragment, ShadowRoot, Attr, Entity,
or Notation node. | 990 // or if refNode is a Document, DocumentFragment, ShadowRoot, Attr, Entity,
or Notation node. |
991 | 991 |
992 if (!n->parentNode()) { | 992 if (!n->parentNode()) { |
993 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); | 993 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); |
994 return; | 994 return; |
995 } | 995 } |
996 | 996 |
997 switch (n->nodeType()) { | 997 switch (n->getNodeType()) { |
998 case Node::ATTRIBUTE_NODE: | 998 case Node::ATTRIBUTE_NODE: |
999 case Node::DOCUMENT_FRAGMENT_NODE: | 999 case Node::DOCUMENT_FRAGMENT_NODE: |
1000 case Node::DOCUMENT_NODE: | 1000 case Node::DOCUMENT_NODE: |
1001 exceptionState.throwDOMException(InvalidNodeTypeError, "The node provide
d is of type '" + n->nodeName() + "'."); | 1001 exceptionState.throwDOMException(InvalidNodeTypeError, "The node provide
d is of type '" + n->nodeName() + "'."); |
1002 return; | 1002 return; |
1003 case Node::CDATA_SECTION_NODE: | 1003 case Node::CDATA_SECTION_NODE: |
1004 case Node::COMMENT_NODE: | 1004 case Node::COMMENT_NODE: |
1005 case Node::DOCUMENT_TYPE_NODE: | 1005 case Node::DOCUMENT_TYPE_NODE: |
1006 case Node::ELEMENT_NODE: | 1006 case Node::ELEMENT_NODE: |
1007 case Node::PROCESSING_INSTRUCTION_NODE: | 1007 case Node::PROCESSING_INSTRUCTION_NODE: |
1008 case Node::TEXT_NODE: | 1008 case Node::TEXT_NODE: |
1009 break; | 1009 break; |
1010 } | 1010 } |
1011 | 1011 |
1012 Node* root = n; | 1012 Node* root = n; |
1013 while (ContainerNode* parent = root->parentNode()) | 1013 while (ContainerNode* parent = root->parentNode()) |
1014 root = parent; | 1014 root = parent; |
1015 | 1015 |
1016 switch (root->nodeType()) { | 1016 switch (root->getNodeType()) { |
1017 case Node::ATTRIBUTE_NODE: | 1017 case Node::ATTRIBUTE_NODE: |
1018 case Node::DOCUMENT_NODE: | 1018 case Node::DOCUMENT_NODE: |
1019 case Node::DOCUMENT_FRAGMENT_NODE: | 1019 case Node::DOCUMENT_FRAGMENT_NODE: |
1020 case Node::ELEMENT_NODE: | 1020 case Node::ELEMENT_NODE: |
1021 break; | 1021 break; |
1022 case Node::CDATA_SECTION_NODE: | 1022 case Node::CDATA_SECTION_NODE: |
1023 case Node::COMMENT_NODE: | 1023 case Node::COMMENT_NODE: |
1024 case Node::DOCUMENT_TYPE_NODE: | 1024 case Node::DOCUMENT_TYPE_NODE: |
1025 case Node::PROCESSING_INSTRUCTION_NODE: | 1025 case Node::PROCESSING_INSTRUCTION_NODE: |
1026 case Node::TEXT_NODE: | 1026 case Node::TEXT_NODE: |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! | 1067 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
1068 exceptionState.throwTypeError("The node provided is null."); | 1068 exceptionState.throwTypeError("The node provided is null."); |
1069 return; | 1069 return; |
1070 } | 1070 } |
1071 | 1071 |
1072 if (!refNode->parentNode()) { | 1072 if (!refNode->parentNode()) { |
1073 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); | 1073 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); |
1074 return; | 1074 return; |
1075 } | 1075 } |
1076 | 1076 |
1077 switch (refNode->nodeType()) { | 1077 switch (refNode->getNodeType()) { |
1078 case Node::CDATA_SECTION_NODE: | 1078 case Node::CDATA_SECTION_NODE: |
1079 case Node::COMMENT_NODE: | 1079 case Node::COMMENT_NODE: |
1080 case Node::DOCUMENT_TYPE_NODE: | 1080 case Node::DOCUMENT_TYPE_NODE: |
1081 case Node::ELEMENT_NODE: | 1081 case Node::ELEMENT_NODE: |
1082 case Node::PROCESSING_INSTRUCTION_NODE: | 1082 case Node::PROCESSING_INSTRUCTION_NODE: |
1083 case Node::TEXT_NODE: | 1083 case Node::TEXT_NODE: |
1084 break; | 1084 break; |
1085 case Node::ATTRIBUTE_NODE: | 1085 case Node::ATTRIBUTE_NODE: |
1086 case Node::DOCUMENT_FRAGMENT_NODE: | 1086 case Node::DOCUMENT_FRAGMENT_NODE: |
1087 case Node::DOCUMENT_NODE: | 1087 case Node::DOCUMENT_NODE: |
(...skipping 12 matching lines...) Expand all Loading... |
1100 { | 1100 { |
1101 if (!refNode) { | 1101 if (!refNode) { |
1102 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! | 1102 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
1103 exceptionState.throwTypeError("The node provided is null."); | 1103 exceptionState.throwTypeError("The node provided is null."); |
1104 return; | 1104 return; |
1105 } | 1105 } |
1106 | 1106 |
1107 // InvalidNodeTypeError: Raised if refNode or an ancestor of refNode is an E
ntity, Notation | 1107 // InvalidNodeTypeError: Raised if refNode or an ancestor of refNode is an E
ntity, Notation |
1108 // or DocumentType node. | 1108 // or DocumentType node. |
1109 for (Node* n = refNode; n; n = n->parentNode()) { | 1109 for (Node* n = refNode; n; n = n->parentNode()) { |
1110 switch (n->nodeType()) { | 1110 switch (n->getNodeType()) { |
1111 case Node::ATTRIBUTE_NODE: | 1111 case Node::ATTRIBUTE_NODE: |
1112 case Node::CDATA_SECTION_NODE: | 1112 case Node::CDATA_SECTION_NODE: |
1113 case Node::COMMENT_NODE: | 1113 case Node::COMMENT_NODE: |
1114 case Node::DOCUMENT_FRAGMENT_NODE: | 1114 case Node::DOCUMENT_FRAGMENT_NODE: |
1115 case Node::DOCUMENT_NODE: | 1115 case Node::DOCUMENT_NODE: |
1116 case Node::ELEMENT_NODE: | 1116 case Node::ELEMENT_NODE: |
1117 case Node::PROCESSING_INSTRUCTION_NODE: | 1117 case Node::PROCESSING_INSTRUCTION_NODE: |
1118 case Node::TEXT_NODE: | 1118 case Node::TEXT_NODE: |
1119 break; | 1119 break; |
1120 case Node::DOCUMENT_TYPE_NODE: | 1120 case Node::DOCUMENT_TYPE_NODE: |
1121 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + refNode->nodeName() + "'."); | 1121 exceptionState.throwDOMException(InvalidNodeTypeError, "The node pro
vided is of type '" + refNode->nodeName() + "'."); |
1122 return; | 1122 return; |
1123 } | 1123 } |
1124 } | 1124 } |
1125 | 1125 |
1126 if (m_ownerDocument != refNode->document()) | 1126 if (m_ownerDocument != refNode->document()) |
1127 setDocument(refNode->document()); | 1127 setDocument(refNode->document()); |
1128 | 1128 |
1129 m_start.setToStartOfNode(*refNode); | 1129 m_start.setToStartOfNode(*refNode); |
1130 m_end.setToEndOfNode(*refNode); | 1130 m_end.setToEndOfNode(*refNode); |
1131 } | 1131 } |
1132 | 1132 |
1133 bool Range::selectNodeContents(Node* refNode, Position& start, Position& end) | 1133 bool Range::selectNodeContents(Node* refNode, Position& start, Position& end) |
1134 { | 1134 { |
1135 if (!refNode) { | 1135 if (!refNode) { |
1136 return false; | 1136 return false; |
1137 } | 1137 } |
1138 | 1138 |
1139 for (Node* n = refNode; n; n = n->parentNode()) { | 1139 for (Node* n = refNode; n; n = n->parentNode()) { |
1140 switch (n->nodeType()) { | 1140 switch (n->getNodeType()) { |
1141 case Node::ATTRIBUTE_NODE: | 1141 case Node::ATTRIBUTE_NODE: |
1142 case Node::CDATA_SECTION_NODE: | 1142 case Node::CDATA_SECTION_NODE: |
1143 case Node::COMMENT_NODE: | 1143 case Node::COMMENT_NODE: |
1144 case Node::DOCUMENT_FRAGMENT_NODE: | 1144 case Node::DOCUMENT_FRAGMENT_NODE: |
1145 case Node::DOCUMENT_NODE: | 1145 case Node::DOCUMENT_NODE: |
1146 case Node::ELEMENT_NODE: | 1146 case Node::ELEMENT_NODE: |
1147 case Node::PROCESSING_INSTRUCTION_NODE: | 1147 case Node::PROCESSING_INSTRUCTION_NODE: |
1148 case Node::TEXT_NODE: | 1148 case Node::TEXT_NODE: |
1149 break; | 1149 break; |
1150 case Node::DOCUMENT_TYPE_NODE: | 1150 case Node::DOCUMENT_TYPE_NODE: |
(...skipping 14 matching lines...) Expand all Loading... |
1165 { | 1165 { |
1166 RefPtrWillBeRawPtr<Node> newParent = passNewParent; | 1166 RefPtrWillBeRawPtr<Node> newParent = passNewParent; |
1167 if (!newParent) { | 1167 if (!newParent) { |
1168 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! | 1168 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
1169 exceptionState.throwTypeError("The node provided is null."); | 1169 exceptionState.throwTypeError("The node provided is null."); |
1170 return; | 1170 return; |
1171 } | 1171 } |
1172 | 1172 |
1173 // InvalidStateError: Raised if the Range partially selects a non-Text node. | 1173 // InvalidStateError: Raised if the Range partially selects a non-Text node. |
1174 Node* startNonTextContainer = m_start.container(); | 1174 Node* startNonTextContainer = m_start.container(); |
1175 if (startNonTextContainer->nodeType() == Node::TEXT_NODE) | 1175 if (startNonTextContainer->getNodeType() == Node::TEXT_NODE) |
1176 startNonTextContainer = startNonTextContainer->parentNode(); | 1176 startNonTextContainer = startNonTextContainer->parentNode(); |
1177 Node* endNonTextContainer = m_end.container(); | 1177 Node* endNonTextContainer = m_end.container(); |
1178 if (endNonTextContainer->nodeType() == Node::TEXT_NODE) | 1178 if (endNonTextContainer->getNodeType() == Node::TEXT_NODE) |
1179 endNonTextContainer = endNonTextContainer->parentNode(); | 1179 endNonTextContainer = endNonTextContainer->parentNode(); |
1180 if (startNonTextContainer != endNonTextContainer) { | 1180 if (startNonTextContainer != endNonTextContainer) { |
1181 exceptionState.throwDOMException(InvalidStateError, "The Range has parti
ally selected a non-Text node."); | 1181 exceptionState.throwDOMException(InvalidStateError, "The Range has parti
ally selected a non-Text node."); |
1182 return; | 1182 return; |
1183 } | 1183 } |
1184 | 1184 |
1185 // InvalidNodeTypeError: Raised if node is an Attr, Entity, DocumentType, No
tation, | 1185 // InvalidNodeTypeError: Raised if node is an Attr, Entity, DocumentType, No
tation, |
1186 // Document, or DocumentFragment node. | 1186 // Document, or DocumentFragment node. |
1187 switch (newParent->nodeType()) { | 1187 switch (newParent->getNodeType()) { |
1188 case Node::ATTRIBUTE_NODE: | 1188 case Node::ATTRIBUTE_NODE: |
1189 case Node::DOCUMENT_FRAGMENT_NODE: | 1189 case Node::DOCUMENT_FRAGMENT_NODE: |
1190 case Node::DOCUMENT_NODE: | 1190 case Node::DOCUMENT_NODE: |
1191 case Node::DOCUMENT_TYPE_NODE: | 1191 case Node::DOCUMENT_TYPE_NODE: |
1192 exceptionState.throwDOMException(InvalidNodeTypeError, "The node provide
d is of type '" + newParent->nodeName() + "'."); | 1192 exceptionState.throwDOMException(InvalidNodeTypeError, "The node provide
d is of type '" + newParent->nodeName() + "'."); |
1193 return; | 1193 return; |
1194 case Node::CDATA_SECTION_NODE: | 1194 case Node::CDATA_SECTION_NODE: |
1195 case Node::COMMENT_NODE: | 1195 case Node::COMMENT_NODE: |
1196 case Node::ELEMENT_NODE: | 1196 case Node::ELEMENT_NODE: |
1197 case Node::PROCESSING_INSTRUCTION_NODE: | 1197 case Node::PROCESSING_INSTRUCTION_NODE: |
1198 case Node::TEXT_NODE: | 1198 case Node::TEXT_NODE: |
1199 break; | 1199 break; |
1200 } | 1200 } |
1201 | 1201 |
1202 // Raise a HierarchyRequestError if m_start.container() doesn't accept child
ren like newParent. | 1202 // Raise a HierarchyRequestError if m_start.container() doesn't accept child
ren like newParent. |
1203 Node* parentOfNewParent = m_start.container(); | 1203 Node* parentOfNewParent = m_start.container(); |
1204 | 1204 |
1205 // If m_start.container() is a character data node, it will be split and it
will be its parent that will | 1205 // If m_start.container() is a character data node, it will be split and it
will be its parent that will |
1206 // need to accept newParent (or in the case of a comment, it logically "woul
d" be inserted into the parent, | 1206 // need to accept newParent (or in the case of a comment, it logically "woul
d" be inserted into the parent, |
1207 // although this will fail below for another reason). | 1207 // although this will fail below for another reason). |
1208 if (parentOfNewParent->isCharacterDataNode()) | 1208 if (parentOfNewParent->isCharacterDataNode()) |
1209 parentOfNewParent = parentOfNewParent->parentNode(); | 1209 parentOfNewParent = parentOfNewParent->parentNode(); |
1210 | 1210 |
1211 if (!parentOfNewParent) { | 1211 if (!parentOfNewParent) { |
1212 exceptionState.throwDOMException(HierarchyRequestError, "The container n
ode is a detached character data node; no parent node is available for insertion
."); | 1212 exceptionState.throwDOMException(HierarchyRequestError, "The container n
ode is a detached character data node; no parent node is available for insertion
."); |
1213 return; | 1213 return; |
1214 } | 1214 } |
1215 | 1215 |
1216 if (!parentOfNewParent->childTypeAllowed(newParent->nodeType())) { | 1216 if (!parentOfNewParent->childTypeAllowed(newParent->getNodeType())) { |
1217 exceptionState.throwDOMException(HierarchyRequestError, "The node provid
ed is of type '" + newParent->nodeName() + "', which may not be inserted here.")
; | 1217 exceptionState.throwDOMException(HierarchyRequestError, "The node provid
ed is of type '" + newParent->nodeName() + "', which may not be inserted here.")
; |
1218 return; | 1218 return; |
1219 } | 1219 } |
1220 | 1220 |
1221 if (newParent->containsIncludingShadowDOM(m_start.container())) { | 1221 if (newParent->containsIncludingShadowDOM(m_start.container())) { |
1222 exceptionState.throwDOMException(HierarchyRequestError, "The node provid
ed contains the insertion point; it may not be inserted into itself."); | 1222 exceptionState.throwDOMException(HierarchyRequestError, "The node provid
ed contains the insertion point; it may not be inserted into itself."); |
1223 return; | 1223 return; |
1224 } | 1224 } |
1225 | 1225 |
1226 // FIXME: Do we need a check if the node would end up with a child node of a
type not | 1226 // FIXME: Do we need a check if the node would end up with a child node of a
type not |
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1664 { | 1664 { |
1665 if (range && range->boundaryPointsValid()) { | 1665 if (range && range->boundaryPointsValid()) { |
1666 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); | 1666 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); |
1667 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); | 1667 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); |
1668 } else { | 1668 } else { |
1669 fprintf(stderr, "Cannot show tree if range is null, or if boundary point
s are invalid.\n"); | 1669 fprintf(stderr, "Cannot show tree if range is null, or if boundary point
s are invalid.\n"); |
1670 } | 1670 } |
1671 } | 1671 } |
1672 | 1672 |
1673 #endif | 1673 #endif |
OLD | NEW |