summaryrefslogtreecommitdiff
path: root/chromium/ui/views/accessibility
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-03-08 10:28:10 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-03-20 13:40:30 +0000
commite733310db58160074f574c429d48f8308c0afe17 (patch)
treef8aef4b7e62a69928dbcf880620eece20f98c6df /chromium/ui/views/accessibility
parent2f583e4aec1ae3a86fa047829c96b310dc12ecdf (diff)
downloadqtwebengine-chromium-e733310db58160074f574c429d48f8308c0afe17.tar.gz
BASELINE: Update Chromium to 56.0.2924.122
Change-Id: I4e04de8f47e47e501c46ed934c76a431c6337ced Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/ui/views/accessibility')
-rw-r--r--chromium/ui/views/accessibility/ax_aura_obj_cache.cc24
-rw-r--r--chromium/ui/views/accessibility/ax_aura_obj_cache.h3
-rw-r--r--chromium/ui/views/accessibility/ax_view_obj_wrapper.cc21
-rw-r--r--chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc6
-rw-r--r--chromium/ui/views/accessibility/ax_widget_obj_wrapper.h1
-rw-r--r--chromium/ui/views/accessibility/native_view_accessibility.cc57
-rw-r--r--chromium/ui/views/accessibility/native_view_accessibility.h4
-rw-r--r--chromium/ui/views/accessibility/native_view_accessibility_auralinux.cc5
-rw-r--r--chromium/ui/views/accessibility/native_view_accessibility_unittest.cc22
-rw-r--r--chromium/ui/views/accessibility/native_view_accessibility_win.cc2
10 files changed, 87 insertions, 58 deletions
diff --git a/chromium/ui/views/accessibility/ax_aura_obj_cache.cc b/chromium/ui/views/accessibility/ax_aura_obj_cache.cc
index 0f47bb4b674..ad9df5c9fdd 100644
--- a/chromium/ui/views/accessibility/ax_aura_obj_cache.cc
+++ b/chromium/ui/views/accessibility/ax_aura_obj_cache.cc
@@ -6,6 +6,8 @@
#include "base/memory/ptr_util.h"
#include "base/memory/singleton.h"
+#include "base/strings/string_util.h"
+#include "ui/aura/client/aura_constants.h"
#include "ui/aura/client/focus_client.h"
#include "ui/aura/window.h"
#include "ui/views/accessibility/ax_aura_obj_wrapper.h"
@@ -116,6 +118,12 @@ AXAuraObjWrapper* AXAuraObjCache::GetFocus() {
return nullptr;
}
+void AXAuraObjCache::OnFocusedViewChanged() {
+ View* view = GetFocusedView();
+ if (view)
+ view->NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, true);
+}
+
AXAuraObjCache::AXAuraObjCache()
: current_id_(1),
focus_client_(nullptr),
@@ -151,14 +159,22 @@ View* AXAuraObjCache::GetFocusedView() {
if (!focus_manager)
return nullptr;
- return focus_manager->GetFocusedView();
+ View* focused_view = focus_manager->GetFocusedView();
+ if (focused_view)
+ return focused_view;
+
+ if (focused_window->GetProperty(
+ aura::client::kAccessibilityFocusFallsbackToWidgetKey)) {
+ // If no view is focused, falls back to root view.
+ return focused_widget->GetRootView();
+ }
+
+ return nullptr;
}
void AXAuraObjCache::OnWindowFocused(aura::Window* gained_focus,
aura::Window* lost_focus) {
- View* view = GetFocusedView();
- if (view)
- view->NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, true);
+ OnFocusedViewChanged();
}
void AXAuraObjCache::OnWindowDestroying(aura::Window* window) {
diff --git a/chromium/ui/views/accessibility/ax_aura_obj_cache.h b/chromium/ui/views/accessibility/ax_aura_obj_cache.h
index fc9a8c91352..c73abe1ad85 100644
--- a/chromium/ui/views/accessibility/ax_aura_obj_cache.h
+++ b/chromium/ui/views/accessibility/ax_aura_obj_cache.h
@@ -82,6 +82,9 @@ class VIEWS_EXPORT AXAuraObjCache
// Get the object that has focus.
AXAuraObjWrapper* GetFocus();
+ // Send a notification that the focused view may have changed.
+ void OnFocusedViewChanged();
+
// Indicates if this object's currently being destroyed.
bool is_destroying() { return is_destroying_; }
diff --git a/chromium/ui/views/accessibility/ax_view_obj_wrapper.cc b/chromium/ui/views/accessibility/ax_view_obj_wrapper.cc
index b043dedc504..d2a496f7298 100644
--- a/chromium/ui/views/accessibility/ax_view_obj_wrapper.cc
+++ b/chromium/ui/views/accessibility/ax_view_obj_wrapper.cc
@@ -6,7 +6,7 @@
#include "base/strings/utf_string_conversions.h"
#include "ui/accessibility/ax_node_data.h"
-#include "ui/accessibility/ax_view_state.h"
+#include "ui/accessibility/ax_node_data.h"
#include "ui/events/event_utils.h"
#include "ui/views/accessibility/ax_aura_obj_cache.h"
#include "ui/views/view.h"
@@ -46,32 +46,17 @@ void AXViewObjWrapper::GetChildren(
}
void AXViewObjWrapper::Serialize(ui::AXNodeData* out_node_data) {
- ui::AXViewState view_data;
- view_->GetAccessibleState(&view_data);
+ out_node_data->state = 0;
+ view_->GetAccessibleNodeData(out_node_data);
out_node_data->id = GetID();
- out_node_data->role = view_data.role;
- out_node_data->state = view_data.state();
if (view_->IsFocusable())
out_node_data->state |= 1 << ui::AX_STATE_FOCUSABLE;
if (!view_->visible())
out_node_data->state |= 1 << ui::AX_STATE_INVISIBLE;
out_node_data->location = gfx::RectF(view_->GetBoundsInScreen());
-
- out_node_data->AddStringAttribute(
- ui::AX_ATTR_NAME, base::UTF16ToUTF8(view_data.name));
- out_node_data->AddStringAttribute(
- ui::AX_ATTR_VALUE, base::UTF16ToUTF8(view_data.value));
-
- if (view_data.selection_start > -1 && view_data.selection_end > -1) {
- out_node_data->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_START,
- view_data.selection_start);
-
- out_node_data->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_END,
- view_data.selection_end);
- }
}
int32_t AXViewObjWrapper::GetID() {
diff --git a/chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc b/chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc
index 2a05b196651..70307b919d3 100644
--- a/chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc
+++ b/chromium/ui/views/accessibility/ax_widget_obj_wrapper.cc
@@ -62,6 +62,12 @@ void AXWidgetObjWrapper::OnWidgetClosing(Widget* widget) {
AXAuraObjCache::GetInstance()->Remove(widget);
}
+void AXWidgetObjWrapper::OnWidgetVisibilityChanged(Widget*, bool) {
+ // If a widget changes visibility it may affect what's focused, in particular
+ // when a widget that contains the focused view gets hidden.
+ AXAuraObjCache::GetInstance()->OnFocusedViewChanged();
+}
+
void AXWidgetObjWrapper::OnWillRemoveView(Widget* widget, View* view) {
AXAuraObjCache::GetInstance()->RemoveViewSubtree(view);
}
diff --git a/chromium/ui/views/accessibility/ax_widget_obj_wrapper.h b/chromium/ui/views/accessibility/ax_widget_obj_wrapper.h
index 244fca50176..88512cdcc6d 100644
--- a/chromium/ui/views/accessibility/ax_widget_obj_wrapper.h
+++ b/chromium/ui/views/accessibility/ax_widget_obj_wrapper.h
@@ -32,6 +32,7 @@ class AXWidgetObjWrapper : public AXAuraObjWrapper,
// WidgetObserver overrides.
void OnWidgetDestroying(Widget* widget) override;
void OnWidgetClosing(Widget* widget) override;
+ void OnWidgetVisibilityChanged(Widget*, bool) override;
// WidgetRemovalsObserver overrides.
void OnWillRemoveView(Widget* widget, View* view) override;
diff --git a/chromium/ui/views/accessibility/native_view_accessibility.cc b/chromium/ui/views/accessibility/native_view_accessibility.cc
index a984c3c6c08..04a0fa5afb9 100644
--- a/chromium/ui/views/accessibility/native_view_accessibility.cc
+++ b/chromium/ui/views/accessibility/native_view_accessibility.cc
@@ -6,7 +6,8 @@
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
-#include "ui/accessibility/ax_view_state.h"
+#include "ui/accessibility/ax_action_data.h"
+#include "ui/accessibility/ax_node_data.h"
#include "ui/events/event_utils.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/controls/native/native_view_host.h"
@@ -53,6 +54,7 @@ void NativeViewAccessibility::NotifyAccessibilityEvent(ui::AXEvent event_type) {
const ui::AXNodeData& NativeViewAccessibility::GetData() {
data_ = ui::AXNodeData();
+ data_.state = 0;
// Views may misbehave if their widget is closed; return an unknown role
// rather than possibly crashing.
@@ -62,27 +64,12 @@ const ui::AXNodeData& NativeViewAccessibility::GetData() {
return data_;
}
- ui::AXViewState state;
- view_->GetAccessibleState(&state);
- data_.role = state.role;
- data_.state = state.state();
+ view_->GetAccessibleNodeData(&data_);
data_.location = gfx::RectF(view_->GetBoundsInScreen());
- data_.AddStringAttribute(ui::AX_ATTR_NAME, base::UTF16ToUTF8(state.name));
- data_.AddStringAttribute(ui::AX_ATTR_VALUE, base::UTF16ToUTF8(state.value));
- data_.AddStringAttribute(ui::AX_ATTR_ACTION,
- base::UTF16ToUTF8(state.default_action));
- data_.AddStringAttribute(ui::AX_ATTR_SHORTCUT,
- base::UTF16ToUTF8(state.keyboard_shortcut));
- data_.AddStringAttribute(ui::AX_ATTR_PLACEHOLDER,
- base::UTF16ToUTF8(state.placeholder));
-
- if (state.description.empty() &&
- view_->GetTooltipText(gfx::Point(), &state.description))
- data_.AddStringAttribute(ui::AX_ATTR_DESCRIPTION,
- base::UTF16ToUTF8(state.description));
-
- data_.AddIntAttribute(ui::AX_ATTR_TEXT_SEL_START, state.selection_start);
- data_.AddIntAttribute(ui::AX_ATTR_TEXT_SEL_END, state.selection_end);
+ base::string16 description;
+ view_->GetTooltipText(gfx::Point(), &description);
+ data_.AddStringAttribute(ui::AX_ATTR_DESCRIPTION,
+ base::UTF16ToUTF8(description));
data_.state |= (1 << ui::AX_STATE_FOCUSABLE);
@@ -213,22 +200,32 @@ void NativeViewAccessibility::DoDefaultAction() {
ui::EF_LEFT_MOUSE_BUTTON));
}
-bool NativeViewAccessibility::SetStringValue(const base::string16& new_value) {
+bool NativeViewAccessibility::SetStringValue(const base::string16& new_value,
+ bool clear_first) {
// Return an error if the view can't set the value.
if (!CanSetStringValue())
return false;
- ui::AXViewState state;
- view_->GetAccessibleState(&state);
- state.set_value_callback.Run(new_value);
- return true;
+ ui::AXActionData action_data;
+ action_data.value = new_value;
+ action_data.action = clear_first ? ui::AX_ACTION_SET_VALUE
+ : ui::AX_ACTION_REPLACE_SELECTED_TEXT;
+ return view_->HandleAccessibleAction(action_data);
}
bool NativeViewAccessibility::CanSetStringValue() {
- ui::AXViewState state;
- view_->GetAccessibleState(&state);
- return !ui::AXViewState::IsFlagSet(GetData().state, ui::AX_STATE_READ_ONLY) &&
- !state.set_value_callback.is_null();
+ return !ui::AXNodeData::IsFlagSet(GetData().state, ui::AX_STATE_READ_ONLY);
+}
+
+bool NativeViewAccessibility::SetFocused(bool focused) {
+ if (!ui::AXNodeData::IsFlagSet(GetData().state, ui::AX_STATE_FOCUSABLE))
+ return false;
+
+ if (focused)
+ view_->RequestFocus();
+ else if (view_->HasFocus())
+ view_->GetFocusManager()->ClearFocus();
+ return true;
}
void NativeViewAccessibility::OnWidgetDestroying(Widget* widget) {
diff --git a/chromium/ui/views/accessibility/native_view_accessibility.h b/chromium/ui/views/accessibility/native_view_accessibility.h
index 95fcc3de365..46752135924 100644
--- a/chromium/ui/views/accessibility/native_view_accessibility.h
+++ b/chromium/ui/views/accessibility/native_view_accessibility.h
@@ -56,8 +56,10 @@ class VIEWS_EXPORT NativeViewAccessibility
gfx::NativeViewAccessible GetFocus() override;
gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent() override;
void DoDefaultAction() override;
- bool SetStringValue(const base::string16& new_value) override;
+ bool SetStringValue(const base::string16& new_value,
+ bool clear_first) override;
bool CanSetStringValue() override;
+ bool SetFocused(bool focused) override;
// WidgetObserver
void OnWidgetDestroying(Widget* widget) override;
diff --git a/chromium/ui/views/accessibility/native_view_accessibility_auralinux.cc b/chromium/ui/views/accessibility/native_view_accessibility_auralinux.cc
index 8e68cc00bff..3ed2c2d8310 100644
--- a/chromium/ui/views/accessibility/native_view_accessibility_auralinux.cc
+++ b/chromium/ui/views/accessibility/native_view_accessibility_auralinux.cc
@@ -109,12 +109,15 @@ class AuraLinuxApplication
void DoDefaultAction() override {
}
- bool SetStringValue(const base::string16& new_value) override {
+ bool SetStringValue(const base::string16& new_value,
+ bool clear_first) override {
return false;
}
bool CanSetStringValue() override { return false; }
+ bool SetFocused(bool focused) override { return false; }
+
private:
friend struct base::DefaultSingletonTraits<AuraLinuxApplication>;
diff --git a/chromium/ui/views/accessibility/native_view_accessibility_unittest.cc b/chromium/ui/views/accessibility/native_view_accessibility_unittest.cc
index 37435e205a1..4fd1b1e545b 100644
--- a/chromium/ui/views/accessibility/native_view_accessibility_unittest.cc
+++ b/chromium/ui/views/accessibility/native_view_accessibility_unittest.cc
@@ -2,8 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/ptr_util.h"
#include "base/strings/utf_string_conversions.h"
-#include "ui/accessibility/ax_view_state.h"
+#include "ui/accessibility/ax_node_data.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/views/accessibility/native_view_accessibility.h"
#include "ui/views/controls/button/button.h"
@@ -34,7 +35,7 @@ class NativeViewAccessibilityTest : public ViewsTestBase {
widget_ = new views::Widget;
views::Widget::InitParams params =
- CreateParams(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
+ CreateParams(views::Widget::InitParams::TYPE_WINDOW);
params.bounds = gfx::Rect(0, 0, 200, 200);
widget_->Init(params);
@@ -46,7 +47,7 @@ class NativeViewAccessibilityTest : public ViewsTestBase {
button_->AddChildView(label_);
label_accessibility_ = NativeViewAccessibility::Create(label_);
- widget_->SetContentsView(button_);
+ widget_->GetContentsView()->AddChildView(button_);
}
void TearDown() override {
@@ -87,6 +88,21 @@ TEST_F(NativeViewAccessibilityTest, LabelIsChildOfButton) {
label_accessibility_->GetParent());
}
+TEST_F(NativeViewAccessibilityTest, WritableFocus) {
+ widget_->Show();
+ // Make |button_| focusable, and focus/unfocus it via NativeViewAccessibility.
+ button_->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+ EXPECT_EQ(nullptr, button_->GetFocusManager()->GetFocusedView());
+ EXPECT_EQ(nullptr, button_accessibility_->GetFocus());
+ EXPECT_TRUE(button_accessibility_->SetFocused(true));
+ EXPECT_EQ(button_, button_->GetFocusManager()->GetFocusedView());
+ EXPECT_EQ(button_->GetNativeViewAccessible(),
+ button_accessibility_->GetFocus());
+ EXPECT_TRUE(button_accessibility_->SetFocused(false));
+ EXPECT_EQ(nullptr, button_->GetFocusManager()->GetFocusedView());
+ EXPECT_EQ(nullptr, button_accessibility_->GetFocus());
+}
+
// Subclass of NativeViewAccessibility that destroys itself when its
// parent widget is destroyed, for the purposes of making sure this
// doesn't lead to a crash.
diff --git a/chromium/ui/views/accessibility/native_view_accessibility_win.cc b/chromium/ui/views/accessibility/native_view_accessibility_win.cc
index fd9edaa3e29..fee8d9ea336 100644
--- a/chromium/ui/views/accessibility/native_view_accessibility_win.cc
+++ b/chromium/ui/views/accessibility/native_view_accessibility_win.cc
@@ -15,8 +15,8 @@
#include "base/win/windows_version.h"
#include "third_party/iaccessible2/ia2_api_all.h"
#include "ui/accessibility/ax_enums.h"
+#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/ax_text_utils.h"
-#include "ui/accessibility/ax_view_state.h"
#include "ui/base/win/accessibility_misc_utils.h"
#include "ui/base/win/atl_module.h"
#include "ui/views/controls/button/custom_button.h"