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 da8ff8fa8bfc826b2132b7ff048ab888467af06e..644652b3e5a133eb54458a48d99d2f174b8c81f4 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 |
@@ -45,6 +45,7 @@ public class BrowserAccessibilityManager { |
private final RenderCoordinates mRenderCoordinates; |
private long mNativeObj; |
private int mAccessibilityFocusId; |
+ private Rect mAccessibilityFocusRect; |
private boolean mIsHovering; |
private int mLastHoverId = View.NO_ID; |
private int mCurrentRootId; |
@@ -178,6 +179,7 @@ public class BrowserAccessibilityManager { |
sendAccessibilityEvent(mAccessibilityFocusId, |
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED); |
mAccessibilityFocusId = View.NO_ID; |
+ mAccessibilityFocusRect = null; |
} |
return true; |
case AccessibilityNodeInfo.ACTION_CLICK: |
@@ -283,6 +285,7 @@ public class BrowserAccessibilityManager { |
return false; |
mAccessibilityFocusId = newAccessibilityFocusId; |
+ mAccessibilityFocusRect = null; |
sendAccessibilityEvent(mAccessibilityFocusId, |
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); |
return true; |
@@ -426,6 +429,7 @@ public class BrowserAccessibilityManager { |
@CalledByNative |
private void handleNavigate() { |
mAccessibilityFocusId = View.NO_ID; |
+ mAccessibilityFocusRect = null; |
mUserHasTouchExplored = false; |
// Invalidate the host, since its child is now gone. |
mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); |
@@ -526,6 +530,7 @@ public class BrowserAccessibilityManager { |
@CalledByNative |
private void setAccessibilityNodeInfoLocation(AccessibilityNodeInfo node, |
+ final int virtualViewId, |
int absoluteLeft, int absoluteTop, int parentRelativeLeft, int parentRelativeTop, |
int width, int height, boolean isRootNode) { |
// First set the bounds in parent. |
@@ -560,6 +565,20 @@ public class BrowserAccessibilityManager { |
rect.offset(viewLocation[0], viewLocation[1]); |
node.setBoundsInScreen(rect); |
+ |
+ // Work around a bug in the Android framework where if the object with accessibility |
+ // focus moves, the accessibility focus rect is not updated - both the visual highlight, |
+ // and the location on the screen that's clicked if you double-tap. To work around this, |
+ // when we know the object with accessibility focus moved, move focus away and then |
+ // move focus right back to it, which tricks Android into updating its bounds. |
+ if (virtualViewId == mAccessibilityFocusId && virtualViewId != mCurrentRootId) { |
+ if (mAccessibilityFocusRect == null) { |
+ mAccessibilityFocusRect = rect; |
+ } else if (!mAccessibilityFocusRect.equals(rect)) { |
+ mAccessibilityFocusRect = rect; |
+ moveAccessibilityFocusToIdAndRefocusIfNeeded(virtualViewId); |
+ } |
+ } |
} |
@CalledByNative |