diff options
author | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-18 00:09:34 +0000 |
---|---|---|
committer | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-18 00:09:34 +0000 |
commit | f0779b5f9025898b681ea7b33e61e4682f19c224 (patch) | |
tree | 4b906ef97ef16698ae60246ccb792f8776c89042 /content/browser/accessibility/browser_accessibility_manager_android.cc | |
parent | 4e5592998c1a879c85c179543180c65e9dfe4855 (diff) | |
download | chromium_src-f0779b5f9025898b681ea7b33e61e4682f19c224.zip chromium_src-f0779b5f9025898b681ea7b33e61e4682f19c224.tar.gz chromium_src-f0779b5f9025898b681ea7b33e61e4682f19c224.tar.bz2 |
Support TalkBack commands to move to next/prev element.
BUG=353051
Review URL: https://codereview.chromium.org/200323006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257542 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/accessibility/browser_accessibility_manager_android.cc')
-rw-r--r-- | content/browser/accessibility/browser_accessibility_manager_android.cc | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index 9516efe..c079825 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc @@ -26,11 +26,31 @@ enum { ANDROID_ACCESSIBILITY_EVENT_TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192 }; +enum AndroidHtmlElementType { + HTML_ELEMENT_TYPE_SECTION, + HTML_ELEMENT_TYPE_LIST, + HTML_ELEMENT_TYPE_CONTROL, + HTML_ELEMENT_TYPE_ANY +}; + // Restricts |val| to the range [min, max]. int Clamp(int val, int min, int max) { return std::min(std::max(val, min), max); } +// These are special unofficial strings sent from TalkBack/BrailleBack +// to jump to certain categories of web elements. +AndroidHtmlElementType HtmlElementTypeFromString(base::string16 element_type) { + if (element_type == base::ASCIIToUTF16("SECTION")) + return HTML_ELEMENT_TYPE_SECTION; + else if (element_type == base::ASCIIToUTF16("LIST")) + return HTML_ELEMENT_TYPE_LIST; + else if (element_type == base::ASCIIToUTF16("CONTROL")) + return HTML_ELEMENT_TYPE_CONTROL; + else + return HTML_ELEMENT_TYPE_ANY; +} + } // anonymous namespace namespace content { @@ -444,6 +464,63 @@ int BrowserAccessibilityManagerAndroid::CalculateDistanceSquared( return dx * dx + dy * dy; } +jint BrowserAccessibilityManagerAndroid::FindElementType( + JNIEnv* env, jobject obj, jint start_id, jstring element_type_str, + jboolean forwards) { + BrowserAccessibility* node = GetFromRendererID(start_id); + if (!node) + return 0; + + AndroidHtmlElementType element_type = HtmlElementTypeFromString( + base::android::ConvertJavaStringToUTF16(env, element_type_str)); + + node = forwards ? NextInTreeOrder(node) : PreviousInTreeOrder(node); + while (node) { + switch(element_type) { + case HTML_ELEMENT_TYPE_SECTION: + if (node->role() == ui::AX_ROLE_ARTICLE || + node->role() == ui::AX_ROLE_APPLICATION || + node->role() == ui::AX_ROLE_BANNER || + node->role() == ui::AX_ROLE_COMPLEMENTARY || + node->role() == ui::AX_ROLE_CONTENT_INFO || + node->role() == ui::AX_ROLE_HEADING || + node->role() == ui::AX_ROLE_MAIN || + node->role() == ui::AX_ROLE_NAVIGATION || + node->role() == ui::AX_ROLE_SEARCH || + node->role() == ui::AX_ROLE_REGION) { + return node->renderer_id(); + } + break; + case HTML_ELEMENT_TYPE_LIST: + if (node->role() == ui::AX_ROLE_LIST || + node->role() == ui::AX_ROLE_GRID || + node->role() == ui::AX_ROLE_TABLE || + node->role() == ui::AX_ROLE_TREE) { + return node->renderer_id(); + } + break; + case HTML_ELEMENT_TYPE_CONTROL: + if (static_cast<BrowserAccessibilityAndroid*>(node)->IsFocusable()) + return node->renderer_id(); + break; + case HTML_ELEMENT_TYPE_ANY: + // In theory, the API says that an accessibility service could + // jump to an element by element name, like 'H1' or 'P'. This isn't + // currently used by any accessibility service, and we think it's + // better to keep them high-level like 'SECTION' or 'CONTROL', so we + // just fall back on linear navigation when we don't recognize the + // element type. + if (static_cast<BrowserAccessibilityAndroid*>(node)->IsClickable()) + return node->renderer_id(); + break; + } + + node = forwards ? NextInTreeOrder(node) : PreviousInTreeOrder(node); + } + + return 0; +} + void BrowserAccessibilityManagerAndroid::NotifyRootChanged() { JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |