Chromium Code Reviews| Index: content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java |
| 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 8ba9800c62bd87cdf98b2741f7de52f806f47757..da8ff8fa8bfc826b2132b7ff048ab888467af06e 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); |
|
dmazzoni
2014/08/27 19:27:11
I changed this to a focus clear, as suggested in t
|
| + 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 |