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 17 matching lines...) Expand all Loading... |
28 #include <stdio.h> | 28 #include <stdio.h> |
29 #include "HTMLNames.h" | 29 #include "HTMLNames.h" |
30 #include "core/dom/ClientRect.h" | 30 #include "core/dom/ClientRect.h" |
31 #include "core/dom/ClientRectList.h" | 31 #include "core/dom/ClientRectList.h" |
32 #include "core/dom/DocumentFragment.h" | 32 #include "core/dom/DocumentFragment.h" |
33 #include "core/dom/ExceptionCode.h" | 33 #include "core/dom/ExceptionCode.h" |
34 #include "core/dom/Node.h" | 34 #include "core/dom/Node.h" |
35 #include "core/dom/NodeTraversal.h" | 35 #include "core/dom/NodeTraversal.h" |
36 #include "core/dom/NodeWithIndex.h" | 36 #include "core/dom/NodeWithIndex.h" |
37 #include "core/dom/ProcessingInstruction.h" | 37 #include "core/dom/ProcessingInstruction.h" |
38 #include "core/dom/RangeException.h" | |
39 #include "core/dom/Text.h" | 38 #include "core/dom/Text.h" |
40 #include "core/editing/TextIterator.h" | 39 #include "core/editing/TextIterator.h" |
41 #include "core/editing/VisiblePosition.h" | 40 #include "core/editing/VisiblePosition.h" |
42 #include "core/editing/VisibleUnits.h" | 41 #include "core/editing/VisibleUnits.h" |
43 #include "core/editing/htmlediting.h" | 42 #include "core/editing/htmlediting.h" |
44 #include "core/editing/markup.h" | 43 #include "core/editing/markup.h" |
45 #include "core/html/HTMLElement.h" | 44 #include "core/html/HTMLElement.h" |
46 #include "core/page/Frame.h" | 45 #include "core/page/Frame.h" |
47 #include "core/page/FrameView.h" | 46 #include "core/page/FrameView.h" |
48 #include "core/page/Page.h" | 47 #include "core/page/Page.h" |
(...skipping 955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1004 return; | 1003 return; |
1005 } | 1004 } |
1006 } | 1005 } |
1007 | 1006 |
1008 // INVALID_NODE_TYPE_ERR: Raised if newNode is an Attr, Entity, Notation, Sh
adowRoot or Document node. | 1007 // INVALID_NODE_TYPE_ERR: Raised if newNode is an Attr, Entity, Notation, Sh
adowRoot or Document node. |
1009 switch (newNodeType) { | 1008 switch (newNodeType) { |
1010 case Node::ATTRIBUTE_NODE: | 1009 case Node::ATTRIBUTE_NODE: |
1011 case Node::ENTITY_NODE: | 1010 case Node::ENTITY_NODE: |
1012 case Node::NOTATION_NODE: | 1011 case Node::NOTATION_NODE: |
1013 case Node::DOCUMENT_NODE: | 1012 case Node::DOCUMENT_NODE: |
1014 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1013 ec = INVALID_NODE_TYPE_ERR; |
1015 return; | 1014 return; |
1016 default: | 1015 default: |
1017 if (newNode->isShadowRoot()) { | 1016 if (newNode->isShadowRoot()) { |
1018 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1017 ec = INVALID_NODE_TYPE_ERR; |
1019 return; | 1018 return; |
1020 } | 1019 } |
1021 break; | 1020 break; |
1022 } | 1021 } |
1023 | 1022 |
1024 bool collapsed = m_start == m_end; | 1023 bool collapsed = m_start == m_end; |
1025 RefPtr<Node> container; | 1024 RefPtr<Node> container; |
1026 if (startIsText) { | 1025 if (startIsText) { |
1027 container = m_start.container(); | 1026 container = m_start.container(); |
1028 RefPtr<Text> newText = toText(container.get())->splitText(m_start.offset
(), ec); | 1027 RefPtr<Text> newText = toText(container.get())->splitText(m_start.offset
(), ec); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 m_start.clear(); | 1129 m_start.clear(); |
1131 m_end.clear(); | 1130 m_end.clear(); |
1132 } | 1131 } |
1133 | 1132 |
1134 Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionCode& ec) const | 1133 Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionCode& ec) const |
1135 { | 1134 { |
1136 switch (n->nodeType()) { | 1135 switch (n->nodeType()) { |
1137 case Node::DOCUMENT_TYPE_NODE: | 1136 case Node::DOCUMENT_TYPE_NODE: |
1138 case Node::ENTITY_NODE: | 1137 case Node::ENTITY_NODE: |
1139 case Node::NOTATION_NODE: | 1138 case Node::NOTATION_NODE: |
1140 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1139 ec = INVALID_NODE_TYPE_ERR; |
1141 return 0; | 1140 return 0; |
1142 case Node::CDATA_SECTION_NODE: | 1141 case Node::CDATA_SECTION_NODE: |
1143 case Node::COMMENT_NODE: | 1142 case Node::COMMENT_NODE: |
1144 case Node::TEXT_NODE: | 1143 case Node::TEXT_NODE: |
1145 if (static_cast<unsigned>(offset) > static_cast<CharacterData*>(n)->
length()) | 1144 if (static_cast<unsigned>(offset) > static_cast<CharacterData*>(n)->
length()) |
1146 ec = INDEX_SIZE_ERR; | 1145 ec = INDEX_SIZE_ERR; |
1147 return 0; | 1146 return 0; |
1148 case Node::PROCESSING_INSTRUCTION_NODE: | 1147 case Node::PROCESSING_INSTRUCTION_NODE: |
1149 if (static_cast<unsigned>(offset) > static_cast<ProcessingInstructio
n*>(n)->data().length()) | 1148 if (static_cast<unsigned>(offset) > static_cast<ProcessingInstructio
n*>(n)->data().length()) |
1150 ec = INDEX_SIZE_ERR; | 1149 ec = INDEX_SIZE_ERR; |
(...skipping 21 matching lines...) Expand all Loading... |
1172 // INVALID_NODE_TYPE_ERR: Raised if the root container of refNode is not an | 1171 // INVALID_NODE_TYPE_ERR: Raised if the root container of refNode is not an |
1173 // Attr, Document, DocumentFragment or ShadowRoot node, or part of a SVG sha
dow DOM tree, | 1172 // Attr, Document, DocumentFragment or ShadowRoot node, or part of a SVG sha
dow DOM tree, |
1174 // or if refNode is a Document, DocumentFragment, ShadowRoot, Attr, Entity,
or Notation node. | 1173 // or if refNode is a Document, DocumentFragment, ShadowRoot, Attr, Entity,
or Notation node. |
1175 | 1174 |
1176 switch (n->nodeType()) { | 1175 switch (n->nodeType()) { |
1177 case Node::ATTRIBUTE_NODE: | 1176 case Node::ATTRIBUTE_NODE: |
1178 case Node::DOCUMENT_FRAGMENT_NODE: | 1177 case Node::DOCUMENT_FRAGMENT_NODE: |
1179 case Node::DOCUMENT_NODE: | 1178 case Node::DOCUMENT_NODE: |
1180 case Node::ENTITY_NODE: | 1179 case Node::ENTITY_NODE: |
1181 case Node::NOTATION_NODE: | 1180 case Node::NOTATION_NODE: |
1182 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1181 ec = INVALID_NODE_TYPE_ERR; |
1183 return; | 1182 return; |
1184 case Node::CDATA_SECTION_NODE: | 1183 case Node::CDATA_SECTION_NODE: |
1185 case Node::COMMENT_NODE: | 1184 case Node::COMMENT_NODE: |
1186 case Node::DOCUMENT_TYPE_NODE: | 1185 case Node::DOCUMENT_TYPE_NODE: |
1187 case Node::ELEMENT_NODE: | 1186 case Node::ELEMENT_NODE: |
1188 case Node::ENTITY_REFERENCE_NODE: | 1187 case Node::ENTITY_REFERENCE_NODE: |
1189 case Node::PROCESSING_INSTRUCTION_NODE: | 1188 case Node::PROCESSING_INSTRUCTION_NODE: |
1190 case Node::TEXT_NODE: | 1189 case Node::TEXT_NODE: |
1191 case Node::XPATH_NAMESPACE_NODE: | 1190 case Node::XPATH_NAMESPACE_NODE: |
1192 break; | 1191 break; |
(...skipping 11 matching lines...) Expand all Loading... |
1204 case Node::CDATA_SECTION_NODE: | 1203 case Node::CDATA_SECTION_NODE: |
1205 case Node::COMMENT_NODE: | 1204 case Node::COMMENT_NODE: |
1206 case Node::DOCUMENT_TYPE_NODE: | 1205 case Node::DOCUMENT_TYPE_NODE: |
1207 case Node::ELEMENT_NODE: | 1206 case Node::ELEMENT_NODE: |
1208 case Node::ENTITY_NODE: | 1207 case Node::ENTITY_NODE: |
1209 case Node::ENTITY_REFERENCE_NODE: | 1208 case Node::ENTITY_REFERENCE_NODE: |
1210 case Node::NOTATION_NODE: | 1209 case Node::NOTATION_NODE: |
1211 case Node::PROCESSING_INSTRUCTION_NODE: | 1210 case Node::PROCESSING_INSTRUCTION_NODE: |
1212 case Node::TEXT_NODE: | 1211 case Node::TEXT_NODE: |
1213 case Node::XPATH_NAMESPACE_NODE: | 1212 case Node::XPATH_NAMESPACE_NODE: |
1214 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1213 ec = INVALID_NODE_TYPE_ERR; |
1215 return; | 1214 return; |
1216 } | 1215 } |
1217 } | 1216 } |
1218 | 1217 |
1219 PassRefPtr<Range> Range::cloneRange(ExceptionCode& ec) const | 1218 PassRefPtr<Range> Range::cloneRange(ExceptionCode& ec) const |
1220 { | 1219 { |
1221 if (!m_start.container()) { | 1220 if (!m_start.container()) { |
1222 ec = INVALID_STATE_ERR; | 1221 ec = INVALID_STATE_ERR; |
1223 return 0; | 1222 return 0; |
1224 } | 1223 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 case Node::DOCUMENT_NODE: | 1309 case Node::DOCUMENT_NODE: |
1311 case Node::ELEMENT_NODE: | 1310 case Node::ELEMENT_NODE: |
1312 case Node::ENTITY_REFERENCE_NODE: | 1311 case Node::ENTITY_REFERENCE_NODE: |
1313 case Node::PROCESSING_INSTRUCTION_NODE: | 1312 case Node::PROCESSING_INSTRUCTION_NODE: |
1314 case Node::TEXT_NODE: | 1313 case Node::TEXT_NODE: |
1315 case Node::XPATH_NAMESPACE_NODE: | 1314 case Node::XPATH_NAMESPACE_NODE: |
1316 break; | 1315 break; |
1317 case Node::DOCUMENT_TYPE_NODE: | 1316 case Node::DOCUMENT_TYPE_NODE: |
1318 case Node::ENTITY_NODE: | 1317 case Node::ENTITY_NODE: |
1319 case Node::NOTATION_NODE: | 1318 case Node::NOTATION_NODE: |
1320 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1319 ec = INVALID_NODE_TYPE_ERR; |
1321 return; | 1320 return; |
1322 } | 1321 } |
1323 } | 1322 } |
1324 | 1323 |
1325 switch (refNode->nodeType()) { | 1324 switch (refNode->nodeType()) { |
1326 case Node::CDATA_SECTION_NODE: | 1325 case Node::CDATA_SECTION_NODE: |
1327 case Node::COMMENT_NODE: | 1326 case Node::COMMENT_NODE: |
1328 case Node::DOCUMENT_TYPE_NODE: | 1327 case Node::DOCUMENT_TYPE_NODE: |
1329 case Node::ELEMENT_NODE: | 1328 case Node::ELEMENT_NODE: |
1330 case Node::ENTITY_REFERENCE_NODE: | 1329 case Node::ENTITY_REFERENCE_NODE: |
1331 case Node::PROCESSING_INSTRUCTION_NODE: | 1330 case Node::PROCESSING_INSTRUCTION_NODE: |
1332 case Node::TEXT_NODE: | 1331 case Node::TEXT_NODE: |
1333 case Node::XPATH_NAMESPACE_NODE: | 1332 case Node::XPATH_NAMESPACE_NODE: |
1334 break; | 1333 break; |
1335 case Node::ATTRIBUTE_NODE: | 1334 case Node::ATTRIBUTE_NODE: |
1336 case Node::DOCUMENT_FRAGMENT_NODE: | 1335 case Node::DOCUMENT_FRAGMENT_NODE: |
1337 case Node::DOCUMENT_NODE: | 1336 case Node::DOCUMENT_NODE: |
1338 case Node::ENTITY_NODE: | 1337 case Node::ENTITY_NODE: |
1339 case Node::NOTATION_NODE: | 1338 case Node::NOTATION_NODE: |
1340 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1339 ec = INVALID_NODE_TYPE_ERR; |
1341 return; | 1340 return; |
1342 } | 1341 } |
1343 | 1342 |
1344 if (m_ownerDocument != refNode->document()) | 1343 if (m_ownerDocument != refNode->document()) |
1345 setDocument(refNode->document()); | 1344 setDocument(refNode->document()); |
1346 | 1345 |
1347 ec = 0; | 1346 ec = 0; |
1348 setStartBefore(refNode, ec); | 1347 setStartBefore(refNode, ec); |
1349 if (ec) | 1348 if (ec) |
1350 return; | 1349 return; |
(...skipping 23 matching lines...) Expand all Loading... |
1374 case Node::DOCUMENT_NODE: | 1373 case Node::DOCUMENT_NODE: |
1375 case Node::ELEMENT_NODE: | 1374 case Node::ELEMENT_NODE: |
1376 case Node::ENTITY_REFERENCE_NODE: | 1375 case Node::ENTITY_REFERENCE_NODE: |
1377 case Node::PROCESSING_INSTRUCTION_NODE: | 1376 case Node::PROCESSING_INSTRUCTION_NODE: |
1378 case Node::TEXT_NODE: | 1377 case Node::TEXT_NODE: |
1379 case Node::XPATH_NAMESPACE_NODE: | 1378 case Node::XPATH_NAMESPACE_NODE: |
1380 break; | 1379 break; |
1381 case Node::DOCUMENT_TYPE_NODE: | 1380 case Node::DOCUMENT_TYPE_NODE: |
1382 case Node::ENTITY_NODE: | 1381 case Node::ENTITY_NODE: |
1383 case Node::NOTATION_NODE: | 1382 case Node::NOTATION_NODE: |
1384 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1383 ec = INVALID_NODE_TYPE_ERR; |
1385 return; | 1384 return; |
1386 } | 1385 } |
1387 } | 1386 } |
1388 | 1387 |
1389 if (m_ownerDocument != refNode->document()) | 1388 if (m_ownerDocument != refNode->document()) |
1390 setDocument(refNode->document()); | 1389 setDocument(refNode->document()); |
1391 | 1390 |
1392 m_start.setToStartOfNode(refNode); | 1391 m_start.setToStartOfNode(refNode); |
1393 m_end.setToEndOfNode(refNode); | 1392 m_end.setToEndOfNode(refNode); |
1394 } | 1393 } |
(...skipping 14 matching lines...) Expand all Loading... |
1409 | 1408 |
1410 // INVALID_NODE_TYPE_ERR: Raised if node is an Attr, Entity, DocumentType, N
otation, | 1409 // INVALID_NODE_TYPE_ERR: Raised if node is an Attr, Entity, DocumentType, N
otation, |
1411 // Document, or DocumentFragment node. | 1410 // Document, or DocumentFragment node. |
1412 switch (newParent->nodeType()) { | 1411 switch (newParent->nodeType()) { |
1413 case Node::ATTRIBUTE_NODE: | 1412 case Node::ATTRIBUTE_NODE: |
1414 case Node::DOCUMENT_FRAGMENT_NODE: | 1413 case Node::DOCUMENT_FRAGMENT_NODE: |
1415 case Node::DOCUMENT_NODE: | 1414 case Node::DOCUMENT_NODE: |
1416 case Node::DOCUMENT_TYPE_NODE: | 1415 case Node::DOCUMENT_TYPE_NODE: |
1417 case Node::ENTITY_NODE: | 1416 case Node::ENTITY_NODE: |
1418 case Node::NOTATION_NODE: | 1417 case Node::NOTATION_NODE: |
1419 ec = RangeException::INVALID_NODE_TYPE_ERR; | 1418 ec = INVALID_NODE_TYPE_ERR; |
1420 return; | 1419 return; |
1421 case Node::CDATA_SECTION_NODE: | 1420 case Node::CDATA_SECTION_NODE: |
1422 case Node::COMMENT_NODE: | 1421 case Node::COMMENT_NODE: |
1423 case Node::ELEMENT_NODE: | 1422 case Node::ELEMENT_NODE: |
1424 case Node::ENTITY_REFERENCE_NODE: | 1423 case Node::ENTITY_REFERENCE_NODE: |
1425 case Node::PROCESSING_INSTRUCTION_NODE: | 1424 case Node::PROCESSING_INSTRUCTION_NODE: |
1426 case Node::TEXT_NODE: | 1425 case Node::TEXT_NODE: |
1427 case Node::XPATH_NAMESPACE_NODE: | 1426 case Node::XPATH_NAMESPACE_NODE: |
1428 break; | 1427 break; |
1429 } | 1428 } |
(...skipping 27 matching lines...) Expand all Loading... |
1457 // allowed by the type of node? | 1456 // allowed by the type of node? |
1458 | 1457 |
1459 // BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a non-Text
node. | 1458 // BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a non-Text
node. |
1460 Node* startNonTextContainer = m_start.container(); | 1459 Node* startNonTextContainer = m_start.container(); |
1461 if (startNonTextContainer->nodeType() == Node::TEXT_NODE) | 1460 if (startNonTextContainer->nodeType() == Node::TEXT_NODE) |
1462 startNonTextContainer = startNonTextContainer->parentNode(); | 1461 startNonTextContainer = startNonTextContainer->parentNode(); |
1463 Node* endNonTextContainer = m_end.container(); | 1462 Node* endNonTextContainer = m_end.container(); |
1464 if (endNonTextContainer->nodeType() == Node::TEXT_NODE) | 1463 if (endNonTextContainer->nodeType() == Node::TEXT_NODE) |
1465 endNonTextContainer = endNonTextContainer->parentNode(); | 1464 endNonTextContainer = endNonTextContainer->parentNode(); |
1466 if (startNonTextContainer != endNonTextContainer) { | 1465 if (startNonTextContainer != endNonTextContainer) { |
1467 ec = RangeException::BAD_BOUNDARYPOINTS_ERR; | 1466 ec = INVALID_STATE_ERR; |
1468 return; | 1467 return; |
1469 } | 1468 } |
1470 | 1469 |
1471 ec = 0; | 1470 ec = 0; |
1472 while (Node* n = newParent->firstChild()) { | 1471 while (Node* n = newParent->firstChild()) { |
1473 toContainerNode(newParent.get())->removeChild(n, ec); | 1472 toContainerNode(newParent.get())->removeChild(n, ec); |
1474 if (ec) | 1473 if (ec) |
1475 return; | 1474 return; |
1476 } | 1475 } |
1477 RefPtr<DocumentFragment> fragment = extractContents(ec); | 1476 RefPtr<DocumentFragment> fragment = extractContents(ec); |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1967 | 1966 |
1968 void showTree(const WebCore::Range* range) | 1967 void showTree(const WebCore::Range* range) |
1969 { | 1968 { |
1970 if (range && range->boundaryPointsValid()) { | 1969 if (range && range->boundaryPointsValid()) { |
1971 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); | 1970 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); |
1972 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); | 1971 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); |
1973 } | 1972 } |
1974 } | 1973 } |
1975 | 1974 |
1976 #endif | 1975 #endif |
OLD | NEW |