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 |