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