diff options
author | dmazzoni <dmazzoni@chromium.org> | 2014-08-28 08:38:04 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-28 15:39:22 +0000 |
commit | c1ae0872e4c0336406ad47f6ab332174c3da80d5 (patch) | |
tree | 2e091949e17fdb2e8cf1093aa9d87ddcdb41e342 /content | |
parent | 33da11d3d057abf0481a4ce4efd5408837f33e77 (diff) | |
download | chromium_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.java | 53 |
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 |