Index: ui/accessibility/ax_position.h |
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d4ab388f09593db0699c47f3a908643ad3894da3 |
--- /dev/null |
+++ b/ui/accessibility/ax_position.h |
@@ -0,0 +1,93 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef UI_ACCESSIBILITY_AX_POSITION_H_ |
+#define UI_ACCESSIBILITY_AX_POSITION_H_ |
+ |
+#include <stdint.h> |
+ |
+#include "ui/accessibility/ax_node.h" |
+ |
+namespace ui { |
+ |
+// A position in the |AXTree|. |
+// It could either indicate a non-textual node in the accessibility tree, or a |
+// text node and a character offset. |
+// |
+// This class is copiable. |
+class AX_EXPORT AXPosition { |
+ public: |
+ static AXPosition CreateNullPosition(); |
+ static AXPosition CreateTreePosition(int tree_id, int32_t anchor_id, int child_index = 0); |
+ static AXPosition CreateTextPosition(int tree_id, int32_t anchor_id, int text_offset = 0); |
+ |
+ virtual ~AXPosition(); |
+ |
+ static AXPosition CommonAncestor(const AXPosition& first, const AXPosition& second); |
+ |
+ int get_tree_id() const { return tree_id_; } |
+ int32_t get_anchor_id() const { return anchor_id_; } |
+ AXNode* GetAnchor() const; |
+ int get_child_index() const { return child_index_; } |
+ int get_text_offset() const { return text_offset_; } |
+ |
+ bool IsNullPosition() const { return !GetAnchor(); } |
+ bool IsTreePosition() const { return GetAnchor() && type_ == AXPositionType::TreePosition; } |
+ bool IsTextPosition() const { return GetAnchor() && type_ == AXPositionType::TextPosition; } |
+ |
+ bool AtStartOfAnchor() const; |
+ bool AtEndOfAnchor() const; |
+ |
+ bool operator<(const AXPosition& position) const; |
+ bool operator<=(const AXPosition& position) const; |
+ bool operator>(const AXPosition& position) const; |
+ bool operator>=(const AXPosition& position) const; |
+ |
+ AXPosition GetPositionAtStartOfAnchor() const; |
+ AXPosition GetPositionAtEndOfAnchor() const; |
+ |
+ // The following methods work across anchors. |
+ |
+ AXPosition GetNextCharacterPosition() const; |
+ AXPosition GetPreviousCharacterPosition() const; |
+ // TODO(nektar): Add word, line and paragraph navigation methods. |
+ |
+ protected: |
+ AXPosition(int tree_id, int32_t anchor_id, int offset, AXPositionType type); |
+ |
+ virtual int AnchorChildCount() const { return GetAnchor() ? GetAnchor()->child_count() : -1; } |
+ virtual AXPosition GetChildPositionAt(int child_index) const; |
+ virtual AXPosition GetParentPosition() const; |
+ virtual int AnchorIndexInParent() const { return GetAnchor() ? GetAnchor()->index_in_parent() : -1; } |
+ // Uses depth-first pre-order traversal. |
+ virtual AXPosition GetNextAnchorPosition() const; |
+ // Uses depth-first pre-order traversal. |
+ virtual AXPosition GetPreviousAnchorPosition() const; |
+ |
+ virtual AXNode* GetNodeInTree(int tree_id, int32-t node_id) const = 0; |
+ virtual int MaxTextOffset() const = 0; |
+ |
+ // Defines the type of position in the accessibility tree. |
+ enum class AXPositionType { |
+ TreePosition, |
+ TextPosition |
+ }; |
+ |
+ private: |
+ int tree_id_; |
+ int32_t anchor_id_; |
+ |
+ // For text positions, |child_index_| is initially set to |-1| and only computed on demand. The same with tree positions and |text_offset_|. |
+ int child_index_; |
+ int text_offset_; |
+ |
+ AXPositionType type_; |
+}; |
+ |
+bool operator==(const AXPosition& first, const AXPosition& second); |
+bool operator!=(const AXPosition& first, const AXPosition& second); |
+ |
+} // namespace ui |
+ |
+#endif // UI_ACCESSIBILITY_AX_POSITION_H_ |