Index: Source/core/editing/VisiblePosition.cpp |
diff --git a/Source/core/editing/VisiblePosition.cpp b/Source/core/editing/VisiblePosition.cpp |
index d8c97ee1dff8087dbb5aca12a256c3d156845bd3..c51b05d14528637869e604f0ac68ffe2c0f7b2f3 100644 |
--- a/Source/core/editing/VisiblePosition.cpp |
+++ b/Source/core/editing/VisiblePosition.cpp |
@@ -49,19 +49,24 @@ namespace blink { |
using namespace HTMLNames; |
-VisiblePosition::VisiblePosition(const Position &pos, TextAffinity affinity) |
+VisiblePosition::VisiblePosition(const Position& position, TextAffinity affinity) |
{ |
- init(pos, affinity); |
+ // TODO(yosin) We should make |VisiblePosition| private and make this |
+ // constructor to populate member variables by using |visiblePositionOf()|. |
+ *this = visiblePositionOf(position, affinity); |
} |
-VisiblePosition::VisiblePosition(const PositionInComposedTree& pos, TextAffinity affinity) |
+VisiblePosition::VisiblePosition(const PositionWithAffinity& positionWithAffinity) |
+ : VisiblePosition(positionWithAffinity.position(), positionWithAffinity.affinity()) |
{ |
- init(pos, affinity); |
} |
-VisiblePosition::VisiblePosition(const PositionWithAffinity& positionWithAffinity) |
+VisiblePosition VisiblePosition::createWithoutCanonicalization(const PositionWithAffinity& canonicalized) |
{ |
- init(positionWithAffinity.position(), positionWithAffinity.affinity()); |
+ VisiblePosition visiblePosition; |
+ visiblePosition.m_deepPosition = canonicalized.position(); |
+ visiblePosition.m_affinity = canonicalized.affinity(); |
+ return visiblePosition; |
} |
// TODO(yosin) We should move implementation of |skipToEndOfEditingBoundary()| |
@@ -662,26 +667,30 @@ PositionInComposedTree canonicalPositionOf(const PositionInComposedTree& positio |
} |
template<typename Strategy> |
-void VisiblePosition::init(const PositionAlgorithm<Strategy>& position, TextAffinity affinity) |
+static PositionWithAffinityTemplate<Strategy> visiblePositionOfAlgorithm(const PositionAlgorithm<Strategy>& position, TextAffinity affinity) |
{ |
- m_affinity = affinity; |
- |
- PositionAlgorithm<Strategy> deepPosition = canonicalPosition(position); |
- m_deepPosition = toPositionInDOMTree(deepPosition); |
- |
- if (m_affinity != TextAffinity::Upstream) |
- return; |
- |
- if (isNull()) { |
- m_affinity = TextAffinity::Downstream; |
- return; |
- } |
+ const PositionAlgorithm<Strategy> deepPosition = canonicalPosition(position); |
+ if (deepPosition.isNull()) |
+ return PositionWithAffinityTemplate<Strategy>(); |
+ if (affinity == TextAffinity::Downstream) |
+ return PositionWithAffinityTemplate<Strategy>(deepPosition); |
// When not at a line wrap, make sure to end up with |
// |TextAffinity::Downstream| affinity. |
- if (!inSameLine(PositionWithAffinityTemplate<Strategy>(deepPosition), PositionWithAffinityTemplate<Strategy>(deepPosition, TextAffinity::Upstream))) |
- return; |
- m_affinity = TextAffinity::Downstream; |
+ if (inSameLine(PositionWithAffinityTemplate<Strategy>(deepPosition), PositionWithAffinityTemplate<Strategy>(deepPosition, TextAffinity::Upstream))) |
+ return PositionWithAffinityTemplate<Strategy>(deepPosition); |
+ return PositionWithAffinityTemplate<Strategy>(deepPosition, TextAffinity::Upstream); |
+} |
+ |
+VisiblePosition visiblePositionOf(const Position& position, TextAffinity affinity) |
+{ |
+ return VisiblePosition::createWithoutCanonicalization(visiblePositionOfAlgorithm<EditingStrategy>(position, affinity)); |
+} |
+ |
+VisiblePosition visiblePositionOf(const PositionInComposedTree& position, TextAffinity affinity) |
+{ |
+ PositionInComposedTreeWithAffinity canonicalized = visiblePositionOfAlgorithm<EditingInComposedTreeStrategy>(position, affinity); |
+ return VisiblePosition::createWithoutCanonicalization(PositionWithAffinity(toPositionInDOMTree(canonicalized.position()), canonicalized.affinity())); |
} |
UChar32 characterAfter(const VisiblePosition& visiblePosition) |