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..7d396829adf74f1a76eaad62e5b33e46df9a6693 |
--- /dev/null |
+++ b/ui/accessibility/ax_position.h |
@@ -0,0 +1,132 @@ |
+// 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 <memory> |
+ |
+#include "ui/accessibility/ax_node.h" |
+ |
+namespace ui { |
+ |
+class AXPositionFactory; |
+ |
+// Defines the type of position in the accessibility tree. |
+enum class AXPositionType { NullPosition, TreePosition, TextPosition }; |
+ |
+// 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: |
+ virtual ~AXPosition(); |
+ |
+ 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_; } |
+ ui::AXTextAffinity get_affinity() { return affinity_; } |
+ void set_affinity(ui::AXTextAffinity affinity) { affinity_ = affinity; } |
+ |
+ bool IsNullPosition() const { |
+ return type_ == AXPositionType::NullPosition || !GetAnchor(); |
+ } |
+ bool IsTreePosition() const { |
+ return GetAnchor() && type_ == AXPositionType::TreePosition; |
+ } |
+ bool IsTextPosition() const { |
+ return GetAnchor() && type_ == AXPositionType::TextPosition; |
+ } |
+ |
+ bool AtStartOfAnchor() const; |
+ bool AtEndOfAnchor() const; |
+ |
+ AXPosition CommonAncestor(const AXPosition& second) 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: |
+ // |AXPositionFactory| needs access to our constructor. |
+ friend class AXPositionFactory; |
+ AXPosition(int tree_id, |
+ int32_t anchor_id, |
+ int child_index, |
+ int text_offset, |
+ AXPositionType type, |
+ std::unique_ptr<AXPositionFactory> factory); |
+ |
+ 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 { |
+ return nullptr; |
+ } |
+ virtual int MaxTextOffset() const { return -1; } |
+ |
+ 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_; |
+ |
+ std::unique_ptr<AXPositionFactory> factory_; |
+ |
+ // TODO(nektar): Get rid of affinity and make Blink handle affinity |
+ // internally since inline text objects don't span lines. |
+ ui::AXTextAffinity affinity_; |
+}; |
+ |
+bool operator==(const AXPosition& first, const AXPosition& second); |
+bool operator!=(const AXPosition& first, const AXPosition& second); |
+ |
+// Creates the appropriate subclass of |AXPosition|. |
+class AX_EXPORT AXPositionFactory { |
+ public: |
+ virtual ~AXPositionFactory() {} |
+ |
+ virtual AXPosition CreateNullPosition() = 0; |
+ virtual AXPosition CreateTreePosition(int tree_id, |
+ int32_t anchor_id, |
+ int child_index) = 0; |
+ virtual AXPosition CreateTextPosition(int tree_id, |
+ int32_t anchor_id, |
+ int text_offset) = 0; |
+}; |
+ |
+} // namespace ui |
+ |
+#endif // UI_ACCESSIBILITY_AX_POSITION_H_ |