| 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 21 matching lines...) Expand all Loading... |
| 32 #include "core/dom/NodeTraversal.h" | 32 #include "core/dom/NodeTraversal.h" |
| 33 #include "core/dom/Text.h" | 33 #include "core/dom/Text.h" |
| 34 #include "core/editing/EditingUtilities.h" | 34 #include "core/editing/EditingUtilities.h" |
| 35 #include "core/editing/FrameSelection.h" | 35 #include "core/editing/FrameSelection.h" |
| 36 #include "core/editing/Position.h" | 36 #include "core/editing/Position.h" |
| 37 #include "core/editing/PositionIterator.h" | 37 #include "core/editing/PositionIterator.h" |
| 38 #include "core/editing/RenderedPosition.h" | 38 #include "core/editing/RenderedPosition.h" |
| 39 #include "core/editing/TextAffinity.h" | 39 #include "core/editing/TextAffinity.h" |
| 40 #include "core/editing/VisiblePosition.h" | 40 #include "core/editing/VisiblePosition.h" |
| 41 #include "core/editing/iterators/BackwardsCharacterIterator.h" | 41 #include "core/editing/iterators/BackwardsCharacterIterator.h" |
| 42 #include "core/editing/iterators/BackwardsTextBuffer.h" |
| 42 #include "core/editing/iterators/CharacterIterator.h" | 43 #include "core/editing/iterators/CharacterIterator.h" |
| 43 #include "core/editing/iterators/ForwardsTextBuffer.h" | 44 #include "core/editing/iterators/ForwardsTextBuffer.h" |
| 44 #include "core/editing/iterators/SimplifiedBackwardsTextIterator.h" | 45 #include "core/editing/iterators/SimplifiedBackwardsTextIterator.h" |
| 45 #include "core/editing/iterators/TextIterator.h" | 46 #include "core/editing/iterators/TextIterator.h" |
| 46 #include "core/frame/LocalFrame.h" | 47 #include "core/frame/LocalFrame.h" |
| 47 #include "core/frame/Settings.h" | 48 #include "core/frame/Settings.h" |
| 48 #include "core/html/HTMLBRElement.h" | 49 #include "core/html/HTMLBRElement.h" |
| 49 #include "core/html/HTMLTextFormControlElement.h" | 50 #include "core/html/HTMLTextFormControlElement.h" |
| 50 #include "core/layout/HitTestRequest.h" | 51 #include "core/layout/HitTestRequest.h" |
| 51 #include "core/layout/HitTestResult.h" | 52 #include "core/layout/HitTestResult.h" |
| (...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 forwardsIterator.copyTextTo(&characters); | 679 forwardsIterator.copyTextTo(&characters); |
| 679 int i = endOfFirstWordBoundaryContext(characters.data(), characters.
size()); | 680 int i = endOfFirstWordBoundaryContext(characters.data(), characters.
size()); |
| 680 suffixString.pushRange(characters.data(), i); | 681 suffixString.pushRange(characters.data(), i); |
| 681 suffixLength += i; | 682 suffixLength += i; |
| 682 if (static_cast<unsigned>(i) < characters.size()) | 683 if (static_cast<unsigned>(i) < characters.size()) |
| 683 break; | 684 break; |
| 684 forwardsIterator.advance(); | 685 forwardsIterator.advance(); |
| 685 } | 686 } |
| 686 } | 687 } |
| 687 | 688 |
| 688 Vector<UChar, 1024> string; | 689 BackwardsTextBuffer string; |
| 689 string.append(suffixString.data(), suffixString.size()); | 690 string.pushRange(suffixString.data(), suffixString.size()); |
| 690 | 691 |
| 691 SimplifiedBackwardsTextIteratorAlgorithm<Strategy> it(start, end); | 692 SimplifiedBackwardsTextIteratorAlgorithm<Strategy> it(start, end); |
| 692 unsigned next = 0; | 693 unsigned next = 0; |
| 693 bool needMoreContext = false; | 694 bool needMoreContext = false; |
| 694 while (!it.atEnd()) { | 695 while (!it.atEnd()) { |
| 695 bool inTextSecurityMode = it.isInTextSecurityMode(); | 696 bool inTextSecurityMode = it.isInTextSecurityMode(); |
| 696 // iterate to get chunks until the searchFunction returns a non-zero | 697 // iterate to get chunks until the searchFunction returns a non-zero |
| 697 // value. | 698 // value. |
| 698 // TODO(xiaochengh): Iterative prepending has quadratic running time | |
| 699 // in the worst case. Should improve it to linear. | |
| 700 if (!inTextSecurityMode) { | 699 if (!inTextSecurityMode) { |
| 701 it.copyTextTo(string); | 700 it.copyTextTo(&string); |
| 702 } else { | 701 } else { |
| 703 // Treat bullets used in the text security mode as regular | 702 // Treat bullets used in the text security mode as regular |
| 704 // characters when looking for boundaries | 703 // characters when looking for boundaries |
| 705 Vector<UChar, 1024> iteratorString; | 704 string.pushCharacters('x', it.length()); |
| 706 iteratorString.fill('x', it.length()); | |
| 707 string.prepend(iteratorString.data(), iteratorString.size()); | |
| 708 } | 705 } |
| 709 // TODO(xiaochengh): The following line takes O(string.size()) time, | 706 // TODO(xiaochengh): The following line takes O(string.size()) time, |
| 710 // which makes the while loop take quadratic time in the worst case. | 707 // which makes the while loop take quadratic time in the worst case. |
| 711 // Should improve it in some way. | 708 // Should improve it in some way. |
| 712 next = searchFunction(string.data(), string.size(), string.size() - suff
ixLength, MayHaveMoreContext, needMoreContext); | 709 next = searchFunction(string.data(), string.size(), string.size() - suff
ixLength, MayHaveMoreContext, needMoreContext); |
| 713 if (next) | 710 if (next) |
| 714 break; | 711 break; |
| 715 it.advance(); | 712 it.advance(); |
| 716 } | 713 } |
| 717 if (needMoreContext) { | 714 if (needMoreContext) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 744 static VisiblePositionTemplate<Strategy> nextBoundary(const VisiblePositionTempl
ate<Strategy>& c, BoundarySearchFunction searchFunction) | 741 static VisiblePositionTemplate<Strategy> nextBoundary(const VisiblePositionTempl
ate<Strategy>& c, BoundarySearchFunction searchFunction) |
| 745 { | 742 { |
| 746 PositionTemplate<Strategy> pos = c.deepEquivalent(); | 743 PositionTemplate<Strategy> pos = c.deepEquivalent(); |
| 747 Node* boundary = parentEditingBoundary(pos); | 744 Node* boundary = parentEditingBoundary(pos); |
| 748 if (!boundary) | 745 if (!boundary) |
| 749 return VisiblePositionTemplate<Strategy>(); | 746 return VisiblePositionTemplate<Strategy>(); |
| 750 | 747 |
| 751 Document& d = boundary->document(); | 748 Document& d = boundary->document(); |
| 752 const PositionTemplate<Strategy> start(pos.parentAnchoredEquivalent()); | 749 const PositionTemplate<Strategy> start(pos.parentAnchoredEquivalent()); |
| 753 | 750 |
| 754 Vector<UChar, 1024> prefixString; | 751 BackwardsTextBuffer prefixString; |
| 755 unsigned prefixLength = 0; | 752 unsigned prefixLength = 0; |
| 756 | 753 |
| 757 if (requiresContextForWordBoundary(characterAfter(c))) { | 754 if (requiresContextForWordBoundary(characterAfter(c))) { |
| 758 SimplifiedBackwardsTextIteratorAlgorithm<Strategy> backwardsIterator(Pos
itionTemplate<Strategy>::firstPositionInNode(&d), start); | 755 SimplifiedBackwardsTextIteratorAlgorithm<Strategy> backwardsIterator(Pos
itionTemplate<Strategy>::firstPositionInNode(&d), start); |
| 759 while (!backwardsIterator.atEnd()) { | 756 while (!backwardsIterator.atEnd()) { |
| 760 // TODO(xiaochengh): Eliminate this intermediate buffer. | 757 // TODO(xiaochengh): Eliminate this intermediate buffer. |
| 761 Vector<UChar, 1024> characters; | 758 BackwardsTextBuffer characters; |
| 762 backwardsIterator.copyTextTo(characters); | 759 backwardsIterator.copyTextTo(&characters); |
| 763 int length = characters.size(); | 760 int length = characters.size(); |
| 764 int i = startOfLastWordBoundaryContext(characters.data(), length); | 761 int i = startOfLastWordBoundaryContext(characters.data(), length); |
| 765 // TODO(xiaochengh): Iterative prepending has quadratic running | 762 prefixString.pushRange(characters.data() + i, length - i); |
| 766 // time in the worst case. Should improve it to linear. | |
| 767 prefixString.prepend(characters.data() + i, length - i); | |
| 768 prefixLength += length - i; | 763 prefixLength += length - i; |
| 769 if (i > 0) | 764 if (i > 0) |
| 770 break; | 765 break; |
| 771 backwardsIterator.advance(); | 766 backwardsIterator.advance(); |
| 772 } | 767 } |
| 773 } | 768 } |
| 774 | 769 |
| 775 ForwardsTextBuffer string; | 770 ForwardsTextBuffer string; |
| 776 string.pushRange(prefixString.data(), prefixString.size()); | 771 string.pushRange(prefixString.data(), prefixString.size()); |
| 777 | 772 |
| (...skipping 2579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3357 { | 3352 { |
| 3358 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); | 3353 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); |
| 3359 } | 3354 } |
| 3360 | 3355 |
| 3361 VisiblePositionInComposedTree previousPositionOf(const VisiblePositionInComposed
Tree& visiblePosition, EditingBoundaryCrossingRule rule) | 3356 VisiblePositionInComposedTree previousPositionOf(const VisiblePositionInComposed
Tree& visiblePosition, EditingBoundaryCrossingRule rule) |
| 3362 { | 3357 { |
| 3363 return previousPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePos
ition, rule); | 3358 return previousPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePos
ition, rule); |
| 3364 } | 3359 } |
| 3365 | 3360 |
| 3366 } // namespace blink | 3361 } // namespace blink |
| OLD | NEW |