Index: Source/core/editing/FrameSelection.cpp |
diff --git a/Source/core/editing/FrameSelection.cpp b/Source/core/editing/FrameSelection.cpp |
index 6faf68983d02ccd7ced1c604467e8d3fc4ecfae8..1f3886cad6838cc1951d33f845bf5297672e472d 100644 |
--- a/Source/core/editing/FrameSelection.cpp |
+++ b/Source/core/editing/FrameSelection.cpp |
@@ -577,6 +577,26 @@ VisiblePosition FrameSelection::endForPlatform() const |
return positionForPlatform(false); |
} |
+VisiblePosition FrameSelection::nextWordPositionForPlatform(const VisiblePosition &originalPosition) |
+{ |
+ VisiblePosition positionAfterCurrentWord = nextWordPosition(originalPosition); |
+ |
+ if (m_frame && m_frame->editor()->behavior().shouldSkipSpaceWhenMovingRight()) { |
+ // In order to skip spaces when moving right, we advance one |
+ // word further and then move one word back. Given the |
+ // semantics of previousWordPosition() this will put us at the |
+ // beginning of the word following. |
+ VisiblePosition positionAfterSpacingAndFollowingWord = nextWordPosition(positionAfterCurrentWord); |
+ if (positionAfterSpacingAndFollowingWord.isNotNull() && positionAfterSpacingAndFollowingWord != positionAfterCurrentWord) |
+ positionAfterCurrentWord = previousWordPosition(positionAfterSpacingAndFollowingWord); |
+ |
+ bool movingBackwardsMovedPositionToStartOfCurrentWord = positionAfterCurrentWord == previousWordPosition(nextWordPosition(originalPosition)); |
+ if (movingBackwardsMovedPositionToStartOfCurrentWord) |
+ positionAfterCurrentWord = positionAfterSpacingAndFollowingWord; |
+ } |
+ return positionAfterCurrentWord; |
+} |
+ |
#if ENABLE(USERSELECT_ALL) |
static void adjustPositionForUserSelectAll(VisiblePosition& pos, bool isForward) |
{ |
@@ -603,7 +623,7 @@ VisiblePosition FrameSelection::modifyExtendingRight(TextGranularity granularity |
break; |
case WordGranularity: |
if (directionOfEnclosingBlock() == LTR) |
- pos = nextWordPosition(pos); |
+ pos = nextWordPositionForPlatform(pos); |
else |
pos = previousWordPosition(pos); |
break; |
@@ -637,7 +657,7 @@ VisiblePosition FrameSelection::modifyExtendingForward(TextGranularity granulari |
pos = pos.next(CannotCrossEditingBoundary); |
break; |
case WordGranularity: |
- pos = nextWordPosition(pos); |
+ pos = nextWordPositionForPlatform(pos); |
break; |
case SentenceGranularity: |
pos = nextSentencePosition(pos); |
@@ -717,7 +737,7 @@ VisiblePosition FrameSelection::modifyMovingForward(TextGranularity granularity) |
pos = VisiblePosition(m_selection.extent(), m_selection.affinity()).next(CannotCrossEditingBoundary); |
break; |
case WordGranularity: |
- pos = nextWordPosition(VisiblePosition(m_selection.extent(), m_selection.affinity())); |
+ pos = nextWordPositionForPlatform(VisiblePosition(m_selection.extent(), m_selection.affinity())); |
break; |
case SentenceGranularity: |
pos = nextSentencePosition(VisiblePosition(m_selection.extent(), m_selection.affinity())); |
@@ -773,7 +793,7 @@ VisiblePosition FrameSelection::modifyExtendingLeft(TextGranularity granularity) |
if (directionOfEnclosingBlock() == LTR) |
pos = previousWordPosition(pos); |
else |
- pos = nextWordPosition(pos); |
+ pos = nextWordPositionForPlatform(pos); |
break; |
case LineBoundary: |
if (directionOfEnclosingBlock() == LTR) |