| 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()) | 
|  |