Drive: Add BatchableRequest subclass.
[chromium-blink-merge.git] / ui / views / accessibility / native_view_accessibility_auralinux.cc
blobafee5352cd08068e26ab33d2a827ff6dbdbab564
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/views/accessibility/native_view_accessibility_auralinux.h"
7 #include <algorithm>
8 #include <vector>
10 #include "base/memory/singleton.h"
11 #include "ui/accessibility/ax_enums.h"
12 #include "ui/accessibility/ax_node_data.h"
13 #include "ui/accessibility/platform/ax_platform_node_auralinux.h"
14 #include "ui/accessibility/platform/ax_platform_node_delegate.h"
15 #include "ui/gfx/native_widget_types.h"
16 #include "ui/views/views_delegate.h"
17 #include "ui/views/widget/widget.h"
18 #include "ui/views/widget/widget_observer.h"
20 namespace views {
22 namespace {
24 // ATK requires that we have a single root "application" object that's the
25 // owner of all other windows. This is a simple class that implements the
26 // AXPlatformNodeDelegate interface so we can create such an application
27 // object. Every time we create an accessibility object for a View, we add its
28 // top-level widget to a vector so we can return the list of all top-level
29 // windows as children of this application object.
30 class AuraLinuxApplication
31 : public ui::AXPlatformNodeDelegate,
32 public WidgetObserver {
33 public:
34 // Get the single instance of this class.
35 static AuraLinuxApplication* GetInstance() {
36 return Singleton<AuraLinuxApplication>::get();
39 // Called every time we create a new accessibility on a View.
40 // Add the top-level widget to our registry so that we can enumerate all
41 // top-level widgets.
42 void RegisterWidget(Widget* widget) {
43 if (!widget)
44 return;
46 widget = widget->GetTopLevelWidget();
47 if (std::find(widgets_.begin(), widgets_.end(), widget) != widgets_.end())
48 return;
50 widgets_.push_back(widget);
51 widget->AddObserver(this);
54 gfx::NativeViewAccessible GetNativeViewAccessible() {
55 return platform_node_->GetNativeViewAccessible();
59 // WidgetObserver overrides.
62 void OnWidgetDestroying(Widget* widget) override {
63 auto iter = std::find(widgets_.begin(), widgets_.end(), widget);
64 if (iter != widgets_.end())
65 widgets_.erase(iter);
69 // ui::AXPlatformNodeDelegate overrides.
72 const ui::AXNodeData& GetData() override {
73 return data_;
76 gfx::NativeViewAccessible GetParent() override {
77 return nullptr;
80 int GetChildCount() override {
81 return static_cast<int>(widgets_.size());
84 gfx::NativeViewAccessible ChildAtIndex(int index) override {
85 if (index < 0 || index >= GetChildCount())
86 return nullptr;
88 Widget* widget = widgets_[index];
89 CHECK(widget);
90 return widget->GetRootView()->GetNativeViewAccessible();
93 gfx::Vector2d GetGlobalCoordinateOffset() override {
94 return gfx::Vector2d();
97 gfx::NativeViewAccessible HitTestSync(int x, int y) override {
98 return nullptr;
101 gfx::NativeViewAccessible GetFocus() override {
102 return nullptr;
105 gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent() override {
106 return gfx::kNullAcceleratedWidget;
109 void DoDefaultAction() override {
112 bool SetStringValue(const base::string16& new_value) override {
113 return false;
116 private:
117 friend struct DefaultSingletonTraits<AuraLinuxApplication>;
119 AuraLinuxApplication()
120 : platform_node_(ui::AXPlatformNode::Create(this)) {
121 data_.role = ui::AX_ROLE_APPLICATION;
122 if (ViewsDelegate::views_delegate) {
123 data_.AddStringAttribute(
124 ui::AX_ATTR_NAME,
125 ViewsDelegate::views_delegate->GetApplicationName());
127 ui::AXPlatformNodeAuraLinux::SetApplication(platform_node_);
130 ~AuraLinuxApplication() override {
131 platform_node_->Destroy();
132 platform_node_ = nullptr;
135 ui::AXPlatformNode* platform_node_;
136 ui::AXNodeData data_;
137 std::vector<Widget*> widgets_;
139 DISALLOW_COPY_AND_ASSIGN(AuraLinuxApplication);
142 } // namespace
144 // static
145 NativeViewAccessibility* NativeViewAccessibility::Create(View* view) {
146 AuraLinuxApplication::GetInstance()->RegisterWidget(view->GetWidget());
147 return new NativeViewAccessibilityAuraLinux(view);
150 NativeViewAccessibilityAuraLinux::NativeViewAccessibilityAuraLinux(View* view)
151 : NativeViewAccessibility(view) {
154 NativeViewAccessibilityAuraLinux::~NativeViewAccessibilityAuraLinux() {
157 gfx::NativeViewAccessible NativeViewAccessibilityAuraLinux::GetParent() {
158 gfx::NativeViewAccessible parent = NativeViewAccessibility::GetParent();
159 if (!parent)
160 parent = AuraLinuxApplication::GetInstance()->GetNativeViewAccessible();
161 return parent;
164 } // namespace views