Index: ui/accessibility/ax_node_position.cc |
diff --git a/ui/accessibility/ax_node_position.cc b/ui/accessibility/ax_node_position.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4b91f29b3a17ab9cc02eb6b566678dbe38eff872 |
--- /dev/null |
+++ b/ui/accessibility/ax_node_position.cc |
@@ -0,0 +1,79 @@ |
+// 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. |
+ |
+#include "ui/accessibility/ax_node_position.h" |
+ |
+#include "base/strings/string16.h" |
+#include "ui/accessibility/ax_enums.h" |
+ |
+namespace ui { |
+ |
+AXTree* AXNodePosition::tree_ = nullptr; |
+ |
+AXNodePosition::AXNodePosition() {} |
+ |
+AXNodePosition::~AXNodePosition() {} |
+ |
+void AXNodePosition::AnchorChild(int child_index, |
+ int* tree_id, |
+ int32_t* child_id) const { |
+ DCHECK(tree_id); |
+ DCHECK(child_id); |
+ |
+ if (!GetAnchor() || child_index < 0 || child_index >= AnchorChildCount()) { |
+ *tree_id = AXPosition::INVALID_TREE_ID; |
+ *child_id = AXPosition::INVALID_ANCHOR_ID; |
+ return; |
+ } |
+ |
+ AXNode* child = GetAnchor()->ChildAtIndex(child_index); |
+ DCHECK(child); |
+ *tree_id = this->tree_id(); |
+ *child_id = child->id(); |
+} |
+ |
+int AXNodePosition::AnchorChildCount() const { |
+ return GetAnchor() ? GetAnchor()->child_count() : 0; |
+} |
+ |
+int AXNodePosition::AnchorIndexInParent() const { |
+ return GetAnchor() ? GetAnchor()->index_in_parent() |
+ : AXPosition::INVALID_INDEX; |
+} |
+ |
+void AXNodePosition::AnchorParent(int* tree_id, int32_t* parent_id) const { |
+ DCHECK(tree_id); |
+ DCHECK(parent_id); |
+ |
+ if (!GetAnchor() || !GetAnchor()->parent()) { |
+ *tree_id = AXPosition::INVALID_TREE_ID; |
+ *parent_id = AXPosition::INVALID_ANCHOR_ID; |
+ return; |
+ } |
+ |
+ AXNode* parent = GetAnchor()->parent(); |
+ *tree_id = this->tree_id(); |
+ *parent_id = parent->id(); |
+} |
+ |
+AXNode* AXNodePosition::GetNodeInTree(int tree_id, int32_t node_id) const { |
+ if (!tree_ || node_id == AXPosition::INVALID_ANCHOR_ID) |
+ return nullptr; |
+ return AXNodePosition::tree_->GetFromId(node_id); |
+} |
+ |
+int AXNodePosition::MaxTextOffset() const { |
+ if (IsTextPosition()) { |
+ DCHECK(GetAnchor()); |
+ base::string16 name = |
+ GetAnchor()->data().GetString16Attribute(AX_ATTR_NAME); |
+ return static_cast<int>(name.length()); |
+ } else if (IsTreePosition()) { |
+ return 0; |
+ } |
+ |
+ return AXPosition::INVALID_INDEX; |
+} |
+ |
+} // namespace ui |