Commit 3ec148dc authored by yosin@chromium.org's avatar yosin@chromium.org

Introduce VisiblePositionTemplate template class

This patch introduces template class |VisiblePositionTemplate| like
|PositionWithAffinityTemplate| as a preparation of introduce composed tree
version of |VisiblePosition|.

This patch is a preparation of making selection to handle granularity for web
component, http://crrev.com/1277863002

BUG=513568
TEST=n/a; no behavior changes

Review URL: https://codereview.chromium.org/1330563005

git-svn-id: svn://svn.chromium.org/blink/trunk@201765 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 2949903d
...@@ -49,18 +49,21 @@ namespace blink { ...@@ -49,18 +49,21 @@ namespace blink {
using namespace HTMLNames; using namespace HTMLNames;
VisiblePosition::VisiblePosition() template <typename Strategy>
VisiblePositionTemplate<Strategy>::VisiblePositionTemplate()
{ {
} }
VisiblePosition::VisiblePosition(const PositionWithAffinity& positionWithAffinity) template <typename Strategy>
VisiblePositionTemplate<Strategy>::VisiblePositionTemplate(const PositionWithAffinityTemplate<Strategy>& positionWithAffinity)
: m_positionWithAffinity(positionWithAffinity) : m_positionWithAffinity(positionWithAffinity)
{ {
} }
VisiblePosition VisiblePosition::createWithoutCanonicalization(const PositionWithAffinity& canonicalized) template <typename Strategy>
VisiblePositionTemplate<Strategy> VisiblePositionTemplate<Strategy>::createWithoutCanonicalization(const PositionWithAffinityTemplate<Strategy>& canonicalized)
{ {
return VisiblePosition(canonicalized); return VisiblePositionTemplate<Strategy>(canonicalized);
} }
template<typename Strategy> template<typename Strategy>
...@@ -97,7 +100,8 @@ VisiblePosition createVisiblePosition(const PositionInComposedTree& position, Te ...@@ -97,7 +100,8 @@ VisiblePosition createVisiblePosition(const PositionInComposedTree& position, Te
#ifndef NDEBUG #ifndef NDEBUG
void VisiblePosition::debugPosition(const char* msg) const template<typename Strategy>
void VisiblePositionTemplate<Strategy>::debugPosition(const char* msg) const
{ {
if (isNull()) { if (isNull()) {
fprintf(stderr, "Position [%s]: null\n", msg); fprintf(stderr, "Position [%s]: null\n", msg);
...@@ -106,22 +110,21 @@ void VisiblePosition::debugPosition(const char* msg) const ...@@ -106,22 +110,21 @@ void VisiblePosition::debugPosition(const char* msg) const
deepEquivalent().debugPosition(msg); deepEquivalent().debugPosition(msg);
} }
void VisiblePosition::formatForDebugger(char* buffer, unsigned length) const template<typename Strategy>
void VisiblePositionTemplate<Strategy>::formatForDebugger(char* buffer, unsigned length) const
{ {
deepEquivalent().formatForDebugger(buffer, length); deepEquivalent().formatForDebugger(buffer, length);
} }
void VisiblePosition::showTreeForThis() const template<typename Strategy>
void VisiblePositionTemplate<Strategy>::showTreeForThis() const
{ {
deepEquivalent().showTreeForThis(); deepEquivalent().showTreeForThis();
} }
#endif #endif
DEFINE_TRACE(VisiblePosition) template class CORE_TEMPLATE_EXPORT VisiblePositionTemplate<EditingStrategy>;
{
visitor->trace(m_positionWithAffinity);
}
} // namespace blink } // namespace blink
......
...@@ -67,32 +67,36 @@ class Range; ...@@ -67,32 +67,36 @@ class Range;
// //
// NOTE: UPSTREAM affinity will be used only if pos is at end of a wrapped line, // NOTE: UPSTREAM affinity will be used only if pos is at end of a wrapped line,
// otherwise it will be converted to DOWNSTREAM. // otherwise it will be converted to DOWNSTREAM.
class CORE_EXPORT VisiblePosition final { template <typename Strategy>
class CORE_TEMPLATE_CLASS_EXPORT VisiblePositionTemplate final {
DISALLOW_ALLOCATION(); DISALLOW_ALLOCATION();
public: public:
VisiblePosition(); VisiblePositionTemplate();
// Node: Other than |createVisiblePosition()|, we should not use // Node: Other than |createVisiblePosition()|, we should not use
// |createWithoutCanonicalization()|. // |createWithoutCanonicalization()|.
static VisiblePosition createWithoutCanonicalization(const PositionWithAffinity& canonicalized); static VisiblePositionTemplate createWithoutCanonicalization(const PositionWithAffinityTemplate<Strategy>& canonicalized);
// Intentionally delete |operator==()| and |operator!=()| for reducing // Intentionally delete |operator==()| and |operator!=()| for reducing
// compilation error message. // compilation error message.
// TODO(yosin) We'll have |equals()| when we have use cases of checking // TODO(yosin) We'll have |equals()| when we have use cases of checking
// equality of both position and affinity. // equality of both position and affinity.
bool operator==(const VisiblePosition&) const = delete; bool operator==(const VisiblePositionTemplate&) const = delete;
bool operator!=(const VisiblePosition&) const = delete; bool operator!=(const VisiblePositionTemplate&) const = delete;
bool isNull() const { return m_positionWithAffinity.isNull(); } bool isNull() const { return m_positionWithAffinity.isNull(); }
bool isNotNull() const { return m_positionWithAffinity.isNotNull(); } bool isNotNull() const { return m_positionWithAffinity.isNotNull(); }
bool isOrphan() const { return deepEquivalent().isOrphan(); } bool isOrphan() const { return deepEquivalent().isOrphan(); }
Position deepEquivalent() const { return m_positionWithAffinity.position(); } PositionAlgorithm<Strategy> deepEquivalent() const { return m_positionWithAffinity.position(); }
Position toParentAnchoredPosition() const { return deepEquivalent().parentAnchoredEquivalent(); } PositionAlgorithm<Strategy> toParentAnchoredPosition() const { return deepEquivalent().parentAnchoredEquivalent(); }
PositionWithAffinity toPositionWithAffinity() const { return m_positionWithAffinity; } PositionWithAffinityTemplate<Strategy> toPositionWithAffinity() const { return m_positionWithAffinity; }
TextAffinity affinity() const { return m_positionWithAffinity.affinity(); } TextAffinity affinity() const { return m_positionWithAffinity.affinity(); }
DECLARE_TRACE(); DEFINE_INLINE_TRACE()
{
visitor->trace(m_positionWithAffinity);
}
#ifndef NDEBUG #ifndef NDEBUG
void debugPosition(const char* msg = "") const; void debugPosition(const char* msg = "") const;
...@@ -101,11 +105,15 @@ public: ...@@ -101,11 +105,15 @@ public:
#endif #endif
private: private:
explicit VisiblePosition(const PositionWithAffinity&); explicit VisiblePositionTemplate(const PositionWithAffinityTemplate<Strategy>&);
PositionWithAffinity m_positionWithAffinity; PositionWithAffinityTemplate<Strategy> m_positionWithAffinity;
}; };
extern template class CORE_EXTERN_TEMPLATE_EXPORT VisiblePositionTemplate<EditingStrategy>;
using VisiblePosition = VisiblePositionTemplate<EditingStrategy>;
CORE_EXPORT VisiblePosition createVisiblePosition(const Position&, TextAffinity = VP_DEFAULT_AFFINITY); CORE_EXPORT VisiblePosition createVisiblePosition(const Position&, TextAffinity = VP_DEFAULT_AFFINITY);
CORE_EXPORT VisiblePosition createVisiblePosition(const PositionWithAffinity&); CORE_EXPORT VisiblePosition createVisiblePosition(const PositionWithAffinity&);
CORE_EXPORT VisiblePosition createVisiblePosition(const PositionInComposedTree&, TextAffinity = VP_DEFAULT_AFFINITY); CORE_EXPORT VisiblePosition createVisiblePosition(const PositionInComposedTree&, TextAffinity = VP_DEFAULT_AFFINITY);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment