diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-03-08 10:28:10 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-03-20 13:40:30 +0000 |
commit | e733310db58160074f574c429d48f8308c0afe17 (patch) | |
tree | f8aef4b7e62a69928dbcf880620eece20f98c6df /chromium/ui/views/accessibility | |
parent | 2f583e4aec1ae3a86fa047829c96b310dc12ecdf (diff) | |
download | qtwebengine-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')
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" |