| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r
ights reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r
ights reserved. |
| 3 * Copyright (C) 2005 Alexey Proskuryakov. | 3 * Copyright (C) 2005 Alexey Proskuryakov. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 } | 168 } |
| 169 | 169 |
| 170 #endif | 170 #endif |
| 171 | 171 |
| 172 // This function is like Range::pastLastNode, except for the fact that it can cl
imb up out of shadow trees. | 172 // This function is like Range::pastLastNode, except for the fact that it can cl
imb up out of shadow trees. |
| 173 static Node* nextInPreOrderCrossingShadowBoundaries(Node* rangeEndContainer, int
rangeEndOffset) | 173 static Node* nextInPreOrderCrossingShadowBoundaries(Node* rangeEndContainer, int
rangeEndOffset) |
| 174 { | 174 { |
| 175 if (!rangeEndContainer) | 175 if (!rangeEndContainer) |
| 176 return 0; | 176 return 0; |
| 177 if (rangeEndOffset >= 0 && !rangeEndContainer->offsetInCharacters()) { | 177 if (rangeEndOffset >= 0 && !rangeEndContainer->offsetInCharacters()) { |
| 178 if (Node* next = rangeEndContainer->childNode(rangeEndOffset)) | 178 if (Node* next = rangeEndContainer->traverseToChildAt(rangeEndOffset)) |
| 179 return next; | 179 return next; |
| 180 } | 180 } |
| 181 for (Node* node = rangeEndContainer; node; node = node->parentOrShadowHostNo
de()) { | 181 for (Node* node = rangeEndContainer; node; node = node->parentOrShadowHostNo
de()) { |
| 182 if (Node* next = node->nextSibling()) | 182 if (Node* next = node->nextSibling()) |
| 183 return next; | 183 return next; |
| 184 } | 184 } |
| 185 return 0; | 185 return 0; |
| 186 } | 186 } |
| 187 | 187 |
| 188 // -------- | 188 // -------- |
| (...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1136 RefPtr<Range> textRange = range(); | 1136 RefPtr<Range> textRange = range(); |
| 1137 if (!textRange) | 1137 if (!textRange) |
| 1138 return 0; | 1138 return 0; |
| 1139 | 1139 |
| 1140 Node* node = textRange->startContainer(); | 1140 Node* node = textRange->startContainer(); |
| 1141 if (!node) | 1141 if (!node) |
| 1142 return 0; | 1142 return 0; |
| 1143 if (node->offsetInCharacters()) | 1143 if (node->offsetInCharacters()) |
| 1144 return node; | 1144 return node; |
| 1145 | 1145 |
| 1146 return node->childNode(textRange->startOffset()); | 1146 return node->traverseToChildAt(textRange->startOffset()); |
| 1147 } | 1147 } |
| 1148 | 1148 |
| 1149 // -------- | 1149 // -------- |
| 1150 | 1150 |
| 1151 SimplifiedBackwardsTextIterator::SimplifiedBackwardsTextIterator(const Range* r,
TextIteratorBehaviorFlags behavior) | 1151 SimplifiedBackwardsTextIterator::SimplifiedBackwardsTextIterator(const Range* r,
TextIteratorBehaviorFlags behavior) |
| 1152 : m_node(0) | 1152 : m_node(0) |
| 1153 , m_offset(0) | 1153 , m_offset(0) |
| 1154 , m_handledNode(false) | 1154 , m_handledNode(false) |
| 1155 , m_handledChildren(false) | 1155 , m_handledChildren(false) |
| 1156 , m_startNode(0) | 1156 , m_startNode(0) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1177 return; | 1177 return; |
| 1178 | 1178 |
| 1179 Node* startNode = r->startContainer(); | 1179 Node* startNode = r->startContainer(); |
| 1180 if (!startNode) | 1180 if (!startNode) |
| 1181 return; | 1181 return; |
| 1182 Node* endNode = r->endContainer(); | 1182 Node* endNode = r->endContainer(); |
| 1183 int startOffset = r->startOffset(); | 1183 int startOffset = r->startOffset(); |
| 1184 int endOffset = r->endOffset(); | 1184 int endOffset = r->endOffset(); |
| 1185 | 1185 |
| 1186 if (!startNode->offsetInCharacters() && startOffset >= 0) { | 1186 if (!startNode->offsetInCharacters() && startOffset >= 0) { |
| 1187 // childNode() will return 0 if the offset is out of range. We rely on t
his behavior | 1187 // traverseToChildAt() will return 0 if the offset is out of range. We r
ely on this behavior |
| 1188 // instead of calling childNodeCount() to avoid traversing the children
twice. | 1188 // instead of calling countChildren() to avoid traversing the children t
wice. |
| 1189 if (Node* childAtOffset = startNode->childNode(startOffset)) { | 1189 if (Node* childAtOffset = startNode->traverseToChildAt(startOffset)) { |
| 1190 startNode = childAtOffset; | 1190 startNode = childAtOffset; |
| 1191 startOffset = 0; | 1191 startOffset = 0; |
| 1192 } | 1192 } |
| 1193 } | 1193 } |
| 1194 if (!endNode->offsetInCharacters() && endOffset > 0) { | 1194 if (!endNode->offsetInCharacters() && endOffset > 0) { |
| 1195 // childNode() will return 0 if the offset is out of range. We rely on t
his behavior | 1195 // traverseToChildAt() will return 0 if the offset is out of range. We r
ely on this behavior |
| 1196 // instead of calling childNodeCount() to avoid traversing the children
twice. | 1196 // instead of calling countChildren() to avoid traversing the children t
wice. |
| 1197 if (Node* childAtOffset = endNode->childNode(endOffset - 1)) { | 1197 if (Node* childAtOffset = endNode->traverseToChildAt(endOffset - 1)) { |
| 1198 endNode = childAtOffset; | 1198 endNode = childAtOffset; |
| 1199 endOffset = lastOffsetInNode(endNode); | 1199 endOffset = lastOffsetInNode(endNode); |
| 1200 } | 1200 } |
| 1201 } | 1201 } |
| 1202 | 1202 |
| 1203 m_node = endNode; | 1203 m_node = endNode; |
| 1204 setUpFullyClippedStack(m_fullyClippedStack, m_node); | 1204 setUpFullyClippedStack(m_fullyClippedStack, m_node); |
| 1205 m_offset = endOffset; | 1205 m_offset = endOffset; |
| 1206 m_handledNode = false; | 1206 m_handledNode = false; |
| 1207 m_handledChildren = !endOffset; | 1207 m_handledChildren = !endOffset; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1250 } else if (renderer && (renderer->isImage() || renderer->isWidget())
) { | 1250 } else if (renderer && (renderer->isImage() || renderer->isWidget())
) { |
| 1251 if (renderer->style()->visibility() == VISIBLE && m_offset > 0) | 1251 if (renderer->style()->visibility() == VISIBLE && m_offset > 0) |
| 1252 m_handledNode = handleReplacedElement(); | 1252 m_handledNode = handleReplacedElement(); |
| 1253 } else { | 1253 } else { |
| 1254 m_handledNode = handleNonTextNode(); | 1254 m_handledNode = handleNonTextNode(); |
| 1255 } | 1255 } |
| 1256 if (m_positionNode) | 1256 if (m_positionNode) |
| 1257 return; | 1257 return; |
| 1258 } | 1258 } |
| 1259 | 1259 |
| 1260 if (!m_handledChildren && m_node->hasChildNodes()) { | 1260 if (!m_handledChildren && m_node->hasChildren()) { |
| 1261 m_node = m_node->lastChild(); | 1261 m_node = m_node->lastChild(); |
| 1262 pushFullyClippedState(m_fullyClippedStack, m_node); | 1262 pushFullyClippedState(m_fullyClippedStack, m_node); |
| 1263 } else { | 1263 } else { |
| 1264 // Exit empty containers as we pass over them or containers | 1264 // Exit empty containers as we pass over them or containers |
| 1265 // where [container, 0] is where we started iterating. | 1265 // where [container, 0] is where we started iterating. |
| 1266 if (!m_handledNode | 1266 if (!m_handledNode |
| 1267 && canHaveChildrenForEditing(m_node) | 1267 && canHaveChildrenForEditing(m_node) |
| 1268 && m_node->parentNode() | 1268 && m_node->parentNode() |
| 1269 && (!m_node->lastChild() || (m_node == m_endNode && !m_endOffset
))) { | 1269 && (!m_node->lastChild() || (m_node == m_endNode && !m_endOffset
))) { |
| 1270 exitNode(); | 1270 exitNode(); |
| (...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2081 if (!matchLength) | 2081 if (!matchLength) |
| 2082 return collapsedToBoundary(range, !(options & Backwards)); | 2082 return collapsedToBoundary(range, !(options & Backwards)); |
| 2083 } | 2083 } |
| 2084 | 2084 |
| 2085 // Then, find the document position of the start and the end of the text. | 2085 // Then, find the document position of the start and the end of the text. |
| 2086 CharacterIterator computeRangeIterator(range, TextIteratorEntersTextControls
| TextIteratorEntersAuthorShadowRoots); | 2086 CharacterIterator computeRangeIterator(range, TextIteratorEntersTextControls
| TextIteratorEntersAuthorShadowRoots); |
| 2087 return characterSubrange(computeRangeIterator, matchStart, matchLength); | 2087 return characterSubrange(computeRangeIterator, matchStart, matchLength); |
| 2088 } | 2088 } |
| 2089 | 2089 |
| 2090 } | 2090 } |
| OLD | NEW |