Commit c1ae0872 authored by dmazzoni's avatar dmazzoni Committed by Commit bot

Clean up setting accessibility focus.

Consolidate the code to set accessibility focus to one place.
Fix it so we never set accessibility focus to the same id twice in a row,
as that puts things in a weird state (because we then get a "clear"
accessibility focus action on the current focused view).

In a couple of places where we want to explicitly update the focus,
set focus away and then back again so Android can't ignore it.

BUG=407871

Review URL: https://codereview.chromium.org/513483002

Cr-Commit-Position: refs/heads/master@{#292386}
parent 33da11d3
...@@ -164,13 +164,8 @@ public class BrowserAccessibilityManager { ...@@ -164,13 +164,8 @@ public class BrowserAccessibilityManager {
switch (action) { switch (action) {
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS: case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
if (mAccessibilityFocusId == virtualViewId) { if (!moveAccessibilityFocusToId(virtualViewId)) return true;
return true;
}
mAccessibilityFocusId = virtualViewId;
sendAccessibilityEvent(mAccessibilityFocusId,
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
if (!mIsHovering) { if (!mIsHovering) {
nativeScrollToMakeNodeVisible( nativeScrollToMakeNodeVisible(
mNativeObj, mAccessibilityFocusId); mNativeObj, mAccessibilityFocusId);
...@@ -270,8 +265,7 @@ public class BrowserAccessibilityManager { ...@@ -270,8 +265,7 @@ public class BrowserAccessibilityManager {
// (Re-) focus focused element, since we weren't able to create an // (Re-) focus focused element, since we weren't able to create an
// AccessibilityNodeInfo for this element before. // AccessibilityNodeInfo for this element before.
if (mAccessibilityFocusId != View.NO_ID) { if (mAccessibilityFocusId != View.NO_ID) {
sendAccessibilityEvent(mAccessibilityFocusId, moveAccessibilityFocusToIdAndRefocusIfNeeded(mAccessibilityFocusId);
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
} }
} }
...@@ -280,11 +274,33 @@ public class BrowserAccessibilityManager { ...@@ -280,11 +274,33 @@ public class BrowserAccessibilityManager {
if (id == 0) if (id == 0)
return false; return false;
mAccessibilityFocusId = id; moveAccessibilityFocusToId(id);
sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); return true;
}
private boolean moveAccessibilityFocusToId(int newAccessibilityFocusId) {
if (newAccessibilityFocusId == mAccessibilityFocusId)
return false;
mAccessibilityFocusId = newAccessibilityFocusId;
sendAccessibilityEvent(mAccessibilityFocusId,
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
return true; return true;
} }
private void moveAccessibilityFocusToIdAndRefocusIfNeeded(int newAccessibilityFocusId) {
// Work around a bug in the Android framework where it doesn't fully update the object
// with accessibility focus even if you send it a WINDOW_CONTENT_CHANGED. To work around
// this, clear focus and then set focus again.
if (newAccessibilityFocusId == mAccessibilityFocusId) {
sendAccessibilityEvent(newAccessibilityFocusId,
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
mAccessibilityFocusId = View.NO_ID;
}
moveAccessibilityFocusToId(newAccessibilityFocusId);
}
private void sendAccessibilityEvent(int virtualViewId, int eventType) { private void sendAccessibilityEvent(int virtualViewId, int eventType) {
// If we don't have any frame info, then the virtual hierarchy // If we don't have any frame info, then the virtual hierarchy
// doesn't exist in the view of the Android framework, so should // doesn't exist in the view of the Android framework, so should
...@@ -371,20 +387,14 @@ public class BrowserAccessibilityManager { ...@@ -371,20 +387,14 @@ public class BrowserAccessibilityManager {
if (mUserHasTouchExplored) return; if (mUserHasTouchExplored) return;
if (mContentViewCore.shouldSetAccessibilityFocusOnPageLoad()) { if (mContentViewCore.shouldSetAccessibilityFocusOnPageLoad()) {
mAccessibilityFocusId = id; moveAccessibilityFocusToIdAndRefocusIfNeeded(id);
sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
} }
} }
@CalledByNative @CalledByNative
private void handleFocusChanged(int id) { private void handleFocusChanged(int id) {
sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_FOCUSED); sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_FOCUSED);
moveAccessibilityFocusToId(id);
// Update accessibility focus if not already set to this node.
if (mAccessibilityFocusId != id) {
sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
mAccessibilityFocusId = id;
}
} }
@CalledByNative @CalledByNative
...@@ -428,12 +438,7 @@ public class BrowserAccessibilityManager { ...@@ -428,12 +438,7 @@ public class BrowserAccessibilityManager {
@CalledByNative @CalledByNative
private void handleScrolledToAnchor(int id) { private void handleScrolledToAnchor(int id) {
if (mAccessibilityFocusId == id) { moveAccessibilityFocusToId(id);
return;
}
mAccessibilityFocusId = id;
sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
} }
@CalledByNative @CalledByNative
......
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