Index: ui/accessibility/platform/test_ax_node_wrapper.cc |
diff --git a/ui/accessibility/platform/test_ax_node_wrapper.cc b/ui/accessibility/platform/test_ax_node_wrapper.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..056ad85caba69645d2b73c274ba3308586171175 |
--- /dev/null |
+++ b/ui/accessibility/platform/test_ax_node_wrapper.cc |
@@ -0,0 +1,120 @@ |
+// Copyright 2015 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 "base/containers/hash_tables.h" |
+#include "ui/accessibility/platform/test_ax_node_wrapper.h" |
+ |
+namespace ui { |
+ |
+namespace { |
+ |
+// A global map from AXNodes to TestAXNodeWrappers. |
+base::hash_map<AXNode*, TestAXNodeWrapper*> g_node_to_wrapper_map; |
+ |
+// A global coordinate offset. |
+gfx::Vector2d g_offset; |
+ |
+// A simple implementation of AXTreeDelegate to catch when AXNodes are |
+// deleted so we can delete their wrappers. |
+class TestAXTreeDelegate : public AXTreeDelegate { |
+ void OnNodeWillBeDeleted(AXNode* node) override { |
+ auto iter = g_node_to_wrapper_map.find(node); |
+ if (iter != g_node_to_wrapper_map.end()) { |
+ TestAXNodeWrapper* wrapper = iter->second; |
+ delete wrapper; |
+ g_node_to_wrapper_map.erase(iter->first); |
+ } |
+ } |
+ void OnSubtreeWillBeDeleted(AXNode* node) override {} |
+ void OnNodeCreated(AXNode* node) override {} |
+ void OnNodeChanged(AXNode* node) override {} |
+ void OnAtomicUpdateFinished(bool root_changed, |
+ const std::vector<Change>& changes) override {} |
+}; |
+ |
+TestAXTreeDelegate g_ax_tree_delegate; |
+ |
+} // namespace |
+ |
+// static |
+TestAXNodeWrapper* TestAXNodeWrapper::GetOrCreate(AXTree* tree, AXNode* node) { |
+ // Just return NULL if |node| is NULL; this makes test code simpler because |
+ // now we don't have to null-check AXNode* every time we call GetOrCreate. |
+ if (!node) |
+ return nullptr; |
+ |
+ tree->SetDelegate(&g_ax_tree_delegate); |
+ auto iter = g_node_to_wrapper_map.find(node); |
+ if (iter != g_node_to_wrapper_map.end()) |
+ return iter->second; |
+ TestAXNodeWrapper* wrapper = new TestAXNodeWrapper(tree, node); |
+ g_node_to_wrapper_map[node] = wrapper; |
+ return wrapper; |
+} |
+ |
+// static |
+void TestAXNodeWrapper::SetGlobalCoordinateOffset(const gfx::Vector2d& offset) { |
+ g_offset = offset; |
+} |
+ |
+TestAXNodeWrapper::~TestAXNodeWrapper() { |
+ platform_node_->Destroy(); |
+} |
+ |
+const AXNodeData& TestAXNodeWrapper::GetData() { |
+ return node_->data(); |
+} |
+ |
+gfx::NativeViewAccessible TestAXNodeWrapper::GetParent() { |
+ TestAXNodeWrapper* parent_wrapper = GetOrCreate(tree_, node_->parent()); |
+ return parent_wrapper ? |
+ parent_wrapper->ax_platform_node()->GetNativeViewAccessible() : |
+ nullptr; |
+} |
+ |
+int TestAXNodeWrapper::GetChildCount() { |
+ return node_->child_count(); |
+} |
+ |
+gfx::NativeViewAccessible TestAXNodeWrapper::ChildAtIndex(int index) { |
+ CHECK_GE(index, 0); |
+ CHECK_LT(index, GetChildCount()); |
+ TestAXNodeWrapper* child_wrapper = |
+ GetOrCreate(tree_, node_->children()[index]); |
+ return child_wrapper ? |
+ child_wrapper->ax_platform_node()->GetNativeViewAccessible() : |
+ nullptr; |
+} |
+ |
+gfx::Vector2d TestAXNodeWrapper::GetGlobalCoordinateOffset() { |
+ return g_offset; |
+} |
+ |
+gfx::NativeViewAccessible TestAXNodeWrapper::HitTestSync(int x, int y) { |
+ return nullptr; |
+} |
+ |
+gfx::NativeViewAccessible TestAXNodeWrapper::GetFocus() { |
+ return nullptr; |
+} |
+ |
+gfx::AcceleratedWidget |
+TestAXNodeWrapper::GetTargetForNativeAccessibilityEvent() { |
+ return gfx::kNullAcceleratedWidget; |
+} |
+ |
+void TestAXNodeWrapper::DoDefaultAction() { |
+} |
+ |
+bool TestAXNodeWrapper::SetStringValue(const base::string16& new_value) { |
+ return false; |
+} |
+ |
+TestAXNodeWrapper::TestAXNodeWrapper(AXTree* tree, AXNode* node) |
+ : tree_(tree), |
+ node_(node), |
+ platform_node_(AXPlatformNode::Create(this)) { |
+} |
+ |
+} // namespace ui |