Index: ui/accessibility/ax_position.h |
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h |
index c38d9511128976a2f0f726799a4a89ff6c464d06..2cd3b5dccdc9ecb6433957909411565bad318378 100644 |
--- a/ui/accessibility/ax_position.h |
+++ b/ui/accessibility/ax_position.h |
@@ -17,19 +17,11 @@ |
#include "base/strings/string16.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "ui/accessibility/ax_abstract_position.h" |
#include "ui/accessibility/ax_enums.h" |
namespace ui { |
-// Defines the type of position in the accessibility tree. |
-// A tree position is used when referring to a specific child of a node in the |
-// accessibility tree. |
-// A text position is used when referring to a specific character of text inside |
-// a particular node. |
-// A null position is used to signify that the provided data is invalid or that |
-// a boundary has been reached. |
-enum class AXPositionKind { NULL_POSITION, TREE_POSITION, TEXT_POSITION }; |
- |
// Forward declarations. |
template <class AXPositionType, class AXNodeType> |
class AXPosition; |
@@ -70,23 +62,13 @@ bool operator!=(const AXPosition<AXPositionType, AXNodeType>& first, |
// This class can be copied using the |Clone| method. It is designed to be |
// immutable. |
template <class AXPositionType, class AXNodeType> |
-class AXPosition { |
+class AXPosition : public AXAbstractPosition { |
public: |
using AXPositionInstance = |
std::unique_ptr<AXPosition<AXPositionType, AXNodeType>>; |
- static const int INVALID_TREE_ID = -1; |
- static const int32_t INVALID_ANCHOR_ID = -1; |
- static const int BEFORE_TEXT = -1; |
- static const int INVALID_INDEX = -2; |
- static const int INVALID_OFFSET = -1; |
- |
static AXPositionInstance CreateNullPosition() { |
- AXPositionInstance new_position(new AXPositionType()); |
- new_position->Initialize(AXPositionKind::NULL_POSITION, INVALID_TREE_ID, |
- INVALID_ANCHOR_ID, INVALID_INDEX, INVALID_OFFSET, |
- AX_TEXT_AFFINITY_DOWNSTREAM); |
- return new_position; |
+ return CreateFromData(kNullData); |
} |
static AXPositionInstance CreateTreePosition(int tree_id, |
@@ -109,6 +91,18 @@ class AXPosition { |
return new_position; |
} |
+ static AXPositionInstance CreateFromData(const AXPositionData& data) { |
+ AXPositionInstance new_position(new AXPositionType()); |
+ // Skip Initialize() when creating from data. |
+ new_position->kind_ = data.kind; |
+ new_position->tree_id_ = data.tree_id; |
+ new_position->anchor_id_ = data.anchor_id; |
+ new_position->child_index_ = data.child_index; |
+ new_position->text_offset_ = data.text_offset; |
+ new_position->affinity_ = data.affinity; |
+ return new_position; |
+ } |
+ |
AXPosition() {} |
virtual ~AXPosition() {} |
@@ -971,12 +965,12 @@ class AXPosition { |
virtual AXPosition<AXPositionType, AXNodeType>& operator=( |
const AXPosition<AXPositionType, AXNodeType>& other) = default; |
- virtual void Initialize(AXPositionKind kind, |
- int tree_id, |
- int32_t anchor_id, |
- int child_index, |
- int text_offset, |
- AXTextAffinity affinity) { |
+ void Initialize(AXPositionKind kind, |
+ int tree_id, |
+ int32_t anchor_id, |
+ int child_index, |
+ int text_offset, |
+ AXTextAffinity affinity) { |
kind_ = kind; |
tree_id_ = tree_id; |
anchor_id_ = anchor_id; |
@@ -1106,6 +1100,56 @@ class AXPosition { |
virtual int32_t GetPreviousOnLineID(int32_t node_id) const = 0; |
private: |
+ // AXAbstractPosition: |
+ void ToData(AXPositionData* data) const override { |
+ *data = {kind_, tree_id_, anchor_id_, |
+ child_index_, text_offset_, affinity_}; |
+ } |
+ bool IsNull() const override { return IsNullPosition(); } |
+ bool Compare(const AXPositionPointer& other) const override { |
+ return *this < *other.DownCastTo<AXPosition>(); |
+ } |
+ |
+ AXPositionPointer PositionAtEndOfAnchor() const override { |
+ return CreatePositionAtEndOfAnchor(); |
+ } |
+ AXPositionPointer PositionAtStartOfAnchor() const override { |
+ return CreatePositionAtStartOfAnchor(); |
+ } |
+ |
+ AXPositionPointer NextCharacterPosition() const override { |
+ return CreateNextCharacterPosition(); |
+ } |
+ AXPositionPointer PreviousCharacterPosition() const override { |
+ return CreatePreviousCharacterPosition(); |
+ } |
+ |
+ AXPositionPointer NextWordStartPosition() const override { |
+ return CreateNextWordStartPosition(); |
+ } |
+ AXPositionPointer PreviousWordStartPosition() const override { |
+ return CreatePreviousWordStartPosition(); |
+ } |
+ AXPositionPointer NextWordEndPosition() const override { |
+ return CreateNextWordEndPosition(); |
+ } |
+ AXPositionPointer PreviousWordEndPosition() const override { |
+ return CreatePreviousWordEndPosition(); |
+ } |
+ |
+ AXPositionPointer NextLineStartPosition() const override { |
+ return CreateNextLineStartPosition(); |
+ } |
+ AXPositionPointer PreviousLineStartPosition() const override { |
+ return CreatePreviousLineStartPosition(); |
+ } |
+ AXPositionPointer NextLineEndPosition() const override { |
+ return CreateNextLineEndPosition(); |
+ } |
+ AXPositionPointer PreviousLineEndPosition() const override { |
+ return CreatePreviousLineEndPosition(); |
+ } |
+ |
AXPositionKind kind_; |
int tree_id_; |
int32_t anchor_id_; |
@@ -1121,17 +1165,6 @@ class AXPosition { |
}; |
template <class AXPositionType, class AXNodeType> |
-const int AXPosition<AXPositionType, AXNodeType>::INVALID_TREE_ID; |
-template <class AXPositionType, class AXNodeType> |
-const int32_t AXPosition<AXPositionType, AXNodeType>::INVALID_ANCHOR_ID; |
-template <class AXPositionType, class AXNodeType> |
-const int AXPosition<AXPositionType, AXNodeType>::BEFORE_TEXT; |
-template <class AXPositionType, class AXNodeType> |
-const int AXPosition<AXPositionType, AXNodeType>::INVALID_INDEX; |
-template <class AXPositionType, class AXNodeType> |
-const int AXPosition<AXPositionType, AXNodeType>::INVALID_OFFSET; |
- |
-template <class AXPositionType, class AXNodeType> |
bool operator==(const AXPosition<AXPositionType, AXNodeType>& first, |
const AXPosition<AXPositionType, AXNodeType>& second) { |
if (first.IsNullPosition() && second.IsNullPosition()) |