summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authordmazzoni <dmazzoni@chromium.org>2014-08-28 08:38:04 -0700
committerCommit bot <commit-bot@chromium.org>2014-08-28 15:39:22 +0000
commitc1ae0872e4c0336406ad47f6ab332174c3da80d5 (patch)
tree2e091949e17fdb2e8cf1093aa9d87ddcdb41e342 /content
parent33da11d3d057abf0481a4ce4efd5408837f33e77 (diff)
downloadchromium_src-c1ae0872e4c0336406ad47f6ab332174c3da80d5.zip
chromium_src-c1ae0872e4c0336406ad47f6ab332174c3da80d5.tar.gz
chromium_src-c1ae0872e4c0336406ad47f6ab332174c3da80d5.tar.bz2
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}
Diffstat (limited to 'content')
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java53
1 files changed, 29 insertions, 24 deletions
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
index 8ba9800c62..da8ff8f 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
@@ -164,13 +164,8 @@ public class BrowserAccessibilityManager {
switch (action) {
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
- if (mAccessibilityFocusId == virtualViewId) {
- return true;
- }
+ if (!moveAccessibilityFocusToId(virtualViewId)) return true;
- mAccessibilityFocusId = virtualViewId;
- sendAccessibilityEvent(mAccessibilityFocusId,
- AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
if (!mIsHovering) {
nativeScrollToMakeNodeVisible(
mNativeObj, mAccessibilityFocusId);
@@ -270,8 +265,7 @@ public class BrowserAccessibilityManager {
// (Re-) focus focused element, since we weren't able to create an
// AccessibilityNodeInfo for this element before.
if (mAccessibilityFocusId != View.NO_ID) {
- sendAccessibilityEvent(mAccessibilityFocusId,
- AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
+ moveAccessibilityFocusToIdAndRefocusIfNeeded(mAccessibilityFocusId);
}
}
@@ -280,11 +274,33 @@ public class BrowserAccessibilityManager {
if (id == 0)
return false;
- mAccessibilityFocusId = id;
- sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
+ moveAccessibilityFocusToId(id);
+ return true;
+ }
+
+ private boolean moveAccessibilityFocusToId(int newAccessibilityFocusId) {
+ if (newAccessibilityFocusId == mAccessibilityFocusId)
+ return false;
+
+ mAccessibilityFocusId = newAccessibilityFocusId;
+ sendAccessibilityEvent(mAccessibilityFocusId,
+ AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
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) {
// If we don't have any frame info, then the virtual hierarchy
// doesn't exist in the view of the Android framework, so should
@@ -371,20 +387,14 @@ public class BrowserAccessibilityManager {
if (mUserHasTouchExplored) return;
if (mContentViewCore.shouldSetAccessibilityFocusOnPageLoad()) {
- mAccessibilityFocusId = id;
- sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
+ moveAccessibilityFocusToIdAndRefocusIfNeeded(id);
}
}
@CalledByNative
private void handleFocusChanged(int id) {
sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_FOCUSED);
-
- // Update accessibility focus if not already set to this node.
- if (mAccessibilityFocusId != id) {
- sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
- mAccessibilityFocusId = id;
- }
+ moveAccessibilityFocusToId(id);
}
@CalledByNative
@@ -428,12 +438,7 @@ public class BrowserAccessibilityManager {
@CalledByNative
private void handleScrolledToAnchor(int id) {
- if (mAccessibilityFocusId == id) {
- return;
- }
-
- mAccessibilityFocusId = id;
- sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
+ moveAccessibilityFocusToId(id);
}
@CalledByNative