| 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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 Node* startRootContainer = start.container(); | 150 Node* startRootContainer = start.container(); |
| 151 while (startRootContainer->parentNode()) | 151 while (startRootContainer->parentNode()) |
| 152 startRootContainer = startRootContainer->parentNode(); | 152 startRootContainer = startRootContainer->parentNode(); |
| 153 | 153 |
| 154 return startRootContainer != endRootContainer || (Range::compareBoundaryPoin
ts(start, end, ASSERT_NO_EXCEPTION) > 0); | 154 return startRootContainer != endRootContainer || (Range::compareBoundaryPoin
ts(start, end, ASSERT_NO_EXCEPTION) > 0); |
| 155 } | 155 } |
| 156 | 156 |
| 157 void Range::setStart(PassRefPtrWillBeRawPtr<Node> refNode, int offset, Exception
State& exceptionState) | 157 void Range::setStart(PassRefPtrWillBeRawPtr<Node> refNode, int offset, Exception
State& exceptionState) |
| 158 { | 158 { |
| 159 if (!refNode) { | 159 if (!refNode) { |
| 160 exceptionState.throwDOMException(NotFoundError, "The node provided was n
ull."); | 160 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 161 exceptionState.throwTypeError("The node provided is null."); |
| 161 return; | 162 return; |
| 162 } | 163 } |
| 163 | 164 |
| 164 bool didMoveDocument = false; | 165 bool didMoveDocument = false; |
| 165 if (refNode->document() != m_ownerDocument) { | 166 if (refNode->document() != m_ownerDocument) { |
| 166 setDocument(refNode->document()); | 167 setDocument(refNode->document()); |
| 167 didMoveDocument = true; | 168 didMoveDocument = true; |
| 168 } | 169 } |
| 169 | 170 |
| 170 Node* childNode = checkNodeWOffset(refNode.get(), offset, exceptionState); | 171 Node* childNode = checkNodeWOffset(refNode.get(), offset, exceptionState); |
| 171 if (exceptionState.hadException()) | 172 if (exceptionState.hadException()) |
| 172 return; | 173 return; |
| 173 | 174 |
| 174 m_start.set(refNode, offset, childNode); | 175 m_start.set(refNode, offset, childNode); |
| 175 | 176 |
| 176 if (didMoveDocument || checkForDifferentRootContainer(m_start, m_end)) | 177 if (didMoveDocument || checkForDifferentRootContainer(m_start, m_end)) |
| 177 collapse(true); | 178 collapse(true); |
| 178 } | 179 } |
| 179 | 180 |
| 180 void Range::setEnd(PassRefPtrWillBeRawPtr<Node> refNode, int offset, ExceptionSt
ate& exceptionState) | 181 void Range::setEnd(PassRefPtrWillBeRawPtr<Node> refNode, int offset, ExceptionSt
ate& exceptionState) |
| 181 { | 182 { |
| 182 if (!refNode) { | 183 if (!refNode) { |
| 183 exceptionState.throwDOMException(NotFoundError, "The node provided was n
ull."); | 184 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 185 exceptionState.throwTypeError("The node provided is null."); |
| 184 return; | 186 return; |
| 185 } | 187 } |
| 186 | 188 |
| 187 bool didMoveDocument = false; | 189 bool didMoveDocument = false; |
| 188 if (refNode->document() != m_ownerDocument) { | 190 if (refNode->document() != m_ownerDocument) { |
| 189 setDocument(refNode->document()); | 191 setDocument(refNode->document()); |
| 190 didMoveDocument = true; | 192 didMoveDocument = true; |
| 191 } | 193 } |
| 192 | 194 |
| 193 Node* childNode = checkNodeWOffset(refNode.get(), offset, exceptionState); | 195 Node* childNode = checkNodeWOffset(refNode.get(), offset, exceptionState); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 216 { | 218 { |
| 217 if (toStart) | 219 if (toStart) |
| 218 m_end = m_start; | 220 m_end = m_start; |
| 219 else | 221 else |
| 220 m_start = m_end; | 222 m_start = m_end; |
| 221 } | 223 } |
| 222 | 224 |
| 223 bool Range::isPointInRange(Node* refNode, int offset, ExceptionState& exceptionS
tate) | 225 bool Range::isPointInRange(Node* refNode, int offset, ExceptionState& exceptionS
tate) |
| 224 { | 226 { |
| 225 if (!refNode) { | 227 if (!refNode) { |
| 226 exceptionState.throwDOMException(HierarchyRequestError, "The node provid
ed was null."); | 228 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 229 exceptionState.throwTypeError("The node provided is null."); |
| 227 return false; | 230 return false; |
| 228 } | 231 } |
| 229 | 232 |
| 230 if (!refNode->inActiveDocument() || refNode->document() != m_ownerDocument)
{ | 233 if (!refNode->inActiveDocument() || refNode->document() != m_ownerDocument)
{ |
| 231 return false; | 234 return false; |
| 232 } | 235 } |
| 233 | 236 |
| 234 checkNodeWOffset(refNode, offset, exceptionState); | 237 checkNodeWOffset(refNode, offset, exceptionState); |
| 235 if (exceptionState.hadException()) | 238 if (exceptionState.hadException()) |
| 236 return false; | 239 return false; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 return 0; | 277 return 0; |
| 275 } | 278 } |
| 276 | 279 |
| 277 Range::CompareResults Range::compareNode(Node* refNode, ExceptionState& exceptio
nState) const | 280 Range::CompareResults Range::compareNode(Node* refNode, ExceptionState& exceptio
nState) const |
| 278 { | 281 { |
| 279 // http://developer.mozilla.org/en/docs/DOM:range.compareNode | 282 // http://developer.mozilla.org/en/docs/DOM:range.compareNode |
| 280 // This method returns 0, 1, 2, or 3 based on if the node is before, after, | 283 // This method returns 0, 1, 2, or 3 based on if the node is before, after, |
| 281 // before and after(surrounds), or inside the range, respectively | 284 // before and after(surrounds), or inside the range, respectively |
| 282 | 285 |
| 283 if (!refNode) { | 286 if (!refNode) { |
| 284 exceptionState.throwDOMException(NotFoundError, "The node provided was n
ull."); | 287 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 288 exceptionState.throwTypeError("The node provided is null."); |
| 285 return NODE_BEFORE; | 289 return NODE_BEFORE; |
| 286 } | 290 } |
| 287 | 291 |
| 288 if (!refNode->inActiveDocument()) { | 292 if (!refNode->inActiveDocument()) { |
| 289 // Firefox doesn't throw an exception for this case; it returns 0. | 293 // Firefox doesn't throw an exception for this case; it returns 0. |
| 290 return NODE_BEFORE; | 294 return NODE_BEFORE; |
| 291 } | 295 } |
| 292 | 296 |
| 293 if (refNode->document() != m_ownerDocument) { | 297 if (refNode->document() != m_ownerDocument) { |
| 294 // Firefox doesn't throw an exception for this case; it returns 0. | 298 // Firefox doesn't throw an exception for this case; it returns 0. |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 | 470 |
| 467 { | 471 { |
| 468 EventQueueScope eventQueueScope; | 472 EventQueueScope eventQueueScope; |
| 469 processContents(DELETE_CONTENTS, exceptionState); | 473 processContents(DELETE_CONTENTS, exceptionState); |
| 470 } | 474 } |
| 471 } | 475 } |
| 472 | 476 |
| 473 static bool nodeValidForIntersects(Node* refNode, Document* expectedDocument, Ex
ceptionState& exceptionState) | 477 static bool nodeValidForIntersects(Node* refNode, Document* expectedDocument, Ex
ceptionState& exceptionState) |
| 474 { | 478 { |
| 475 if (!refNode) { | 479 if (!refNode) { |
| 476 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); | 480 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 481 exceptionState.throwTypeError("The node provided is null."); |
| 477 return false; | 482 return false; |
| 478 } | 483 } |
| 479 | 484 |
| 480 if (!refNode->inActiveDocument() || refNode->document() != expectedDocument)
{ | 485 if (!refNode->inActiveDocument() || refNode->document() != expectedDocument)
{ |
| 481 // Firefox doesn't throw an exception for these cases; it returns false. | 486 // Firefox doesn't throw an exception for these cases; it returns false. |
| 482 return false; | 487 return false; |
| 483 } | 488 } |
| 484 | 489 |
| 485 return true; | 490 return true; |
| 486 } | 491 } |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 PassRefPtrWillBeRawPtr<DocumentFragment> Range::cloneContents(ExceptionState& ex
ceptionState) | 858 PassRefPtrWillBeRawPtr<DocumentFragment> Range::cloneContents(ExceptionState& ex
ceptionState) |
| 854 { | 859 { |
| 855 return processContents(CLONE_CONTENTS, exceptionState); | 860 return processContents(CLONE_CONTENTS, exceptionState); |
| 856 } | 861 } |
| 857 | 862 |
| 858 void Range::insertNode(PassRefPtrWillBeRawPtr<Node> prpNewNode, ExceptionState&
exceptionState) | 863 void Range::insertNode(PassRefPtrWillBeRawPtr<Node> prpNewNode, ExceptionState&
exceptionState) |
| 859 { | 864 { |
| 860 RefPtrWillBeRawPtr<Node> newNode = prpNewNode; | 865 RefPtrWillBeRawPtr<Node> newNode = prpNewNode; |
| 861 | 866 |
| 862 if (!newNode) { | 867 if (!newNode) { |
| 863 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); | 868 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 869 exceptionState.throwTypeError("The node provided is null."); |
| 864 return; | 870 return; |
| 865 } | 871 } |
| 866 | 872 |
| 867 // HierarchyRequestError: Raised if the container of the start of the Range
is of a type that | 873 // HierarchyRequestError: Raised if the container of the start of the Range
is of a type that |
| 868 // does not allow children of the type of newNode or if newNode is an ancest
or of the container. | 874 // does not allow children of the type of newNode or if newNode is an ancest
or of the container. |
| 869 | 875 |
| 870 // an extra one here - if a text node is going to split, it must have a pare
nt to insert into | 876 // an extra one here - if a text node is going to split, it must have a pare
nt to insert into |
| 871 bool startIsText = m_start.container()->isTextNode(); | 877 bool startIsText = m_start.container()->isTextNode(); |
| 872 if (startIsText && !m_start.container()->parentNode()) { | 878 if (startIsText && !m_start.container()->parentNode()) { |
| 873 exceptionState.throwDOMException(HierarchyRequestError, "This operation
would split a text node, but there's no parent into which to insert."); | 879 exceptionState.throwDOMException(HierarchyRequestError, "This operation
would split a text node, but there's no parent into which to insert."); |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1072 return childBefore; | 1078 return childBefore; |
| 1073 } | 1079 } |
| 1074 } | 1080 } |
| 1075 ASSERT_NOT_REACHED(); | 1081 ASSERT_NOT_REACHED(); |
| 1076 return nullptr; | 1082 return nullptr; |
| 1077 } | 1083 } |
| 1078 | 1084 |
| 1079 void Range::checkNodeBA(Node* n, ExceptionState& exceptionState) const | 1085 void Range::checkNodeBA(Node* n, ExceptionState& exceptionState) const |
| 1080 { | 1086 { |
| 1081 if (!n) { | 1087 if (!n) { |
| 1082 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); | 1088 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 1089 exceptionState.throwTypeError("The node provided is null."); |
| 1083 return; | 1090 return; |
| 1084 } | 1091 } |
| 1085 | 1092 |
| 1086 // InvalidNodeTypeError: Raised if the root container of refNode is not an | 1093 // InvalidNodeTypeError: Raised if the root container of refNode is not an |
| 1087 // Attr, Document, DocumentFragment or ShadowRoot node, or part of a SVG sha
dow DOM tree, | 1094 // Attr, Document, DocumentFragment or ShadowRoot node, or part of a SVG sha
dow DOM tree, |
| 1088 // or if refNode is a Document, DocumentFragment, ShadowRoot, Attr, Entity,
or Notation node. | 1095 // or if refNode is a Document, DocumentFragment, ShadowRoot, Attr, Entity,
or Notation node. |
| 1089 | 1096 |
| 1090 if (!n->parentNode()) { | 1097 if (!n->parentNode()) { |
| 1091 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); | 1098 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); |
| 1092 return; | 1099 return; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1155 checkNodeBA(refNode, exceptionState); | 1162 checkNodeBA(refNode, exceptionState); |
| 1156 if (exceptionState.hadException()) | 1163 if (exceptionState.hadException()) |
| 1157 return; | 1164 return; |
| 1158 | 1165 |
| 1159 setEnd(refNode->parentNode(), refNode->nodeIndex() + 1, exceptionState); | 1166 setEnd(refNode->parentNode(), refNode->nodeIndex() + 1, exceptionState); |
| 1160 } | 1167 } |
| 1161 | 1168 |
| 1162 void Range::selectNode(Node* refNode, ExceptionState& exceptionState) | 1169 void Range::selectNode(Node* refNode, ExceptionState& exceptionState) |
| 1163 { | 1170 { |
| 1164 if (!refNode) { | 1171 if (!refNode) { |
| 1165 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); | 1172 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 1173 exceptionState.throwTypeError("The node provided is null."); |
| 1166 return; | 1174 return; |
| 1167 } | 1175 } |
| 1168 | 1176 |
| 1169 if (!refNode->parentNode()) { | 1177 if (!refNode->parentNode()) { |
| 1170 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); | 1178 exceptionState.throwDOMException(InvalidNodeTypeError, "the given Node h
as no parent."); |
| 1171 return; | 1179 return; |
| 1172 } | 1180 } |
| 1173 | 1181 |
| 1174 // InvalidNodeTypeError: Raised if an ancestor of refNode is an Entity, Nota
tion or | 1182 // 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 | 1183 // DocumentType node or if refNode is a Document, DocumentFragment, ShadowRo
ot, Attr, Entity, or Notation |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1209 if (m_ownerDocument != refNode->document()) | 1217 if (m_ownerDocument != refNode->document()) |
| 1210 setDocument(refNode->document()); | 1218 setDocument(refNode->document()); |
| 1211 | 1219 |
| 1212 setStartBefore(refNode); | 1220 setStartBefore(refNode); |
| 1213 setEndAfter(refNode); | 1221 setEndAfter(refNode); |
| 1214 } | 1222 } |
| 1215 | 1223 |
| 1216 void Range::selectNodeContents(Node* refNode, ExceptionState& exceptionState) | 1224 void Range::selectNodeContents(Node* refNode, ExceptionState& exceptionState) |
| 1217 { | 1225 { |
| 1218 if (!refNode) { | 1226 if (!refNode) { |
| 1219 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); | 1227 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 1228 exceptionState.throwTypeError("The node provided is null."); |
| 1220 return; | 1229 return; |
| 1221 } | 1230 } |
| 1222 | 1231 |
| 1223 // InvalidNodeTypeError: Raised if refNode or an ancestor of refNode is an E
ntity, Notation | 1232 // InvalidNodeTypeError: Raised if refNode or an ancestor of refNode is an E
ntity, Notation |
| 1224 // or DocumentType node. | 1233 // or DocumentType node. |
| 1225 for (Node* n = refNode; n; n = n->parentNode()) { | 1234 for (Node* n = refNode; n; n = n->parentNode()) { |
| 1226 switch (n->nodeType()) { | 1235 switch (n->nodeType()) { |
| 1227 case Node::ATTRIBUTE_NODE: | 1236 case Node::ATTRIBUTE_NODE: |
| 1228 case Node::CDATA_SECTION_NODE: | 1237 case Node::CDATA_SECTION_NODE: |
| 1229 case Node::COMMENT_NODE: | 1238 case Node::COMMENT_NODE: |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1274 RangeBoundaryPoint endBoundaryPoint(refNode); | 1283 RangeBoundaryPoint endBoundaryPoint(refNode); |
| 1275 endBoundaryPoint.setToEndOfNode(*refNode); | 1284 endBoundaryPoint.setToEndOfNode(*refNode); |
| 1276 end = endBoundaryPoint.toPosition(); | 1285 end = endBoundaryPoint.toPosition(); |
| 1277 return true; | 1286 return true; |
| 1278 } | 1287 } |
| 1279 | 1288 |
| 1280 void Range::surroundContents(PassRefPtrWillBeRawPtr<Node> passNewParent, Excepti
onState& exceptionState) | 1289 void Range::surroundContents(PassRefPtrWillBeRawPtr<Node> passNewParent, Excepti
onState& exceptionState) |
| 1281 { | 1290 { |
| 1282 RefPtrWillBeRawPtr<Node> newParent = passNewParent; | 1291 RefPtrWillBeRawPtr<Node> newParent = passNewParent; |
| 1283 if (!newParent) { | 1292 if (!newParent) { |
| 1284 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); | 1293 // FIXME: Generated bindings code never calls with null, and neither sho
uld other callers! |
| 1294 exceptionState.throwTypeError("The node provided is null."); |
| 1285 return; | 1295 return; |
| 1286 } | 1296 } |
| 1287 | 1297 |
| 1288 // InvalidStateError: Raised if the Range partially selects a non-Text node. | 1298 // InvalidStateError: Raised if the Range partially selects a non-Text node. |
| 1289 Node* startNonTextContainer = m_start.container(); | 1299 Node* startNonTextContainer = m_start.container(); |
| 1290 if (startNonTextContainer->nodeType() == Node::TEXT_NODE) | 1300 if (startNonTextContainer->nodeType() == Node::TEXT_NODE) |
| 1291 startNonTextContainer = startNonTextContainer->parentNode(); | 1301 startNonTextContainer = startNonTextContainer->parentNode(); |
| 1292 Node* endNonTextContainer = m_end.container(); | 1302 Node* endNonTextContainer = m_end.container(); |
| 1293 if (endNonTextContainer->nodeType() == Node::TEXT_NODE) | 1303 if (endNonTextContainer->nodeType() == Node::TEXT_NODE) |
| 1294 endNonTextContainer = endNonTextContainer->parentNode(); | 1304 endNonTextContainer = endNonTextContainer->parentNode(); |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1776 | 1786 |
| 1777 void showTree(const blink::Range* range) | 1787 void showTree(const blink::Range* range) |
| 1778 { | 1788 { |
| 1779 if (range && range->boundaryPointsValid()) { | 1789 if (range && range->boundaryPointsValid()) { |
| 1780 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); | 1790 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); |
| 1781 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); | 1791 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); |
| 1782 } | 1792 } |
| 1783 } | 1793 } |
| 1784 | 1794 |
| 1785 #endif | 1795 #endif |
| OLD | NEW |