From 9504f5753db3309b67e74ccecb400a18d23ca2d1 Mon Sep 17 00:00:00 2001
From: Svetoslav Ganov
Date: Fri, 14 Jan 2011 11:38:17 -0800
Subject: Final polish of WebView accessibility support for no JavaScript case.
1. Added tests for the new code added by change:I5a796aef
2. WebCore thread now calls the UI thread to set the cursor to
the current position enabling the user to interact with
the content that is being selected on the page.
3. Removed the code that changes the selection on movement of the
cursor ring. We are dropping the "default web view behavior"
as granularity of reading the document since with this change
a user can freely access inputs/buttons/links.
Change-Id: I7a3f6677eff0bc95e8127973d07cec78e3465c7b
---
.../java/android/webkit/AccessibilityInjector.java | 11 +
core/java/android/webkit/WebView.java | 35 +-
core/java/android/webkit/WebViewCore.java | 29 +-
.../android/webkit/AccessibilityInjectorTest.java | 570 ++++++++++++++++++++-
4 files changed, 592 insertions(+), 53 deletions(-)
diff --git a/core/java/android/webkit/AccessibilityInjector.java b/core/java/android/webkit/AccessibilityInjector.java
index 6bb432089c9e..db6630531d01 100644
--- a/core/java/android/webkit/AccessibilityInjector.java
+++ b/core/java/android/webkit/AccessibilityInjector.java
@@ -113,6 +113,11 @@ class AccessibilityInjector {
* @return True if the event was processed.
*/
public boolean onKeyEvent(KeyEvent event) {
+ // We do not handle ENTER in any circumstances.
+ if (isEnterActionKey(event.getKeyCode())) {
+ return false;
+ }
+
if (event.getAction() == KeyEvent.ACTION_UP) {
return mLastDownEventHandled;
}
@@ -367,6 +372,12 @@ class AccessibilityInjector {
}
}
+ private boolean isEnterActionKey(int keyCode) {
+ return keyCode == KeyEvent.KEYCODE_DPAD_CENTER
+ || keyCode == KeyEvent.KEYCODE_ENTER
+ || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER;
+ }
+
/**
* Represents a web content key-binding.
*/
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index cf1ce6bb7c85..9bd57cd3d938 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -16,9 +16,6 @@
package android.webkit;
-import android.view.HardwareCanvas;
-import com.android.internal.R;
-
import android.annotation.Widget;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
@@ -31,7 +28,6 @@ import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
-import android.content.res.Resources;
import android.database.DataSetObserver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
@@ -57,7 +53,6 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
-import android.os.SystemClock;
import android.provider.Settings;
import android.speech.tts.TextToSpeech;
import android.text.Selection;
@@ -66,6 +61,7 @@ import android.util.AttributeSet;
import android.util.EventLog;
import android.util.Log;
import android.view.Gravity;
+import android.view.HardwareCanvas;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -92,7 +88,6 @@ import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
-import android.widget.EdgeGlow;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.OverScroller;
@@ -677,6 +672,8 @@ public class WebView extends AbsoluteLayout
static final int SET_AUTOFILLABLE = 133;
static final int AUTOFILL_COMPLETE = 134;
+ static final int SELECT_AT = 135;
+
private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID;
private static final int LAST_PACKAGE_MSG_ID = SET_TOUCH_HIGHLIGHT_RECTS;
@@ -728,7 +725,8 @@ public class WebView extends AbsoluteLayout
"SET_TOUCH_HIGHLIGHT_RECTS", // = 131;
"SAVE_WEBARCHIVE_FINISHED", // = 132;
"SET_AUTOFILLABLE", // = 133;
- "AUTOFILL_COMPLETE" // = 134;
+ "AUTOFILL_COMPLETE", // = 134;
+ "SELECT_AT" // = 135;
};
// If the site doesn't use the viewport meta tag to specify the viewport,
@@ -7600,6 +7598,10 @@ public class WebView extends AbsoluteLayout
}
break;
+ case SELECT_AT:
+ nativeSelectAt(msg.arg1, msg.arg2);
+ break;
+
default:
super.handleMessage(msg);
break;
@@ -7957,24 +7959,6 @@ public class WebView extends AbsoluteLayout
cursorData());
}
- /*
- * Called from JNI when the cursor has moved. This method
- * sends a message to the WebCore requesting the given
- * nodePtr in the given framePrt to be selected which will
- * result in firing an accessibility event announing its
- * content.
- *
- * Note: Accessibility support.
- */
- @SuppressWarnings("unused")
- // called from JNI
- private void sendMoveSelection(int framePtr, int nodePtr) {
- if (AccessibilityManager.getInstance(mContext).isEnabled()
- && mAccessibilityInjector != null) {
- mWebViewCore.sendMessage(EventHub.MOVE_SELECTION, framePtr, nodePtr);
- }
- }
-
/**
* Called by JNI to send a message to the webcore thread that the user
* touched the webpage.
@@ -8283,6 +8267,7 @@ public class WebView extends AbsoluteLayout
private native Point nativeSelectableText();
private native void nativeSelectAll();
private native void nativeSelectBestAt(Rect rect);
+ private native void nativeSelectAt(int x, int y);
private native int nativeSelectionX();
private native int nativeSelectionY();
private native int nativeFindIndex();
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 0992079b464e..0451a130e155 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -641,18 +641,6 @@ final class WebViewCore {
*/
private native String nativeModifySelection(int direction, int granularity);
- /**
- * Moves the selection to given node i.e. selects that node.
- *
- * Note: Accessibility support.
- *
- * @param framePtr Pointer to the frame containing the node to be selected.
- * @param nodePtr Pointer to the node to be selected.
- *
- * @return The selection string.
- */
- private native String nativeMoveSelection(int framePtr, int nodePtr);
-
// EventHub for processing messages
private final EventHub mEventHub;
// WebCore thread handler
@@ -1018,9 +1006,6 @@ final class WebViewCore {
static final int PROXY_CHANGED = 193;
- // accessibility support
- static final int MOVE_SELECTION = 194;
-
// private message ids
private static final int DESTROY = 200;
@@ -1439,12 +1424,6 @@ final class WebViewCore {
modifiedSelectionString).sendToTarget();
break;
- case MOVE_SELECTION:
- String movedSelectionString = nativeMoveSelection(msg.arg1, msg.arg2);
- mWebView.mPrivateHandler.obtainMessage(WebView.SELECTION_STRING_CHANGED,
- movedSelectionString).sendToTarget();
- break;
-
case LISTBOX_CHOICES:
SparseBooleanArray choices = (SparseBooleanArray)
msg.obj;
@@ -2714,6 +2693,14 @@ final class WebViewCore {
hMode, vMode).sendToTarget();
}
+ // called by JNI
+ @SuppressWarnings("unused")
+ private void selectAt(int x, int y) {
+ if (mWebView != null) {
+ mWebView.mPrivateHandler.obtainMessage(WebView.SELECT_AT, x, y).sendToTarget();
+ }
+ }
+
private void useMockDeviceOrientation() {
mDeviceMotionAndOrientationManager.useMock();
}
diff --git a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java
index 4edd127b910a..16108e62392a 100644
--- a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java
+++ b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java
@@ -51,7 +51,7 @@ public class AccessibilityInjectorTest extends AndroidTestCase {
private static final long TIMEOUT_ENABLE_ACCESSIBILITY_AND_MOCK_SERVICE = 1000;
/** The count of tests to detect when to shut down the service. */
- private static final int TEST_CASE_COUNT = 8;
+ private static final int TEST_CASE_COUNT = 16;
/** The meta state for pressed left ALT. */
private static final int META_STATE_ALT_LEFT_ON = KeyEvent.META_ALT_ON
@@ -140,7 +140,8 @@ public class AccessibilityInjectorTest extends AndroidTestCase {
"