Commit 8b03e46b authored by Marialicia Villarreal Garcia's avatar Marialicia Villarreal Garcia Committed by Commit Bot

Sync VoiceOver and system focus on navigation through web content

When navigating in the frame, the "first responder" that has focus is
the view. So when trying to move from frame to web content, the first
responder does not get updated, which makes VO not respond to the focus
events being fired within web content.

This fix is so that when a focus event is fired for the web content,
set it as the first responder if it has not been set yet. This only gets
called by screen readers when navigating with scan mode (arrow keys).

This change has been verified in Mac with VO and in Windows with
NVDA and Narrator (IA2 and UIA).

AccessibilityActionBrowserTest.FocusAction already tests the main action
of BrowserAccessibilityManager::SetFocus.

Bug: 990014
Change-Id: Iaec036a14743c77b26f68ef10b0515aa7034cdf7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1809943Reviewed-by: default avatarIan Prest <iapres@microsoft.com>
Reviewed-by: default avatarKen Buchanan <kenrb@chromium.org>
Reviewed-by: default avatarAaron Leventhal <aleventhal@chromium.org>
Reviewed-by: default avatarNektarios Paisios <nektar@chromium.org>
Commit-Queue: Nektarios Paisios <nektar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#702063}
parent 1431337f
...@@ -641,6 +641,8 @@ void BrowserAccessibilityManager::SetFocus(const BrowserAccessibility& node) { ...@@ -641,6 +641,8 @@ void BrowserAccessibilityManager::SetFocus(const BrowserAccessibility& node) {
ui::AXActionData action_data; ui::AXActionData action_data;
action_data.action = ax::mojom::Action::kFocus; action_data.action = ax::mojom::Action::kFocus;
action_data.target_node_id = node.GetId(); action_data.target_node_id = node.GetId();
if (!delegate_->AccessibilityViewHasFocus())
delegate_->AccessibilityViewSetFocus();
delegate_->AccessibilityPerformAction(action_data); delegate_->AccessibilityPerformAction(action_data);
} }
......
...@@ -82,6 +82,7 @@ class CONTENT_EXPORT BrowserAccessibilityDelegate { ...@@ -82,6 +82,7 @@ class CONTENT_EXPORT BrowserAccessibilityDelegate {
virtual void AccessibilityPerformAction(const ui::AXActionData& data) = 0; virtual void AccessibilityPerformAction(const ui::AXActionData& data) = 0;
virtual bool AccessibilityViewHasFocus() const = 0; virtual bool AccessibilityViewHasFocus() const = 0;
virtual void AccessibilityViewSetFocus() = 0;
virtual gfx::Rect AccessibilityGetViewBounds() const = 0; virtual gfx::Rect AccessibilityGetViewBounds() const = 0;
virtual float AccessibilityGetDeviceScaleFactor() const = 0; virtual float AccessibilityGetDeviceScaleFactor() const = 0;
virtual void AccessibilityFatalError() = 0; virtual void AccessibilityFatalError() = 0;
......
...@@ -18,6 +18,8 @@ bool TestBrowserAccessibilityDelegate::AccessibilityViewHasFocus() const { ...@@ -18,6 +18,8 @@ bool TestBrowserAccessibilityDelegate::AccessibilityViewHasFocus() const {
return false; return false;
} }
void TestBrowserAccessibilityDelegate::AccessibilityViewSetFocus() {}
gfx::Rect TestBrowserAccessibilityDelegate::AccessibilityGetViewBounds() const { gfx::Rect TestBrowserAccessibilityDelegate::AccessibilityGetViewBounds() const {
return gfx::Rect(); return gfx::Rect();
} }
......
...@@ -15,6 +15,7 @@ class TestBrowserAccessibilityDelegate : public BrowserAccessibilityDelegate { ...@@ -15,6 +15,7 @@ class TestBrowserAccessibilityDelegate : public BrowserAccessibilityDelegate {
void AccessibilityPerformAction(const ui::AXActionData& data) override; void AccessibilityPerformAction(const ui::AXActionData& data) override;
bool AccessibilityViewHasFocus() const override; bool AccessibilityViewHasFocus() const override;
void AccessibilityViewSetFocus() override;
gfx::Rect AccessibilityGetViewBounds() const override; gfx::Rect AccessibilityGetViewBounds() const override;
float AccessibilityGetDeviceScaleFactor() const override; float AccessibilityGetDeviceScaleFactor() const override;
void AccessibilityFatalError() override; void AccessibilityFatalError() override;
......
...@@ -1597,6 +1597,12 @@ bool RenderFrameHostImpl::AccessibilityViewHasFocus() const { ...@@ -1597,6 +1597,12 @@ bool RenderFrameHostImpl::AccessibilityViewHasFocus() const {
return false; return false;
} }
void RenderFrameHostImpl::AccessibilityViewSetFocus() {
RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView();
if (view)
view->Focus();
}
gfx::Rect RenderFrameHostImpl::AccessibilityGetViewBounds() const { gfx::Rect RenderFrameHostImpl::AccessibilityGetViewBounds() const {
RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView(); RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView();
if (view) if (view)
......
...@@ -328,6 +328,7 @@ class CONTENT_EXPORT RenderFrameHostImpl ...@@ -328,6 +328,7 @@ class CONTENT_EXPORT RenderFrameHostImpl
// BrowserAccessibilityDelegate // BrowserAccessibilityDelegate
void AccessibilityPerformAction(const ui::AXActionData& data) override; void AccessibilityPerformAction(const ui::AXActionData& data) override;
bool AccessibilityViewHasFocus() const override; bool AccessibilityViewHasFocus() const override;
void AccessibilityViewSetFocus() override;
gfx::Rect AccessibilityGetViewBounds() const override; gfx::Rect AccessibilityGetViewBounds() const override;
float AccessibilityGetDeviceScaleFactor() const override; float AccessibilityGetDeviceScaleFactor() const override;
void AccessibilityFatalError() override; void AccessibilityFatalError() override;
......
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