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 6d63ded0c148b0b4c088d373b9af02707346af15..33afba774df9d22591856734bd68217f0ad02c7f 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 |
@@ -20,6 +20,7 @@ import android.view.accessibility.AccessibilityEvent; |
import android.view.accessibility.AccessibilityManager; |
import android.view.accessibility.AccessibilityNodeInfo; |
import android.view.accessibility.AccessibilityNodeProvider; |
+import android.widget.ListView; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
@@ -35,8 +36,6 @@ import java.util.Locale; |
*/ |
@JNINamespace("content") |
public class BrowserAccessibilityManager { |
- private static final String TAG = "BrowserAccessibilityManager"; |
- |
// Constants from AccessibilityNodeInfo defined in the K SDK. |
private static final int ACTION_COLLAPSE = 0x00080000; |
private static final int ACTION_EXPAND = 0x00040000; |
@@ -75,6 +74,7 @@ public class BrowserAccessibilityManager { |
private int mSelectionEndIndex; |
protected int mAccessibilityFocusId; |
private Runnable mSendWindowContentChangedRunnable; |
+ private ListView mAutofillPopupListView; |
dmazzoni
2017/03/28 16:47:35
Does this class need to know it's a ListView or co
csashi
2017/03/28 17:48:10
Done.
|
/** |
* Create a BrowserAccessibilityManager object, which is owned by the C++ |
@@ -162,7 +162,6 @@ public class BrowserAccessibilityManager { |
if (!mAccessibilityManager.isEnabled() || mNativeObj == 0) { |
return null; |
} |
- |
int rootId = nativeGetRootId(mNativeObj); |
if (virtualViewId == View.NO_ID) { |
@@ -221,7 +220,6 @@ public class BrowserAccessibilityManager { |
switch (action) { |
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS: |
if (!moveAccessibilityFocusToId(virtualViewId)) return true; |
- |
if (!mIsHovering) { |
nativeScrollToMakeNodeVisible( |
mNativeObj, mAccessibilityFocusId); |
@@ -357,6 +355,20 @@ public class BrowserAccessibilityManager { |
return false; |
} |
+ public void onAutofillPopupDisplayed(ListView listView) { |
+ if (mAccessibilityManager.isEnabled() && mNativeObj != 0) { |
+ mAutofillPopupListView = listView; |
+ nativeOnAutofillPopupDisplayed(mNativeObj); |
+ } |
+ } |
+ |
+ public void onAutofillPopupDismissed() { |
+ if (mAccessibilityManager.isEnabled() && mNativeObj != 0) { |
+ nativeOnAutofillPopupDismissed(mNativeObj); |
+ mAutofillPopupListView = null; |
+ } |
+ } |
+ |
/** |
* @see View#onHoverEvent(MotionEvent) |
*/ |
@@ -543,6 +555,12 @@ public class BrowserAccessibilityManager { |
// for the whole subtree of the root. |
if (mAccessibilityFocusId == mCurrentRootId) { |
nativeSetAccessibilityFocus(mNativeObj, -1); |
+ } else if (nativeIsAutofillPopupNode(mNativeObj, mAccessibilityFocusId)) { |
+ // If we do not call |requestFocus|, the first right swipe does not take talkback into |
+ // the autofill popup. Only subsequent right swipes take talkback into the popup if we |
+ // do not call |requestFocus|. |
+ mAutofillPopupListView.requestFocus(); |
+ mAutofillPopupListView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); |
dmazzoni
2017/03/28 16:47:35
Do you need to call this? requestFocus() should be
csashi
2017/03/28 17:48:10
Done.
|
} else { |
nativeSetAccessibilityFocus(mNativeObj, mAccessibilityFocusId); |
} |
@@ -552,6 +570,19 @@ public class BrowserAccessibilityManager { |
return true; |
} |
+ public boolean handleBackPressed() { |
+ if (mAccessibilityManager.isEnabled() && mNativeObj != 0 |
dmazzoni
2017/03/28 16:47:35
Reverse these tests to have less indentation and e
csashi
2017/03/28 17:48:10
Acknowledged. Function not needed.
|
+ && nativeIsAutofillPopupNode(mNativeObj, mAccessibilityFocusId)) { |
+ int id = nativeGetElementHostingAutofillPopupId(mNativeObj); |
+ if (id > 0) { |
+ moveAccessibilityFocusToId(id); |
+ nativeScrollToMakeNodeVisible(mNativeObj, mAccessibilityFocusId); |
+ return true; |
+ } |
+ } |
+ return false; |
+ } |
+ |
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 |
@@ -561,7 +592,6 @@ public class BrowserAccessibilityManager { |
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED); |
mAccessibilityFocusId = View.NO_ID; |
} |
- |
moveAccessibilityFocusToId(newAccessibilityFocusId); |
} |
@@ -1162,8 +1192,16 @@ public class BrowserAccessibilityManager { |
Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0) == 1); |
} |
+ private native void nativeOnAutofillPopupDisplayed( |
+ long nativeBrowserAccessibilityManagerAndroid); |
+ private native void nativeOnAutofillPopupDismissed( |
+ long nativeBrowserAccessibilityManagerAndroid); |
private native int nativeGetRootId(long nativeBrowserAccessibilityManagerAndroid); |
+ private native int nativeGetElementHostingAutofillPopupId( |
+ long nativeBrowserAccessibilityManagerAndroid); |
private native boolean nativeIsNodeValid(long nativeBrowserAccessibilityManagerAndroid, int id); |
+ private native boolean nativeIsAutofillPopupNode( |
+ long nativeBrowserAccessibilityManagerAndroid, int id); |
private native boolean nativeIsEditableText( |
long nativeBrowserAccessibilityManagerAndroid, int id); |
private native boolean nativeIsFocused( |