Commit 51bc29e2 authored by Katie D's avatar Katie D Committed by Commit Bot

Populate window data in AccessibilityWindowInfoDataWrapper.

Does not yet start using windows in Arc.
See go/a11y-arc++-window-mapping for more.

Bug: 891483
Change-Id: Ibbd47b12b4440f3200edb9e57a14658f489e4cd5
Reviewed-on: https://chromium-review.googlesource.com/c/1308079
Commit-Queue: Katie Dektar <katie@chromium.org>
Reviewed-by: default avatarYuki Awano <yawano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605008}
parent 34f73700
...@@ -422,8 +422,7 @@ void AccessibilityNodeInfoDataWrapper::Serialize( ...@@ -422,8 +422,7 @@ void AccessibilityNodeInfoDataWrapper::Serialize(
} }
} }
const std::vector<int32_t>* AccessibilityNodeInfoDataWrapper::GetChildren() const std::vector<int32_t>* AccessibilityNodeInfoDataWrapper::GetChildren() {
const {
if (!node_ptr_->int_list_properties) if (!node_ptr_->int_list_properties)
return nullptr; return nullptr;
auto it = auto it =
......
...@@ -32,7 +32,7 @@ class AccessibilityNodeInfoDataWrapper : public ArcAccessibilityInfoData { ...@@ -32,7 +32,7 @@ class AccessibilityNodeInfoDataWrapper : public ArcAccessibilityInfoData {
void PopulateAXRole(ui::AXNodeData* out_data) const override; void PopulateAXRole(ui::AXNodeData* out_data) const override;
void PopulateAXState(ui::AXNodeData* out_data) const override; void PopulateAXState(ui::AXNodeData* out_data) const override;
void Serialize(ui::AXNodeData* out_data) const override; void Serialize(ui::AXNodeData* out_data) const override;
const std::vector<int32_t>* GetChildren() const override; const std::vector<int32_t>* GetChildren() override;
mojom::AccessibilityNodeInfoData* node() { return node_ptr_; } mojom::AccessibilityNodeInfoData* node() { return node_ptr_; }
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "chrome/browser/chromeos/arc/accessibility/accessibility_window_info_data_wrapper.h" #include "chrome/browser/chromeos/arc/accessibility/accessibility_window_info_data_wrapper.h"
#include "chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h" #include "chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h"
#include "components/exo/wm_helper.h"
#include "ui/accessibility/platform/ax_android_constants.h"
namespace arc { namespace arc {
...@@ -12,6 +14,8 @@ AccessibilityWindowInfoDataWrapper::AccessibilityWindowInfoDataWrapper( ...@@ -12,6 +14,8 @@ AccessibilityWindowInfoDataWrapper::AccessibilityWindowInfoDataWrapper(
mojom::AccessibilityWindowInfoData* window) mojom::AccessibilityWindowInfoData* window)
: tree_source_(tree_source), window_ptr_(window) {} : tree_source_(tree_source), window_ptr_(window) {}
AccessibilityWindowInfoDataWrapper::~AccessibilityWindowInfoDataWrapper() {}
bool AccessibilityWindowInfoDataWrapper::IsNode() const { bool AccessibilityWindowInfoDataWrapper::IsNode() const {
return false; return false;
} }
...@@ -35,46 +39,108 @@ const gfx::Rect AccessibilityWindowInfoDataWrapper::GetBounds() const { ...@@ -35,46 +39,108 @@ const gfx::Rect AccessibilityWindowInfoDataWrapper::GetBounds() const {
} }
bool AccessibilityWindowInfoDataWrapper::IsVisibleToUser() const { bool AccessibilityWindowInfoDataWrapper::IsVisibleToUser() const {
// TODO(katie): Calculate this from properties.
return true; return true;
} }
bool AccessibilityWindowInfoDataWrapper::IsFocused() const { bool AccessibilityWindowInfoDataWrapper::IsFocused() const {
// TODO(katie): Calculate this from properties. // In Talkback, Android windows themselves cannot be focused. Only individual
// Is "input focus" the same as focus? // nodes within these windows can have focus.
// https://developer.android.com/reference/android/view/accessibility/AccessibilityWindowInfo.html#isFocused()
return false; return false;
} }
bool AccessibilityWindowInfoDataWrapper::CanBeAccessibilityFocused() const { bool AccessibilityWindowInfoDataWrapper::CanBeAccessibilityFocused() const {
// TODO(katie): Calculate this for windows. // Windows are too generic to be Accessibility focused in Chrome, although
// Can windows have a11y focus? // they can be Accessibility focused in Android by virtue of having
return true; // accessibility focus on nodes within themselves.
return false;
} }
void AccessibilityWindowInfoDataWrapper::PopulateAXRole( void AccessibilityWindowInfoDataWrapper::PopulateAXRole(
ui::AXNodeData* out_data) const { ui::AXNodeData* out_data) const {
// TODO(katie): Populate for windows using the window_type enum. switch (window_ptr_->window_type) {
case mojom::AccessibilityWindowType::TYPE_ACCESSIBILITY_OVERLAY:
out_data->role = ax::mojom::Role::kWindow;
return;
case mojom::AccessibilityWindowType::TYPE_APPLICATION:
out_data->role = ax::mojom::Role::kApplication;
return;
case mojom::AccessibilityWindowType::TYPE_INPUT_METHOD:
out_data->role = ax::mojom::Role::kKeyboard;
return;
case mojom::AccessibilityWindowType::TYPE_SPLIT_SCREEN_DIVIDER:
// A system window used to divide the screen in split-screen mode. This
// type of window is present only in split-screen mode.
out_data->role = ax::mojom::Role::kSplitter;
return;
case mojom::AccessibilityWindowType::TYPE_SYSTEM:
out_data->role = ax::mojom::Role::kWindow;
return;
}
} }
void AccessibilityWindowInfoDataWrapper::PopulateAXState( void AccessibilityWindowInfoDataWrapper::PopulateAXState(
ui::AXNodeData* out_data) const { ui::AXNodeData* out_data) const {
// TODO(katie): Populate for windows. // ARC++ window states are not reflected in ax::mojom::State, and for the
// most part aren't needed.
// Focusable in Android simply means a node within the window is focusable.
// Since the window itself is not focusable in Android, it doesn't make sense
// to include Focusable as an AXState.
} }
void AccessibilityWindowInfoDataWrapper::Serialize( void AccessibilityWindowInfoDataWrapper::Serialize(
ui::AXNodeData* out_data) const { ui::AXNodeData* out_data) const {
// TODO(katie): Serialize for windows. if (!tree_source_->GetRoot())
if (!tree_source_->GetRoot()) {
return; return;
// String properties.
std::string title;
if (GetProperty(mojom::AccessibilityWindowStringProperty::TITLE, &title)) {
out_data->SetName(title);
out_data->SetNameFrom(ax::mojom::NameFrom::kTitle);
}
// Bounds.
exo::WMHelper* wm_helper =
exo::WMHelper::HasInstance() ? exo::WMHelper::GetInstance() : nullptr;
if (tree_source_->GetRoot()->GetId() != -1 && wm_helper) {
aura::Window* active_window = tree_source_->is_notification()
? nullptr
: wm_helper->GetActiveWindow();
const gfx::Rect& local_bounds = tree_source_->GetBounds(
tree_source_->GetFromId(GetId()), active_window);
out_data->location.SetRect(local_bounds.x(), local_bounds.y(),
local_bounds.width(), local_bounds.height());
} }
// Not all properties are currently used in Chrome Accessibility.
// Boolean properties:
// Someday we may want to have a IN_PICTURE_IN_PICTURE_MODE state or a
// WINDOW_ACTIVE state, or to map the FOCUSED (i.e. has input focus) or
// ACCESSIBILITY_FOCUSED (i.e. some node within this window has accessibility
// focus) to new types.
// Integer properties:
// We could reflect ARC++ window properties like ANCHOR_NODE_ID,
// and LAYER_ORDER in ax::mojom::IntAttributes.
} }
const std::vector<int32_t>* AccessibilityWindowInfoDataWrapper::GetChildren() const std::vector<int32_t>* AccessibilityWindowInfoDataWrapper::GetChildren() {
const { if (children_.size() != 0)
// TODO(katie): Combine the root_node_id with the int_list_properties return &children_;
// of AccessibilityWindowIntListProperty::CHILD_WINDOW_IDS.
return nullptr; // Populate the children vector by combining the child window IDs with the
// root node ID.
if (window_ptr_->int_list_properties) {
auto it = window_ptr_->int_list_properties->find(
mojom::AccessibilityWindowIntListProperty::CHILD_WINDOW_IDS);
if (it != window_ptr_->int_list_properties->end()) {
children_.insert(children_.begin(), it->second.begin(), it->second.end());
}
}
if (window_ptr_->root_node_id)
children_.push_back(window_ptr_->root_node_id);
return &children_;
} }
bool AccessibilityWindowInfoDataWrapper::GetProperty( bool AccessibilityWindowInfoDataWrapper::GetProperty(
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_CHROMEOS_ARC_ACCESSIBILITY_ACCESSIBILITY_WINDOW_INFO_DATA_WRAPPER_H_ #ifndef CHROME_BROWSER_CHROMEOS_ARC_ACCESSIBILITY_ACCESSIBILITY_WINDOW_INFO_DATA_WRAPPER_H_
#define CHROME_BROWSER_CHROMEOS_ARC_ACCESSIBILITY_ACCESSIBILITY_WINDOW_INFO_DATA_WRAPPER_H_ #define CHROME_BROWSER_CHROMEOS_ARC_ACCESSIBILITY_ACCESSIBILITY_WINDOW_INFO_DATA_WRAPPER_H_
#include <vector>
#include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_info_data.h" #include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_info_data.h"
#include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_node_data.h"
...@@ -18,6 +20,7 @@ class AccessibilityWindowInfoDataWrapper : public ArcAccessibilityInfoData { ...@@ -18,6 +20,7 @@ class AccessibilityWindowInfoDataWrapper : public ArcAccessibilityInfoData {
explicit AccessibilityWindowInfoDataWrapper( explicit AccessibilityWindowInfoDataWrapper(
AXTreeSourceArc* tree_source, AXTreeSourceArc* tree_source,
mojom::AccessibilityWindowInfoData* window); mojom::AccessibilityWindowInfoData* window);
~AccessibilityWindowInfoDataWrapper() override;
// ArcAccessibilityInfoData overrides. // ArcAccessibilityInfoData overrides.
bool IsNode() const override; bool IsNode() const override;
...@@ -31,7 +34,7 @@ class AccessibilityWindowInfoDataWrapper : public ArcAccessibilityInfoData { ...@@ -31,7 +34,7 @@ class AccessibilityWindowInfoDataWrapper : public ArcAccessibilityInfoData {
void PopulateAXRole(ui::AXNodeData* out_data) const override; void PopulateAXRole(ui::AXNodeData* out_data) const override;
void PopulateAXState(ui::AXNodeData* out_data) const override; void PopulateAXState(ui::AXNodeData* out_data) const override;
void Serialize(ui::AXNodeData* out_data) const override; void Serialize(ui::AXNodeData* out_data) const override;
const std::vector<int32_t>* GetChildren() const override; const std::vector<int32_t>* GetChildren() override;
private: private:
bool GetProperty(mojom::AccessibilityWindowBooleanProperty prop) const; bool GetProperty(mojom::AccessibilityWindowBooleanProperty prop) const;
...@@ -45,6 +48,7 @@ class AccessibilityWindowInfoDataWrapper : public ArcAccessibilityInfoData { ...@@ -45,6 +48,7 @@ class AccessibilityWindowInfoDataWrapper : public ArcAccessibilityInfoData {
AXTreeSourceArc* tree_source_ = nullptr; AXTreeSourceArc* tree_source_ = nullptr;
mojom::AccessibilityWindowInfoData* window_ptr_ = nullptr; mojom::AccessibilityWindowInfoData* window_ptr_ = nullptr;
std::vector<int32_t> children_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityWindowInfoDataWrapper); DISALLOW_COPY_AND_ASSIGN(AccessibilityWindowInfoDataWrapper);
}; };
......
...@@ -37,7 +37,7 @@ class ArcAccessibilityInfoData { ...@@ -37,7 +37,7 @@ class ArcAccessibilityInfoData {
virtual void PopulateAXRole(ui::AXNodeData* out_data) const = 0; virtual void PopulateAXRole(ui::AXNodeData* out_data) const = 0;
virtual void PopulateAXState(ui::AXNodeData* out_data) const = 0; virtual void PopulateAXState(ui::AXNodeData* out_data) const = 0;
virtual void Serialize(ui::AXNodeData* out_data) const = 0; virtual void Serialize(ui::AXNodeData* out_data) const = 0;
virtual const std::vector<int32_t>* GetChildren() const = 0; virtual const std::vector<int32_t>* GetChildren() = 0;
}; };
} // namespace arc } // namespace arc
......
...@@ -263,6 +263,8 @@ void AXTreeSourceArc::SerializeNode(ArcAccessibilityInfoData* info_data, ...@@ -263,6 +263,8 @@ void AXTreeSourceArc::SerializeNode(ArcAccessibilityInfoData* info_data,
int32_t id = info_data->GetId(); int32_t id = info_data->GetId();
out_data->id = id; out_data->id = id;
// TODO(katie): this may not hold true with Windows. it's probably the root
// window's root node which is a kRootWebArea.
if (id == root_id_) if (id == root_id_)
out_data->role = ax::mojom::Role::kRootWebArea; out_data->role = ax::mojom::Role::kRootWebArea;
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment