diff options
Diffstat (limited to 'ui/views/accessibility')
3 files changed, 194 insertions, 2 deletions
diff --git a/ui/views/accessibility/native_view_accessibility.cc b/ui/views/accessibility/native_view_accessibility.cc index aeb2c70..a11f773 100644 --- a/ui/views/accessibility/native_view_accessibility.cc +++ b/ui/views/accessibility/native_view_accessibility.cc @@ -13,7 +13,7 @@ namespace views { -#if !defined(OS_WIN) +#if !defined(OS_WIN) && !(defined(OS_LINUX) && !defined(OS_CHROMEOS)) // static NativeViewAccessibility* NativeViewAccessibility::Create(View* view) { return new NativeViewAccessibility(view); @@ -23,7 +23,8 @@ NativeViewAccessibility* NativeViewAccessibility::Create(View* view) { NativeViewAccessibility::NativeViewAccessibility(View* view) : view_(view), parent_widget_(nullptr), - ax_node_(ui::AXPlatformNode::Create(this)) { + ax_node_(nullptr) { + ax_node_ = ui::AXPlatformNode::Create(this); } NativeViewAccessibility::~NativeViewAccessibility() { diff --git a/ui/views/accessibility/native_view_accessibility_auralinux.cc b/ui/views/accessibility/native_view_accessibility_auralinux.cc new file mode 100644 index 0000000..afee535 --- /dev/null +++ b/ui/views/accessibility/native_view_accessibility_auralinux.cc @@ -0,0 +1,164 @@ +// 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 "ui/views/accessibility/native_view_accessibility_auralinux.h" + +#include <algorithm> +#include <vector> + +#include "base/memory/singleton.h" +#include "ui/accessibility/ax_enums.h" +#include "ui/accessibility/ax_node_data.h" +#include "ui/accessibility/platform/ax_platform_node_auralinux.h" +#include "ui/accessibility/platform/ax_platform_node_delegate.h" +#include "ui/gfx/native_widget_types.h" +#include "ui/views/views_delegate.h" +#include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_observer.h" + +namespace views { + +namespace { + +// ATK requires that we have a single root "application" object that's the +// owner of all other windows. This is a simple class that implements the +// AXPlatformNodeDelegate interface so we can create such an application +// object. Every time we create an accessibility object for a View, we add its +// top-level widget to a vector so we can return the list of all top-level +// windows as children of this application object. +class AuraLinuxApplication + : public ui::AXPlatformNodeDelegate, + public WidgetObserver { + public: + // Get the single instance of this class. + static AuraLinuxApplication* GetInstance() { + return Singleton<AuraLinuxApplication>::get(); + } + + // Called every time we create a new accessibility on a View. + // Add the top-level widget to our registry so that we can enumerate all + // top-level widgets. + void RegisterWidget(Widget* widget) { + if (!widget) + return; + + widget = widget->GetTopLevelWidget(); + if (std::find(widgets_.begin(), widgets_.end(), widget) != widgets_.end()) + return; + + widgets_.push_back(widget); + widget->AddObserver(this); + } + + gfx::NativeViewAccessible GetNativeViewAccessible() { + return platform_node_->GetNativeViewAccessible(); + } + + // + // WidgetObserver overrides. + // + + void OnWidgetDestroying(Widget* widget) override { + auto iter = std::find(widgets_.begin(), widgets_.end(), widget); + if (iter != widgets_.end()) + widgets_.erase(iter); + } + + // + // ui::AXPlatformNodeDelegate overrides. + // + + const ui::AXNodeData& GetData() override { + return data_; + } + + gfx::NativeViewAccessible GetParent() override { + return nullptr; + } + + int GetChildCount() override { + return static_cast<int>(widgets_.size()); + } + + gfx::NativeViewAccessible ChildAtIndex(int index) override { + if (index < 0 || index >= GetChildCount()) + return nullptr; + + Widget* widget = widgets_[index]; + CHECK(widget); + return widget->GetRootView()->GetNativeViewAccessible(); + } + + gfx::Vector2d GetGlobalCoordinateOffset() override { + return gfx::Vector2d(); + } + + gfx::NativeViewAccessible HitTestSync(int x, int y) override { + return nullptr; + } + + gfx::NativeViewAccessible GetFocus() override { + return nullptr; + } + + gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent() override { + return gfx::kNullAcceleratedWidget; + } + + void DoDefaultAction() override { + } + + bool SetStringValue(const base::string16& new_value) override { + return false; + } + + private: + friend struct DefaultSingletonTraits<AuraLinuxApplication>; + + AuraLinuxApplication() + : platform_node_(ui::AXPlatformNode::Create(this)) { + data_.role = ui::AX_ROLE_APPLICATION; + if (ViewsDelegate::views_delegate) { + data_.AddStringAttribute( + ui::AX_ATTR_NAME, + ViewsDelegate::views_delegate->GetApplicationName()); + } + ui::AXPlatformNodeAuraLinux::SetApplication(platform_node_); + } + + ~AuraLinuxApplication() override { + platform_node_->Destroy(); + platform_node_ = nullptr; + } + + ui::AXPlatformNode* platform_node_; + ui::AXNodeData data_; + std::vector<Widget*> widgets_; + + DISALLOW_COPY_AND_ASSIGN(AuraLinuxApplication); +}; + +} // namespace + +// static +NativeViewAccessibility* NativeViewAccessibility::Create(View* view) { + AuraLinuxApplication::GetInstance()->RegisterWidget(view->GetWidget()); + return new NativeViewAccessibilityAuraLinux(view); +} + +NativeViewAccessibilityAuraLinux::NativeViewAccessibilityAuraLinux(View* view) + : NativeViewAccessibility(view) { +} + +NativeViewAccessibilityAuraLinux::~NativeViewAccessibilityAuraLinux() { +} + +gfx::NativeViewAccessible NativeViewAccessibilityAuraLinux::GetParent() { + gfx::NativeViewAccessible parent = NativeViewAccessibility::GetParent(); + if (!parent) + parent = AuraLinuxApplication::GetInstance()->GetNativeViewAccessible(); + return parent; +} + +} // namespace views diff --git a/ui/views/accessibility/native_view_accessibility_auralinux.h b/ui/views/accessibility/native_view_accessibility_auralinux.h new file mode 100644 index 0000000..f817dc7 --- /dev/null +++ b/ui/views/accessibility/native_view_accessibility_auralinux.h @@ -0,0 +1,27 @@ +// 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. + +#ifndef UI_VIEWS_ACCESSIBILITY_NATIVE_VIEW_ACCESSIBILITY_AURALINUX_H_ +#define UI_VIEWS_ACCESSIBILITY_NATIVE_VIEW_ACCESSIBILITY_AURALINUX_H_ + +#include "ui/views/accessibility/native_view_accessibility.h" +#include "ui/views/view.h" + +namespace views { + +class NativeViewAccessibilityAuraLinux : public NativeViewAccessibility { + public: + NativeViewAccessibilityAuraLinux(View* view); + ~NativeViewAccessibilityAuraLinux() override; + + // NativeViewAccessibility. + gfx::NativeViewAccessible GetParent() override; + + private: + DISALLOW_COPY_AND_ASSIGN(NativeViewAccessibilityAuraLinux); +}; + +} // namespace views + +#endif // UI_VIEWS_ACCESSIBILITY_NATIVE_VIEW_ACCESSIBILITY_AURALINUX_H_ |