| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 | 477 |
| 478 searchRange->setStart(start.deprecatedNode(), start.deprecatedEditingOffset(
), ec); | 478 searchRange->setStart(start.deprecatedNode(), start.deprecatedEditingOffset(
), ec); |
| 479 searchRange->setEnd(end.deprecatedNode(), end.deprecatedEditingOffset(), ec)
; | 479 searchRange->setEnd(end.deprecatedNode(), end.deprecatedEditingOffset(), ec)
; |
| 480 | 480 |
| 481 ASSERT(!ec); | 481 ASSERT(!ec); |
| 482 if (ec) | 482 if (ec) |
| 483 return VisiblePosition(); | 483 return VisiblePosition(); |
| 484 | 484 |
| 485 SimplifiedBackwardsTextIterator it(searchRange.get()); | 485 SimplifiedBackwardsTextIterator it(searchRange.get()); |
| 486 unsigned next = 0; | 486 unsigned next = 0; |
| 487 bool inTextSecurityMode = start.deprecatedNode() && start.deprecatedNode()->
renderer() && start.deprecatedNode()->renderer()->style()->textSecurity() != TSN
ONE; | 487 bool inTextSecurityMode = start.deprecatedNode() && start.renderer() && star
t.renderer()->style()->textSecurity() != TSNONE; |
| 488 bool needMoreContext = false; | 488 bool needMoreContext = false; |
| 489 while (!it.atEnd()) { | 489 while (!it.atEnd()) { |
| 490 // iterate to get chunks until the searchFunction returns a non-zero val
ue. | 490 // iterate to get chunks until the searchFunction returns a non-zero val
ue. |
| 491 if (!inTextSecurityMode) | 491 if (!inTextSecurityMode) |
| 492 it.prependTextTo(string); | 492 it.prependTextTo(string); |
| 493 else { | 493 else { |
| 494 // Treat bullets used in the text security mode as regular character
s when looking for boundaries | 494 // Treat bullets used in the text security mode as regular character
s when looking for boundaries |
| 495 Vector<UChar, 1024> iteratorString; | 495 Vector<UChar, 1024> iteratorString; |
| 496 iteratorString.fill('x', it.length()); | 496 iteratorString.fill('x', it.length()); |
| 497 string.prepend(iteratorString.data(), iteratorString.size()); | 497 string.prepend(iteratorString.data(), iteratorString.size()); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 if (i > 0) | 551 if (i > 0) |
| 552 break; | 552 break; |
| 553 backwardsIterator.advance(); | 553 backwardsIterator.advance(); |
| 554 } | 554 } |
| 555 } | 555 } |
| 556 | 556 |
| 557 searchRange->selectNodeContents(boundary, IGNORE_EXCEPTION); | 557 searchRange->selectNodeContents(boundary, IGNORE_EXCEPTION); |
| 558 searchRange->setStart(start.deprecatedNode(), start.deprecatedEditingOffset(
), IGNORE_EXCEPTION); | 558 searchRange->setStart(start.deprecatedNode(), start.deprecatedEditingOffset(
), IGNORE_EXCEPTION); |
| 559 TextIterator it(searchRange.get(), TextIteratorEmitsCharactersBetweenAllVisi
blePositions); | 559 TextIterator it(searchRange.get(), TextIteratorEmitsCharactersBetweenAllVisi
blePositions); |
| 560 unsigned next = 0; | 560 unsigned next = 0; |
| 561 bool inTextSecurityMode = start.deprecatedNode() && start.deprecatedNode()->
renderer() && start.deprecatedNode()->renderer()->style()->textSecurity() != TSN
ONE; | 561 bool inTextSecurityMode = start.deprecatedNode() && start.renderer() && star
t.renderer()->style()->textSecurity() != TSNONE; |
| 562 bool needMoreContext = false; | 562 bool needMoreContext = false; |
| 563 while (!it.atEnd()) { | 563 while (!it.atEnd()) { |
| 564 // Keep asking the iterator for chunks until the search function | 564 // Keep asking the iterator for chunks until the search function |
| 565 // returns an end value not equal to the length of the string passed to
it. | 565 // returns an end value not equal to the length of the string passed to
it. |
| 566 if (!inTextSecurityMode) | 566 if (!inTextSecurityMode) |
| 567 it.appendTextTo(string); | 567 it.appendTextTo(string); |
| 568 else { | 568 else { |
| 569 // Treat bullets used in the text security mode as regular character
s when looking for boundaries | 569 // Treat bullets used in the text security mode as regular character
s when looking for boundaries |
| 570 Vector<UChar, 1024> iteratorString; | 570 Vector<UChar, 1024> iteratorString; |
| 571 iteratorString.fill('x', it.length()); | 571 iteratorString.fill('x', it.length()); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 static VisiblePosition startPositionForLine(const VisiblePosition& c, LineEndpoi
ntComputationMode mode) | 711 static VisiblePosition startPositionForLine(const VisiblePosition& c, LineEndpoi
ntComputationMode mode) |
| 712 { | 712 { |
| 713 if (c.isNull()) | 713 if (c.isNull()) |
| 714 return VisiblePosition(); | 714 return VisiblePosition(); |
| 715 | 715 |
| 716 RootInlineBox* rootBox = RenderedPosition(c).rootBox(); | 716 RootInlineBox* rootBox = RenderedPosition(c).rootBox(); |
| 717 if (!rootBox) { | 717 if (!rootBox) { |
| 718 // There are VisiblePositions at offset 0 in blocks without | 718 // There are VisiblePositions at offset 0 in blocks without |
| 719 // RootInlineBoxes, like empty editable blocks and bordered blocks. | 719 // RootInlineBoxes, like empty editable blocks and bordered blocks. |
| 720 Position p = c.deepEquivalent(); | 720 Position p = c.deepEquivalent(); |
| 721 if (p.deprecatedNode()->renderer() && p.deprecatedNode()->renderer()->is
RenderBlock() && !p.deprecatedEditingOffset()) | 721 if (p.renderer() && p.renderer()->isRenderBlock() && !p.deprecatedEditin
gOffset()) |
| 722 return c; | 722 return c; |
| 723 | 723 |
| 724 return VisiblePosition(); | 724 return VisiblePosition(); |
| 725 } | 725 } |
| 726 | 726 |
| 727 Node* startNode; | 727 Node* startNode; |
| 728 InlineBox* startBox; | 728 InlineBox* startBox; |
| 729 if (mode == UseLogicalOrdering) { | 729 if (mode == UseLogicalOrdering) { |
| 730 startNode = rootBox->getLogicalStartBoxWithNode(startBox); | 730 startNode = rootBox->getLogicalStartBoxWithNode(startBox); |
| 731 if (!startNode) | 731 if (!startNode) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 784 static VisiblePosition endPositionForLine(const VisiblePosition& c, LineEndpoint
ComputationMode mode) | 784 static VisiblePosition endPositionForLine(const VisiblePosition& c, LineEndpoint
ComputationMode mode) |
| 785 { | 785 { |
| 786 if (c.isNull()) | 786 if (c.isNull()) |
| 787 return VisiblePosition(); | 787 return VisiblePosition(); |
| 788 | 788 |
| 789 RootInlineBox* rootBox = RenderedPosition(c).rootBox(); | 789 RootInlineBox* rootBox = RenderedPosition(c).rootBox(); |
| 790 if (!rootBox) { | 790 if (!rootBox) { |
| 791 // There are VisiblePositions at offset 0 in blocks without | 791 // There are VisiblePositions at offset 0 in blocks without |
| 792 // RootInlineBoxes, like empty editable blocks and bordered blocks. | 792 // RootInlineBoxes, like empty editable blocks and bordered blocks. |
| 793 Position p = c.deepEquivalent(); | 793 Position p = c.deepEquivalent(); |
| 794 if (p.deprecatedNode()->renderer() && p.deprecatedNode()->renderer()->is
RenderBlock() && !p.deprecatedEditingOffset()) | 794 if (p.renderer() && p.renderer()->isRenderBlock() && !p.deprecatedEditin
gOffset()) |
| 795 return c; | 795 return c; |
| 796 return VisiblePosition(); | 796 return VisiblePosition(); |
| 797 } | 797 } |
| 798 | 798 |
| 799 Node* endNode; | 799 Node* endNode; |
| 800 InlineBox* endBox; | 800 InlineBox* endBox; |
| 801 if (mode == UseLogicalOrdering) { | 801 if (mode == UseLogicalOrdering) { |
| 802 endNode = rootBox->getLogicalEndBoxWithNode(endBox); | 802 endNode = rootBox->getLogicalEndBoxWithNode(endBox); |
| 803 if (!endNode) | 803 if (!endNode) |
| 804 return VisiblePosition(); | 804 return VisiblePosition(); |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1128 if (style->visibility() != VISIBLE) { | 1128 if (style->visibility() != VISIBLE) { |
| 1129 n = NodeTraversal::previousPostOrder(n, startBlock); | 1129 n = NodeTraversal::previousPostOrder(n, startBlock); |
| 1130 continue; | 1130 continue; |
| 1131 } | 1131 } |
| 1132 | 1132 |
| 1133 if (r->isBR() || isBlock(n)) | 1133 if (r->isBR() || isBlock(n)) |
| 1134 break; | 1134 break; |
| 1135 | 1135 |
| 1136 if (r->isText() && toRenderText(r)->renderedTextLength()) { | 1136 if (r->isText() && toRenderText(r)->renderedTextLength()) { |
| 1137 ASSERT_WITH_SECURITY_IMPLICATION(n->isTextNode()); | 1137 ASSERT_WITH_SECURITY_IMPLICATION(n->isTextNode()); |
| 1138 RenderText* text = toRenderText(r); |
| 1138 type = Position::PositionIsOffsetInAnchor; | 1139 type = Position::PositionIsOffsetInAnchor; |
| 1139 if (style->preserveNewline()) { | 1140 if (style->preserveNewline()) { |
| 1140 RenderText* text = toRenderText(r); | |
| 1141 int i = text->textLength(); | 1141 int i = text->textLength(); |
| 1142 int o = offset; | 1142 int o = offset; |
| 1143 if (n == startNode && o < i) | 1143 if (n == startNode && o < i) |
| 1144 i = max(0, o); | 1144 i = max(0, o); |
| 1145 while (--i >= 0) { | 1145 while (--i >= 0) { |
| 1146 if ((*text)[i] == '\n') | 1146 if ((*text)[i] == '\n') |
| 1147 return VisiblePosition(Position(toText(n), i + 1), DOWNS
TREAM); | 1147 return VisiblePosition(Position(toText(n), i + text->tex
tStartOffset() + 1), DOWNSTREAM); |
| 1148 } | 1148 } |
| 1149 } | 1149 } |
| 1150 node = n; | 1150 node = n; |
| 1151 offset = 0; | 1151 offset = 0; |
| 1152 n = NodeTraversal::previousPostOrder(n, startBlock); | 1152 n = NodeTraversal::previousPostOrder(n, startBlock); |
| 1153 } else if (editingIgnoresContent(n) || isTableElement(n)) { | 1153 } else if (editingIgnoresContent(n) || isTableElement(n)) { |
| 1154 node = n; | 1154 node = n; |
| 1155 type = Position::PositionIsBeforeAnchor; | 1155 type = Position::PositionIsBeforeAnchor; |
| 1156 n = n->previousSibling() ? n->previousSibling() : NodeTraversal::pre
viousPostOrder(n, startBlock); | 1156 n = n->previousSibling() ? n->previousSibling() : NodeTraversal::pre
viousPostOrder(n, startBlock); |
| 1157 } else | 1157 } else |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 n = NodeTraversal::next(n, stayInsideBlock); | 1210 n = NodeTraversal::next(n, stayInsideBlock); |
| 1211 continue; | 1211 continue; |
| 1212 } | 1212 } |
| 1213 | 1213 |
| 1214 if (r->isBR() || isBlock(n)) | 1214 if (r->isBR() || isBlock(n)) |
| 1215 break; | 1215 break; |
| 1216 | 1216 |
| 1217 // FIXME: We avoid returning a position where the renderer can't accept
the caret. | 1217 // FIXME: We avoid returning a position where the renderer can't accept
the caret. |
| 1218 if (r->isText() && toRenderText(r)->renderedTextLength()) { | 1218 if (r->isText() && toRenderText(r)->renderedTextLength()) { |
| 1219 ASSERT_WITH_SECURITY_IMPLICATION(n->isTextNode()); | 1219 ASSERT_WITH_SECURITY_IMPLICATION(n->isTextNode()); |
| 1220 int length = toRenderText(r)->textLength(); | 1220 RenderText* text = toRenderText(r); |
| 1221 int length = text->textLength(); |
| 1221 type = Position::PositionIsOffsetInAnchor; | 1222 type = Position::PositionIsOffsetInAnchor; |
| 1222 if (style->preserveNewline()) { | 1223 if (style->preserveNewline()) { |
| 1223 RenderText* text = toRenderText(r); | |
| 1224 int o = n == startNode ? offset : 0; | 1224 int o = n == startNode ? offset : 0; |
| 1225 for (int i = o; i < length; ++i) { | 1225 for (int i = o; i < length; ++i) { |
| 1226 if ((*text)[i] == '\n') | 1226 if ((*text)[i] == '\n') |
| 1227 return VisiblePosition(Position(toText(n), i), DOWNSTREA
M); | 1227 return VisiblePosition(Position(toText(n), i + text->tex
tStartOffset()), DOWNSTREAM); |
| 1228 } | 1228 } |
| 1229 } | 1229 } |
| 1230 node = n; | 1230 node = n; |
| 1231 offset = r->caretMaxOffset(); | 1231 offset = r->caretMaxOffset() + text->textStartOffset(); |
| 1232 n = NodeTraversal::next(n, stayInsideBlock); | 1232 n = NodeTraversal::next(n, stayInsideBlock); |
| 1233 } else if (editingIgnoresContent(n) || isTableElement(n)) { | 1233 } else if (editingIgnoresContent(n) || isTableElement(n)) { |
| 1234 node = n; | 1234 node = n; |
| 1235 type = Position::PositionIsAfterAnchor; | 1235 type = Position::PositionIsAfterAnchor; |
| 1236 n = NodeTraversal::nextSkippingChildren(n, stayInsideBlock); | 1236 n = NodeTraversal::nextSkippingChildren(n, stayInsideBlock); |
| 1237 } else | 1237 } else |
| 1238 n = NodeTraversal::next(n, stayInsideBlock); | 1238 n = NodeTraversal::next(n, stayInsideBlock); |
| 1239 } | 1239 } |
| 1240 | 1240 |
| 1241 if (type == Position::PositionIsOffsetInAnchor) | 1241 if (type == Position::PositionIsOffsetInAnchor) |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1412 { | 1412 { |
| 1413 return direction == LTR ? logicalStartOfLine(c) : logicalEndOfLine(c); | 1413 return direction == LTR ? logicalStartOfLine(c) : logicalEndOfLine(c); |
| 1414 } | 1414 } |
| 1415 | 1415 |
| 1416 VisiblePosition rightBoundaryOfLine(const VisiblePosition& c, TextDirection dire
ction) | 1416 VisiblePosition rightBoundaryOfLine(const VisiblePosition& c, TextDirection dire
ction) |
| 1417 { | 1417 { |
| 1418 return direction == LTR ? logicalEndOfLine(c) : logicalStartOfLine(c); | 1418 return direction == LTR ? logicalEndOfLine(c) : logicalStartOfLine(c); |
| 1419 } | 1419 } |
| 1420 | 1420 |
| 1421 } | 1421 } |
| OLD | NEW |