Index: Source/core/editing/VisiblePosition.cpp |
diff --git a/Source/core/editing/VisiblePosition.cpp b/Source/core/editing/VisiblePosition.cpp |
index ac504cf8c72116edf85ff6ae074548e2d485c52d..6c12510824762048ab9ccf263980a62bd449f90c 100644 |
--- a/Source/core/editing/VisiblePosition.cpp |
+++ b/Source/core/editing/VisiblePosition.cpp |
@@ -80,23 +80,23 @@ VisiblePosition VisiblePosition::next(EditingBoundaryCrossingRule rule) const |
return honorEditingBoundaryAtOrAfter(next); |
} |
-VisiblePosition VisiblePosition::previous(EditingBoundaryCrossingRule rule) const |
+VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, EditingBoundaryCrossingRule rule) |
{ |
- Position pos = previousVisuallyDistinctCandidate(m_deepPosition); |
+ Position pos = previousVisuallyDistinctCandidate(visiblePosition.deepEquivalent()); |
// return null visible position if there is no previous visible position |
if (pos.atStartOfTree()) |
return VisiblePosition(); |
VisiblePosition prev = VisiblePosition(pos); |
- ASSERT(prev.deepEquivalent() != m_deepPosition); |
+ ASSERT(prev.deepEquivalent() != visiblePosition.deepEquivalent()); |
#if ENABLE(ASSERT) |
// we should always be able to make the affinity |TextAffinity::Downstream|, |
// because going previous from an |TextAffinity::Upstream| position can |
// never yield another |TextAffinity::Upstream position| (unless line wrap |
// length is 0!). |
- if (prev.isNotNull() && m_affinity == TextAffinity::Upstream) { |
+ if (prev.isNotNull() && visiblePosition.affinity() == TextAffinity::Upstream) { |
ASSERT(inSameLine(PositionWithAffinity(prev.deepEquivalent()), PositionWithAffinity(prev.deepEquivalent(), TextAffinity::Upstream))); |
} |
#endif |
@@ -105,13 +105,13 @@ VisiblePosition VisiblePosition::previous(EditingBoundaryCrossingRule rule) cons |
case CanCrossEditingBoundary: |
return prev; |
case CannotCrossEditingBoundary: |
- return honorEditingBoundaryAtOrBefore(prev); |
+ return visiblePosition.honorEditingBoundaryAtOrBefore(prev); |
case CanSkipOverEditingBoundary: |
- return skipToStartOfEditingBoundary(prev); |
+ return visiblePosition.skipToStartOfEditingBoundary(prev); |
} |
ASSERT_NOT_REACHED(); |
- return honorEditingBoundaryAtOrBefore(prev); |
+ return visiblePosition.honorEditingBoundaryAtOrBefore(prev); |
} |
Position VisiblePosition::leftVisuallyDistinctCandidate() const |
@@ -681,6 +681,11 @@ UChar32 VisiblePosition::characterAfter() const |
return textNode->data().characterStartingAt(offset); |
} |
+UChar32 VisiblePosition::characterBefore() const |
+{ |
+ return previousPositionOf(*this).characterAfter(); |
+} |
+ |
LayoutRect VisiblePosition::localCaretRect(LayoutObject*& layoutObject) const |
{ |
PositionWithAffinity positionWithAffinity(m_deepPosition, m_affinity); |