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 {
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)
{
}
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>
......@@ -97,7 +100,8 @@ VisiblePosition createVisiblePosition(const PositionInComposedTree& position, Te
#ifndef NDEBUG
void VisiblePosition::debugPosition(const char* msg) const
template<typename Strategy>
void VisiblePositionTemplate<Strategy>::debugPosition(const char* msg) const
{
if (isNull()) {
fprintf(stderr, "Position [%s]: null\n", msg);
......@@ -106,22 +110,21 @@ void VisiblePosition::debugPosition(const char* msg) const
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);
}
void VisiblePosition::showTreeForThis() const
template<typename Strategy>
void VisiblePositionTemplate<Strategy>::showTreeForThis() const
{
deepEquivalent().showTreeForThis();
}
#endif
DEFINE_TRACE(VisiblePosition)
{
visitor->trace(m_positionWithAffinity);
}
template class CORE_TEMPLATE_EXPORT VisiblePositionTemplate<EditingStrategy>;
} // namespace blink
......
......@@ -67,32 +67,36 @@ class Range;
//
// NOTE: UPSTREAM affinity will be used only if pos is at end of a wrapped line,
// otherwise it will be converted to DOWNSTREAM.
class CORE_EXPORT VisiblePosition final {
template <typename Strategy>
class CORE_TEMPLATE_CLASS_EXPORT VisiblePositionTemplate final {
DISALLOW_ALLOCATION();
public:
VisiblePosition();
VisiblePositionTemplate();
// Node: Other than |createVisiblePosition()|, we should not use
// |createWithoutCanonicalization()|.
static VisiblePosition createWithoutCanonicalization(const PositionWithAffinity& canonicalized);
static VisiblePositionTemplate createWithoutCanonicalization(const PositionWithAffinityTemplate<Strategy>& canonicalized);
// Intentionally delete |operator==()| and |operator!=()| for reducing
// compilation error message.
// TODO(yosin) We'll have |equals()| when we have use cases of checking
// equality of both position and affinity.
bool operator==(const VisiblePosition&) const = delete;
bool operator!=(const VisiblePosition&) const = delete;
bool operator==(const VisiblePositionTemplate&) const = delete;
bool operator!=(const VisiblePositionTemplate&) const = delete;
bool isNull() const { return m_positionWithAffinity.isNull(); }
bool isNotNull() const { return m_positionWithAffinity.isNotNull(); }
bool isOrphan() const { return deepEquivalent().isOrphan(); }
Position deepEquivalent() const { return m_positionWithAffinity.position(); }
Position toParentAnchoredPosition() const { return deepEquivalent().parentAnchoredEquivalent(); }
PositionWithAffinity toPositionWithAffinity() const { return m_positionWithAffinity; }
PositionAlgorithm<Strategy> deepEquivalent() const { return m_positionWithAffinity.position(); }
PositionAlgorithm<Strategy> toParentAnchoredPosition() const { return deepEquivalent().parentAnchoredEquivalent(); }
PositionWithAffinityTemplate<Strategy> toPositionWithAffinity() const { return m_positionWithAffinity; }
TextAffinity affinity() const { return m_positionWithAffinity.affinity(); }
DECLARE_TRACE();
DEFINE_INLINE_TRACE()
{
visitor->trace(m_positionWithAffinity);
}
#ifndef NDEBUG
void debugPosition(const char* msg = "") const;
......@@ -101,11 +105,15 @@ public:
#endif
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 PositionWithAffinity&);
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