diff options
author | Svetoslav Ganov <svetoslavganov@google.com> | 2011-01-26 14:41:33 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-01-26 14:41:33 -0800 |
commit | 54fc78072fec46933ca5ee96c7642bd4b9fc540f (patch) | |
tree | de2d5c175a7b42c5f2cbc4e5296d6e35fd154999 /core/tests | |
parent | 49295e5379472c22af8975e32271f9659c016531 (diff) | |
parent | df4672643b92208b4ab7f9ab995dca8b69d3c458 (diff) | |
download | frameworks_base-54fc78072fec46933ca5ee96c7642bd4b9fc540f.zip frameworks_base-54fc78072fec46933ca5ee96c7642bd4b9fc540f.tar.gz frameworks_base-54fc78072fec46933ca5ee96c7642bd4b9fc540f.tar.bz2 |
am df467264: Merge "Final polish of WebView accessibility support for no JavaScript case." into honeycomb
* commit 'df4672643b92208b4ab7f9ab995dca8b69d3c458':
Final polish of WebView accessibility support for no JavaScript case.
Diffstat (limited to 'core/tests')
-rw-r--r-- | core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java | 570 |
1 files changed, 563 insertions, 7 deletions
diff --git a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java index 4edd127..16108e6 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 { "</p>" + "<p>" + "d" + - "<input>e</input>" + + "<p/>" + + "e" + "</p>" + "</body>" + "</html>"; @@ -179,6 +180,10 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString(null); + // go to the fifth character (reverse) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("e"); + // go to the fourth character (reverse) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString("d"); @@ -199,6 +204,10 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString(null); + // go to the first character + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("a"); + // go to the second character (reverse again) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString("<b>b</b>"); @@ -223,11 +232,11 @@ public class AccessibilityInjectorTest extends AndroidTestCase { "</p>" + "<p>" + " scattered " + - "<input>all</input>" + - " over " + + "<p/>" + + " all over " + "</p>" + "<div>" + - "<button>the place.</button>" + + "<p>the place.</p>" + "</div>" + "</body>" + "</html>"; @@ -284,7 +293,7 @@ public class AccessibilityInjectorTest extends AndroidTestCase { // go to the last word (reverse) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); - assertSelectionString("place"); + assertSelectionString("place."); // go to the eight word sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); @@ -322,6 +331,10 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString(null); + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("This"); + // go to the second word (reverse again) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString("is"); @@ -384,6 +397,10 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString(null); + // go to the fifth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("This is the second sentence of the second paragraph."); + // go to the fourth sentence (reverse) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString("This is the first sentence of the second paragraph."); @@ -405,6 +422,11 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString(null); + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("This is the first sentence of the first paragraph and has an " + + "<b>inline bold tag</b>."); + // go to the second sentence (reverse again) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString("This is the second sentence of the first paragraph."); @@ -747,6 +769,539 @@ public class AccessibilityInjectorTest extends AndroidTestCase { } /** + * Tests that the selection does not cross anchor boundaries. This is a + * workaround for the asymmetric and inconsistent handling of text with + * links by WebKit while traversing by sentence. + */ + @LargeTest + public void testEnforceSelectionDoesNotCrossAnchorBoundary1() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>First</div>" + + "<p>" + + "<a href=\"\">Second</a> Third" + + "</p>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"\">Second</a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Third"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Third"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"\">Second</a>"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests that the selection does not cross anchor boundaries. This is a + * workaround for the asymmetric and inconsistent handling of text with + * links by WebKit while traversing by sentence. + */ + @LargeTest + public void testEnforceSelectionDoesNotCrossAnchorBoundary2() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>First</div>" + + "<a href=\"#\">Second</a>" + + " " + + "<a href=\"#\">Third</a>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">Second</a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(" "); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">Third</a>"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">Third</a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(" "); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">Second</a>"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests that the selection does not cross anchor boundaries. This is a + * workaround for the asymmetric and inconsistent handling of text with + * links by WebKit while traversing by sentence. + */ + @LargeTest + public void testEnforceSelectionDoesNotCrossAnchorBoundary3() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>" + + "First" + + "<div>" + + "<div>" + + "<a href=\"#\">Second</a>" + + "</div>" + + "<div>" + + "Third" + + "</div>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">Second</a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Third"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Third"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">Second</a>"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests skipping of content with hidden visibility. + */ + @LargeTest + public void testSkipVisibilityHidden() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>First </div>" + + "<div style=\"visibility:hidden;\">Second</div>" + + "<div> Third</div>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // change navigation axis to word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON); + assertSelectionString("1"); // expect the word navigation axis + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the third word (the second is invisible) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Third"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third word (the second is invisible) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Third"); + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests skipping of content with display none. + */ + @LargeTest + public void testSkipDisplayNone() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>First</div>" + + "<div style=\"display: none;\">Second</div>" + + "<div>Third</div>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // change navigation axis to word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON); + assertSelectionString("1"); // expect the word navigation axis + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the third word (the second is invisible) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Third"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third word (the second is invisible) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Third"); + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests for the selection not getting stuck. + * + * Note: The selection always proceeds but if it can + * be selecting the same content i.e. between the start + * and end are contained the same text nodes. + */ + @LargeTest + public void testSelectionTextProceed() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<a href=\"#\">First</a>" + + "<span><a href=\"#\"><span>Second</span> <small>a</small></a>" + + "</span> <a href=\"#\">Third</a>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">First</a>"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\"><span>Second <small>a</small></a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(" "); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">Third</a>"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">Third</a>"); + + // NOTE: Here we are a bit asymmetric around whitespace but we can live with it + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(" "); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\"><span>Second <small>a</small></a>"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">First</a>"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">First</a>"); + } + + /** + * Tests if input elements are selected rather skipped. + */ + @LargeTest + public void testSelectionOfInputElements() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<p>" + + "First" + + "</p>" + + "<input type=\"text\"/>" + + "<p>" + + "Second" + + "</p>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Second"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Second"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests traversing of input controls. + */ + @LargeTest + public void testSelectionOfInputElements2() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>" + + "First" + + "<input type=\"text\"/>" + + "<span>" + + "<input type=\"text\"/>" + + "</span>" + + "<button type=\"button\">Click Me!</button>" + + "<div>" + + "<input type=\"submit\"/>" + + "</div>" + + "<p>" + + "Second" + + "</p>" + + "</div>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<button type=\"button\">Click Me!</button>"); + + // go to the fifth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<input type=\"submit\">"); + + // go to the sixth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Second"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the sixth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Second"); + + // go to the fifth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<input type=\"submit\">"); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<button type=\"button\">Click Me!</button>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + } + + /** * Enable accessibility and the mock accessibility service. */ private void enableAccessibilityAndMockAccessibilityService() { @@ -887,7 +1442,8 @@ public class AccessibilityInjectorTest extends AndroidTestCase { */ private void restoreDefaultWebContentKeyBindings() { Settings.Secure.putString(getContext().getContentResolver(), - Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, mDefaultKeyBindings); + Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, + mDefaultKeyBindings); } /** |