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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 #include "core/frame/Settings.h" | 46 #include "core/frame/Settings.h" |
47 #include "core/html/HTMLBRElement.h" | 47 #include "core/html/HTMLBRElement.h" |
48 #include "core/html/HTMLTextFormControlElement.h" | 48 #include "core/html/HTMLTextFormControlElement.h" |
49 #include "core/layout/HitTestRequest.h" | 49 #include "core/layout/HitTestRequest.h" |
50 #include "core/layout/HitTestResult.h" | 50 #include "core/layout/HitTestResult.h" |
51 #include "core/layout/LayoutBlockFlow.h" | 51 #include "core/layout/LayoutBlockFlow.h" |
52 #include "core/layout/LayoutInline.h" | 52 #include "core/layout/LayoutInline.h" |
53 #include "core/layout/LayoutObject.h" | 53 #include "core/layout/LayoutObject.h" |
54 #include "core/layout/LayoutTextFragment.h" | 54 #include "core/layout/LayoutTextFragment.h" |
55 #include "core/layout/LayoutView.h" | 55 #include "core/layout/LayoutView.h" |
| 56 #include "core/layout/api/LineLayoutAPIShim.h" |
56 #include "core/layout/api/LineLayoutItem.h" | 57 #include "core/layout/api/LineLayoutItem.h" |
57 #include "core/layout/line/InlineIterator.h" | 58 #include "core/layout/line/InlineIterator.h" |
58 #include "core/layout/line/InlineTextBox.h" | 59 #include "core/layout/line/InlineTextBox.h" |
59 #include "core/paint/LineLayoutPaintShim.h" | |
60 #include "core/paint/PaintLayer.h" | 60 #include "core/paint/PaintLayer.h" |
61 #include "platform/Logging.h" | 61 #include "platform/Logging.h" |
62 #include "platform/RuntimeEnabledFeatures.h" | 62 #include "platform/RuntimeEnabledFeatures.h" |
63 #include "platform/heap/Handle.h" | 63 #include "platform/heap/Handle.h" |
64 #include "platform/text/TextBoundaries.h" | 64 #include "platform/text/TextBoundaries.h" |
65 | 65 |
66 namespace blink { | 66 namespace blink { |
67 | 67 |
68 template <typename PositionType> | 68 template <typename PositionType> |
69 static PositionType canonicalizeCandidate(const PositionType& candidate) | 69 static PositionType canonicalizeCandidate(const PositionType& candidate) |
(...skipping 2047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2117 } | 2117 } |
2118 Node* node = position.position().anchorNode(); | 2118 Node* node = position.position().anchorNode(); |
2119 | 2119 |
2120 layoutObject = node->layoutObject(); | 2120 layoutObject = node->layoutObject(); |
2121 if (!layoutObject) | 2121 if (!layoutObject) |
2122 return LayoutRect(); | 2122 return LayoutRect(); |
2123 | 2123 |
2124 InlineBoxPosition boxPosition = computeInlineBoxPosition(position.position()
, position.affinity()); | 2124 InlineBoxPosition boxPosition = computeInlineBoxPosition(position.position()
, position.affinity()); |
2125 | 2125 |
2126 if (boxPosition.inlineBox) | 2126 if (boxPosition.inlineBox) |
2127 layoutObject = LineLayoutPaintShim::layoutObjectFrom(boxPosition.inlineB
ox->lineLayoutItem()); | 2127 layoutObject = LineLayoutAPIShim::layoutObjectFrom(boxPosition.inlineBox
->lineLayoutItem()); |
2128 | 2128 |
2129 return layoutObject->localCaretRect(boxPosition.inlineBox, boxPosition.offse
tInBox); | 2129 return layoutObject->localCaretRect(boxPosition.inlineBox, boxPosition.offse
tInBox); |
2130 } | 2130 } |
2131 | 2131 |
2132 LayoutRect localCaretRectOfPosition(const PositionWithAffinity& position, Layout
Object*& layoutObject) | 2132 LayoutRect localCaretRectOfPosition(const PositionWithAffinity& position, Layout
Object*& layoutObject) |
2133 { | 2133 { |
2134 return localCaretRectOfPositionTemplate<EditingStrategy>(position, layoutObj
ect); | 2134 return localCaretRectOfPositionTemplate<EditingStrategy>(position, layoutObj
ect); |
2135 } | 2135 } |
2136 | 2136 |
2137 LayoutRect localCaretRectOfPosition(const PositionInComposedTreeWithAffinity& po
sition, LayoutObject*& layoutObject) | 2137 LayoutRect localCaretRectOfPosition(const PositionInComposedTreeWithAffinity& po
sition, LayoutObject*& layoutObject) |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2529 | 2529 |
2530 // The text continues on the next line only if the last text box
is not on this line and | 2530 // The text continues on the next line only if the last text box
is not on this line and |
2531 // none of the boxes on this line have a larger start offset. | 2531 // none of the boxes on this line have a larger start offset. |
2532 | 2532 |
2533 bool continuesOnNextLine = true; | 2533 bool continuesOnNextLine = true; |
2534 InlineBox* otherBox = box; | 2534 InlineBox* otherBox = box; |
2535 while (continuesOnNextLine) { | 2535 while (continuesOnNextLine) { |
2536 otherBox = otherBox->nextLeafChild(); | 2536 otherBox = otherBox->nextLeafChild(); |
2537 if (!otherBox) | 2537 if (!otherBox) |
2538 break; | 2538 break; |
2539 if (otherBox == lastTextBox || (LineLayoutPaintShim::layoutO
bjectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(oth
erBox)->start() > textOffset)) | 2539 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(other
Box)->start() > textOffset)) |
2540 continuesOnNextLine = false; | 2540 continuesOnNextLine = false; |
2541 } | 2541 } |
2542 | 2542 |
2543 otherBox = box; | 2543 otherBox = box; |
2544 while (continuesOnNextLine) { | 2544 while (continuesOnNextLine) { |
2545 otherBox = otherBox->prevLeafChild(); | 2545 otherBox = otherBox->prevLeafChild(); |
2546 if (!otherBox) | 2546 if (!otherBox) |
2547 break; | 2547 break; |
2548 if (otherBox == lastTextBox || (LineLayoutPaintShim::layoutO
bjectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(oth
erBox)->start() > textOffset)) | 2548 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(other
Box)->start() > textOffset)) |
2549 continuesOnNextLine = false; | 2549 continuesOnNextLine = false; |
2550 } | 2550 } |
2551 | 2551 |
2552 if (continuesOnNextLine) | 2552 if (continuesOnNextLine) |
2553 return currentPos.computePosition(); | 2553 return currentPos.computePosition(); |
2554 } | 2554 } |
2555 } | 2555 } |
2556 } | 2556 } |
2557 return lastVisible.deprecatedComputePosition(); | 2557 return lastVisible.deprecatedComputePosition(); |
2558 } | 2558 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2660 | 2660 |
2661 // The text continues on the next line only if the last text box
is not on this line and | 2661 // The text continues on the next line only if the last text box
is not on this line and |
2662 // none of the boxes on this line have a larger start offset. | 2662 // none of the boxes on this line have a larger start offset. |
2663 | 2663 |
2664 bool continuesOnNextLine = true; | 2664 bool continuesOnNextLine = true; |
2665 InlineBox* otherBox = box; | 2665 InlineBox* otherBox = box; |
2666 while (continuesOnNextLine) { | 2666 while (continuesOnNextLine) { |
2667 otherBox = otherBox->nextLeafChild(); | 2667 otherBox = otherBox->nextLeafChild(); |
2668 if (!otherBox) | 2668 if (!otherBox) |
2669 break; | 2669 break; |
2670 if (otherBox == lastTextBox || (LineLayoutPaintShim::layoutO
bjectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(oth
erBox)->start() >= textOffset)) | 2670 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(other
Box)->start() >= textOffset)) |
2671 continuesOnNextLine = false; | 2671 continuesOnNextLine = false; |
2672 } | 2672 } |
2673 | 2673 |
2674 otherBox = box; | 2674 otherBox = box; |
2675 while (continuesOnNextLine) { | 2675 while (continuesOnNextLine) { |
2676 otherBox = otherBox->prevLeafChild(); | 2676 otherBox = otherBox->prevLeafChild(); |
2677 if (!otherBox) | 2677 if (!otherBox) |
2678 break; | 2678 break; |
2679 if (otherBox == lastTextBox || (LineLayoutPaintShim::layoutO
bjectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(oth
erBox)->start() >= textOffset)) | 2679 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(other
Box)->start() >= textOffset)) |
2680 continuesOnNextLine = false; | 2680 continuesOnNextLine = false; |
2681 } | 2681 } |
2682 | 2682 |
2683 if (continuesOnNextLine) | 2683 if (continuesOnNextLine) |
2684 return currentPos.computePosition(); | 2684 return currentPos.computePosition(); |
2685 } | 2685 } |
2686 } | 2686 } |
2687 } | 2687 } |
2688 | 2688 |
2689 return lastVisible.deprecatedComputePosition(); | 2689 return lastVisible.deprecatedComputePosition(); |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3077 TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode()); | 3077 TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode()); |
3078 const TextAffinity affinity = visiblePosition.affinity(); | 3078 const TextAffinity affinity = visiblePosition.affinity(); |
3079 | 3079 |
3080 while (true) { | 3080 while (true) { |
3081 InlineBoxPosition boxPosition = computeInlineBoxPosition(p, affinity, pr
imaryDirection); | 3081 InlineBoxPosition boxPosition = computeInlineBoxPosition(p, affinity, pr
imaryDirection); |
3082 InlineBox* box = boxPosition.inlineBox; | 3082 InlineBox* box = boxPosition.inlineBox; |
3083 int offset = boxPosition.offsetInBox; | 3083 int offset = boxPosition.offsetInBox; |
3084 if (!box) | 3084 if (!box) |
3085 return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepP
osition) : previousVisuallyDistinctCandidate(deepPosition); | 3085 return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepP
osition) : previousVisuallyDistinctCandidate(deepPosition); |
3086 | 3086 |
3087 LayoutObject* layoutObject = LineLayoutPaintShim::layoutObjectFrom(box->
lineLayoutItem()); | 3087 LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->li
neLayoutItem()); |
3088 | 3088 |
3089 while (true) { | 3089 while (true) { |
3090 if ((layoutObject->isAtomicInlineLevel() || layoutObject->isBR()) &&
offset == box->caretLeftmostOffset()) | 3090 if ((layoutObject->isAtomicInlineLevel() || layoutObject->isBR()) &&
offset == box->caretLeftmostOffset()) |
3091 return box->isLeftToRightDirection() ? nextVisuallyDistinctCandi
date(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); | 3091 return box->isLeftToRightDirection() ? nextVisuallyDistinctCandi
date(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); |
3092 | 3092 |
3093 if (!layoutObject->node()) { | 3093 if (!layoutObject->node()) { |
3094 box = box->nextLeafChild(); | 3094 box = box->nextLeafChild(); |
3095 if (!box) | 3095 if (!box) |
3096 return primaryDirection == LTR ? nextVisuallyDistinctCandida
te(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); | 3096 return primaryDirection == LTR ? nextVisuallyDistinctCandida
te(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); |
3097 layoutObject = LineLayoutPaintShim::layoutObjectFrom(box->lineLa
youtItem()); | 3097 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); |
3098 offset = box->caretLeftmostOffset(); | 3098 offset = box->caretLeftmostOffset(); |
3099 continue; | 3099 continue; |
3100 } | 3100 } |
3101 | 3101 |
3102 offset = box->isLeftToRightDirection() ? layoutObject->nextOffset(of
fset) : layoutObject->previousOffset(offset); | 3102 offset = box->isLeftToRightDirection() ? layoutObject->nextOffset(of
fset) : layoutObject->previousOffset(offset); |
3103 | 3103 |
3104 int caretMinOffset = box->caretMinOffset(); | 3104 int caretMinOffset = box->caretMinOffset(); |
3105 int caretMaxOffset = box->caretMaxOffset(); | 3105 int caretMaxOffset = box->caretMaxOffset(); |
3106 | 3106 |
3107 if (offset > caretMinOffset && offset < caretMaxOffset) | 3107 if (offset > caretMinOffset && offset < caretMaxOffset) |
3108 break; | 3108 break; |
3109 | 3109 |
3110 if (box->isLeftToRightDirection() ? offset > caretMaxOffset : offset
< caretMinOffset) { | 3110 if (box->isLeftToRightDirection() ? offset > caretMaxOffset : offset
< caretMinOffset) { |
3111 // Overshot to the right. | 3111 // Overshot to the right. |
3112 InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak(); | 3112 InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak(); |
3113 if (!nextBox) { | 3113 if (!nextBox) { |
3114 PositionTemplate<Strategy> positionOnRight = primaryDirectio
n == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinc
tCandidate(deepPosition); | 3114 PositionTemplate<Strategy> positionOnRight = primaryDirectio
n == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinc
tCandidate(deepPosition); |
3115 if (positionOnRight.isNull()) | 3115 if (positionOnRight.isNull()) |
3116 return PositionTemplate<Strategy>(); | 3116 return PositionTemplate<Strategy>(); |
3117 | 3117 |
3118 InlineBox* boxOnRight = computeInlineBoxPosition(positionOnR
ight, affinity, primaryDirection).inlineBox; | 3118 InlineBox* boxOnRight = computeInlineBoxPosition(positionOnR
ight, affinity, primaryDirection).inlineBox; |
3119 if (boxOnRight && boxOnRight->root() == box->root()) | 3119 if (boxOnRight && boxOnRight->root() == box->root()) |
3120 return PositionTemplate<Strategy>(); | 3120 return PositionTemplate<Strategy>(); |
3121 return positionOnRight; | 3121 return positionOnRight; |
3122 } | 3122 } |
3123 | 3123 |
3124 // Reposition at the other logical position corresponding to our | 3124 // Reposition at the other logical position corresponding to our |
3125 // edge's visual position and go for another round. | 3125 // edge's visual position and go for another round. |
3126 box = nextBox; | 3126 box = nextBox; |
3127 layoutObject = LineLayoutPaintShim::layoutObjectFrom(box->lineLa
youtItem()); | 3127 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); |
3128 offset = nextBox->caretLeftmostOffset(); | 3128 offset = nextBox->caretLeftmostOffset(); |
3129 continue; | 3129 continue; |
3130 } | 3130 } |
3131 | 3131 |
3132 ASSERT(offset == box->caretRightmostOffset()); | 3132 ASSERT(offset == box->caretRightmostOffset()); |
3133 | 3133 |
3134 unsigned char level = box->bidiLevel(); | 3134 unsigned char level = box->bidiLevel(); |
3135 InlineBox* nextBox = box->nextLeafChild(); | 3135 InlineBox* nextBox = box->nextLeafChild(); |
3136 | 3136 |
3137 if (box->direction() == primaryDirection) { | 3137 if (box->direction() == primaryDirection) { |
3138 if (!nextBox) { | 3138 if (!nextBox) { |
3139 InlineBox* logicalEnd = 0; | 3139 InlineBox* logicalEnd = 0; |
3140 if (primaryDirection == LTR ? box->root().getLogicalEndBoxWi
thNode(logicalEnd) : box->root().getLogicalStartBoxWithNode(logicalEnd)) { | 3140 if (primaryDirection == LTR ? box->root().getLogicalEndBoxWi
thNode(logicalEnd) : box->root().getLogicalStartBoxWithNode(logicalEnd)) { |
3141 box = logicalEnd; | 3141 box = logicalEnd; |
3142 layoutObject = LineLayoutPaintShim::layoutObjectFrom(box
->lineLayoutItem()); | 3142 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->
lineLayoutItem()); |
3143 offset = primaryDirection == LTR ? box->caretMaxOffset()
: box->caretMinOffset(); | 3143 offset = primaryDirection == LTR ? box->caretMaxOffset()
: box->caretMinOffset(); |
3144 } | 3144 } |
3145 break; | 3145 break; |
3146 } | 3146 } |
3147 | 3147 |
3148 if (nextBox->bidiLevel() >= level) | 3148 if (nextBox->bidiLevel() >= level) |
3149 break; | 3149 break; |
3150 | 3150 |
3151 level = nextBox->bidiLevel(); | 3151 level = nextBox->bidiLevel(); |
3152 | 3152 |
3153 InlineBox* prevBox = box; | 3153 InlineBox* prevBox = box; |
3154 do { | 3154 do { |
3155 prevBox = prevBox->prevLeafChild(); | 3155 prevBox = prevBox->prevLeafChild(); |
3156 } while (prevBox && prevBox->bidiLevel() > level); | 3156 } while (prevBox && prevBox->bidiLevel() > level); |
3157 | 3157 |
3158 // For example, abc FED 123 ^ CBA | 3158 // For example, abc FED 123 ^ CBA |
3159 if (prevBox && prevBox->bidiLevel() == level) | 3159 if (prevBox && prevBox->bidiLevel() == level) |
3160 break; | 3160 break; |
3161 | 3161 |
3162 // For example, abc 123 ^ CBA or 123 ^ CBA abc | 3162 // For example, abc 123 ^ CBA or 123 ^ CBA abc |
3163 box = nextBox; | 3163 box = nextBox; |
3164 layoutObject = LineLayoutPaintShim::layoutObjectFrom(box->lineLa
youtItem()); | 3164 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); |
3165 offset = box->caretLeftmostOffset(); | 3165 offset = box->caretLeftmostOffset(); |
3166 if (box->direction() == primaryDirection) | 3166 if (box->direction() == primaryDirection) |
3167 break; | 3167 break; |
3168 continue; | 3168 continue; |
3169 } | 3169 } |
3170 | 3170 |
3171 while (nextBox && !nextBox->lineLayoutItem().node()) | 3171 while (nextBox && !nextBox->lineLayoutItem().node()) |
3172 nextBox = nextBox->nextLeafChild(); | 3172 nextBox = nextBox->nextLeafChild(); |
3173 | 3173 |
3174 if (nextBox) { | 3174 if (nextBox) { |
3175 box = nextBox; | 3175 box = nextBox; |
3176 layoutObject = LineLayoutPaintShim::layoutObjectFrom(box->lineLa
youtItem()); | 3176 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); |
3177 offset = box->caretLeftmostOffset(); | 3177 offset = box->caretLeftmostOffset(); |
3178 | 3178 |
3179 if (box->bidiLevel() > level) { | 3179 if (box->bidiLevel() > level) { |
3180 do { | 3180 do { |
3181 nextBox = nextBox->nextLeafChild(); | 3181 nextBox = nextBox->nextLeafChild(); |
3182 } while (nextBox && nextBox->bidiLevel() > level); | 3182 } while (nextBox && nextBox->bidiLevel() > level); |
3183 | 3183 |
3184 if (!nextBox || nextBox->bidiLevel() < level) | 3184 if (!nextBox || nextBox->bidiLevel() < level) |
3185 continue; | 3185 continue; |
3186 } | 3186 } |
(...skipping 10 matching lines...) Expand all Loading... |
3197 level = box->bidiLevel(); | 3197 level = box->bidiLevel(); |
3198 while (InlineBox* nextBox = box->nextLeafChild()) { | 3198 while (InlineBox* nextBox = box->nextLeafChild()) { |
3199 if (nextBox->bidiLevel() < level) | 3199 if (nextBox->bidiLevel() < level) |
3200 break; | 3200 break; |
3201 box = nextBox; | 3201 box = nextBox; |
3202 } | 3202 } |
3203 if (box->bidiLevel() == level) | 3203 if (box->bidiLevel() == level) |
3204 break; | 3204 break; |
3205 level = box->bidiLevel(); | 3205 level = box->bidiLevel(); |
3206 } | 3206 } |
3207 layoutObject = LineLayoutPaintShim::layoutObjectFrom(box->lineLa
youtItem()); | 3207 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); |
3208 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->
caretMinOffset(); | 3208 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->
caretMinOffset(); |
3209 } | 3209 } |
3210 break; | 3210 break; |
3211 } | 3211 } |
3212 | 3212 |
3213 p = PositionTemplate<Strategy>::editingPositionOf(layoutObject->node(),
offset); | 3213 p = PositionTemplate<Strategy>::editingPositionOf(layoutObject->node(),
offset); |
3214 | 3214 |
3215 if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) !=
downstreamStart) || p.atStartOfTree() || p.atEndOfTree()) | 3215 if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) !=
downstreamStart) || p.atStartOfTree() || p.atEndOfTree()) |
3216 return p; | 3216 return p; |
3217 | 3217 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3327 { | 3327 { |
3328 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); | 3328 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); |
3329 } | 3329 } |
3330 | 3330 |
3331 VisiblePositionInComposedTree previousPositionOf(const VisiblePositionInComposed
Tree& visiblePosition, EditingBoundaryCrossingRule rule) | 3331 VisiblePositionInComposedTree previousPositionOf(const VisiblePositionInComposed
Tree& visiblePosition, EditingBoundaryCrossingRule rule) |
3332 { | 3332 { |
3333 return previousPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePos
ition, rule); | 3333 return previousPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePos
ition, rule); |
3334 } | 3334 } |
3335 | 3335 |
3336 } // namespace blink | 3336 } // namespace blink |
OLD | NEW |