Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Unified Diff: content/browser/accessibility/browser_accessibility_android.cc

Issue 15741009: Native Android accessibility. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix AwContents for ICS Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/accessibility/browser_accessibility_android.cc
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc
index 2f1ab2daa4b2ffe554e38c9cb78401a09eaf8240..8ff37ec0c7dee71c85094e38440533be8fc26634 100644
--- a/content/browser/accessibility/browser_accessibility_android.cc
+++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -4,17 +4,11 @@
#include "content/browser/accessibility/browser_accessibility_android.h"
-#include "base/android/jni_android.h"
-#include "base/android/jni_registrar.h"
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
#include "base/strings/utf_string_conversions.h"
#include "content/browser/accessibility/browser_accessibility_manager_android.h"
#include "content/common/accessibility_messages.h"
#include "content/common/accessibility_node_data.h"
-using base::android::ScopedJavaLocalRef;
-
namespace content {
// static
@@ -30,101 +24,95 @@ bool BrowserAccessibilityAndroid::IsNative() const {
return true;
}
-//
-// Actions, called from Java.
-//
+bool BrowserAccessibilityAndroid::IsLeaf() const {
+ if (child_count() == 0)
+ return true;
-void BrowserAccessibilityAndroid::FocusJNI(JNIEnv* env, jobject obj) {
- manager_->SetFocus(this, true);
-}
+ // Iframes are always allowed to contain children.
+ if (IsIframe() ||
+ role() == AccessibilityNodeData::ROLE_ROOT_WEB_AREA ||
+ role() == AccessibilityNodeData::ROLE_WEB_AREA) {
+ return false;
+ }
-void BrowserAccessibilityAndroid::ClickJNI(JNIEnv* env, jobject obj) {
- manager_->DoDefaultAction(*this);
-}
+ // If it has a focusable child, we definitely can't leave out children.
+ if (HasFocusableChild())
+ return false;
-//
-// Const accessors, called from Java.
-//
+ // Headings with text can drop their children.
+ string16 name = GetText();
+ if (role() == AccessibilityNodeData::ROLE_HEADING && !name.empty())
+ return true;
-ScopedJavaLocalRef<jstring>
-BrowserAccessibilityAndroid::GetNameJNI(JNIEnv* env, jobject obj) const {
- return base::android::ConvertUTF16ToJavaString(env, ComputeName());
-}
+ // Focusable nodes with text can drop their children.
+ if (HasState(AccessibilityNodeData::STATE_FOCUSABLE) && !name.empty())
+ return true;
-ScopedJavaLocalRef<jobject>
-BrowserAccessibilityAndroid::GetAbsoluteRectJNI(
- JNIEnv* env, jobject obj) const {
- gfx::Rect rect = GetLocalBoundsRect();
+ // Nodes with only static text as children can drop their children.
+ if (HasOnlyStaticTextChildren())
+ return true;
- // TODO(aboxhall): replace with non-stub implementation
- return ScopedJavaLocalRef<jobject>(env, NULL);
+ return false;
}
-ScopedJavaLocalRef<jobject>
-BrowserAccessibilityAndroid::GetRectInParentJNI(
- JNIEnv* env, jobject obj) const {
- gfx::Rect rect = GetLocalBoundsRect();
- if (parent()) {
- gfx::Rect parent_rect = parent()->GetLocalBoundsRect();
- rect.Offset(-parent_rect.OffsetFromOrigin());
+bool BrowserAccessibilityAndroid::IsCheckable() const {
+ bool checkable = false;
+ bool is_aria_pressed_defined;
+ bool is_mixed;
+ GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed);
+ if (role() == AccessibilityNodeData::ROLE_CHECKBOX ||
+ role() == AccessibilityNodeData::ROLE_RADIO_BUTTON ||
+ is_aria_pressed_defined) {
+ checkable = true;
}
+ if (HasState(AccessibilityNodeData::STATE_CHECKED))
+ checkable = true;
+ return checkable;
+}
- // TODO(aboxhall): replace with non-stub implementation
- return ScopedJavaLocalRef<jobject>(env, NULL);
+bool BrowserAccessibilityAndroid::IsChecked() const {
+ return HasState(AccessibilityNodeData::STATE_CHECKED);
}
-jboolean
-BrowserAccessibilityAndroid::IsFocusableJNI(JNIEnv* env, jobject obj) const {
- return static_cast<jboolean>(IsFocusable());
+bool BrowserAccessibilityAndroid::IsClickable() const {
+ return (IsLeaf() && !GetText().empty());
}
-jboolean
-BrowserAccessibilityAndroid::IsEditableTextJNI(JNIEnv* env, jobject obj) const {
- return IsEditableText();
+bool BrowserAccessibilityAndroid::IsEnabled() const {
+ return !HasState(AccessibilityNodeData::STATE_UNAVAILABLE);
}
-jint BrowserAccessibilityAndroid::GetParentJNI(JNIEnv* env, jobject obj) const {
- return static_cast<jint>(parent()->renderer_id());
+bool BrowserAccessibilityAndroid::IsFocusable() const {
+ bool focusable = HasState(AccessibilityNodeData::STATE_FOCUSABLE);
+ if (IsIframe() ||
+ role() == AccessibilityNodeData::ROLE_WEB_AREA) {
+ focusable = false;
+ }
+ return focusable;
}
-jint
-BrowserAccessibilityAndroid::GetChildCountJNI(JNIEnv* env, jobject obj) const {
- if (IsLeaf())
- return 0;
- else
- return static_cast<jint>(child_count());
+bool BrowserAccessibilityAndroid::IsFocused() const {
+ return manager()->GetFocus(manager()->GetRoot()) == this;
}
-jint BrowserAccessibilityAndroid::GetChildIdAtJNI(JNIEnv* env,
- jobject obj,
- jint child_index) const {
- return static_cast<jint>(GetChild(child_index)->renderer_id());
+bool BrowserAccessibilityAndroid::IsPassword() const {
+ return HasState(AccessibilityNodeData::STATE_PROTECTED);
}
-jboolean
-BrowserAccessibilityAndroid::IsCheckableJNI(JNIEnv* env, jobject obj) const {
- bool checkable = false;
- bool is_aria_pressed_defined;
- bool is_mixed;
- GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed);
- if (role() == AccessibilityNodeData::ROLE_CHECKBOX ||
- role() == AccessibilityNodeData::ROLE_RADIO_BUTTON ||
- is_aria_pressed_defined) {
- checkable = true;
- }
- if (HasState(AccessibilityNodeData::STATE_CHECKED))
- checkable = true;
- return static_cast<jboolean>(checkable);
+bool BrowserAccessibilityAndroid::IsScrollable() const {
+ int dummy;
+ return GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_X_MAX, &dummy);
}
-jboolean
-BrowserAccessibilityAndroid::IsCheckedJNI(JNIEnv* env, jobject obj) const {
- return static_cast<jboolean>(
- HasState(AccessibilityNodeData::STATE_CHECKED));
+bool BrowserAccessibilityAndroid::IsSelected() const {
+ return HasState(AccessibilityNodeData::STATE_SELECTED);
}
-base::android::ScopedJavaLocalRef<jstring>
-BrowserAccessibilityAndroid::GetClassNameJNI(JNIEnv* env, jobject obj) const {
+bool BrowserAccessibilityAndroid::IsVisibleToUser() const {
+ return !HasState(AccessibilityNodeData::STATE_INVISIBLE);
+}
+
+const char* BrowserAccessibilityAndroid::GetClassName() const {
const char* class_name = NULL;
switch(role()) {
@@ -177,53 +165,52 @@ BrowserAccessibilityAndroid::GetClassNameJNI(JNIEnv* env, jobject obj) const {
break;
}
- return base::android::ConvertUTF8ToJavaString(env, class_name);
-}
-
-jboolean
-BrowserAccessibilityAndroid::IsEnabledJNI(JNIEnv* env, jobject obj) const {
- return static_cast<jboolean>(
- !HasState(AccessibilityNodeData::STATE_UNAVAILABLE));
+ return class_name;
}
-jboolean
-BrowserAccessibilityAndroid::IsFocusedJNI(JNIEnv* env, jobject obj) const {
- return manager()->GetFocus(manager()->GetRoot()) == this;
-}
+string16 BrowserAccessibilityAndroid::GetText() const {
+ if (IsIframe() ||
+ role() == AccessibilityNodeData::ROLE_WEB_AREA) {
+ return string16();
+ }
-jboolean
-BrowserAccessibilityAndroid::IsPasswordJNI(JNIEnv* env, jobject obj) const {
- return static_cast<jboolean>(
- HasState(AccessibilityNodeData::STATE_PROTECTED));
-}
+ string16 description;
+ GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, &description);
-jboolean
-BrowserAccessibilityAndroid::IsScrollableJNI(JNIEnv* env, jobject obj) const {
- int dummy;
- bool scrollable = GetIntAttribute(
- AccessibilityNodeData::ATTR_SCROLL_X_MAX, &dummy);
- return static_cast<jboolean>(scrollable);
-}
+ string16 text;
+ if (!name().empty())
+ text = name();
+ else if (!description.empty())
+ text = description;
+ else if (!value().empty())
+ text = value();
-jboolean
-BrowserAccessibilityAndroid::IsSelectedJNI(JNIEnv* env, jobject obj) const {
- return static_cast<jboolean>(
- HasState(AccessibilityNodeData::STATE_SELECTED));
-}
+ if (text.empty() && HasOnlyStaticTextChildren()) {
+ for (uint32 i = 0; i < child_count(); i++) {
+ BrowserAccessibility* child = GetChild(i);
+ text += static_cast<BrowserAccessibilityAndroid*>(child)->GetText();
+ }
+ }
-jboolean
-BrowserAccessibilityAndroid::IsVisibleJNI(JNIEnv* env, jobject obj) const {
- return static_cast<jboolean>(
- !HasState(AccessibilityNodeData::STATE_INVISIBLE));
-}
+ switch(role()) {
+ case AccessibilityNodeData::ROLE_IMAGE_MAP_LINK:
+ case AccessibilityNodeData::ROLE_LINK:
+ case AccessibilityNodeData::ROLE_WEBCORE_LINK:
+ if (!text.empty())
+ text += ASCIIToUTF16(" ");
+ text += ASCIIToUTF16("Link");
+ break;
+ case AccessibilityNodeData::ROLE_HEADING:
+ // Only append "heading" if this node already has text.
+ if (!text.empty())
+ text += ASCIIToUTF16(" Heading");
+ break;
+ }
-base::android::ScopedJavaLocalRef<jstring>
-BrowserAccessibilityAndroid::GetAriaLiveJNI(JNIEnv* env, jobject obj) const {
- return base::android::ConvertUTF16ToJavaString(env, GetAriaLive());
+ return text;
}
-jint BrowserAccessibilityAndroid::GetItemIndexJNI(
- JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetItemIndex() const {
int index = 0;
switch(role()) {
case AccessibilityNodeData::ROLE_LIST_ITEM:
@@ -240,11 +227,10 @@ jint BrowserAccessibilityAndroid::GetItemIndexJNI(
break;
}
}
- return static_cast<jint>(index);
+ return index;
}
-jint
-BrowserAccessibilityAndroid::GetItemCountJNI(JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetItemCount() const {
int count = 0;
switch(role()) {
case AccessibilityNodeData::ROLE_LIST:
@@ -261,63 +247,34 @@ BrowserAccessibilityAndroid::GetItemCountJNI(JNIEnv* env, jobject obj) const {
break;
}
}
- return static_cast<jint>(count);
+ return count;
}
-jint
-BrowserAccessibilityAndroid::GetScrollXJNI(JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetScrollX() const {
int value = 0;
GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_X, &value);
- return static_cast<jint>(value);
+ return value;
}
-jint
-BrowserAccessibilityAndroid::GetScrollYJNI(JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetScrollY() const {
int value = 0;
GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_Y, &value);
- return static_cast<jint>(value);
+ return value;
}
-jint
-BrowserAccessibilityAndroid::GetMaxScrollXJNI(JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetMaxScrollX() const {
int value = 0;
GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_X_MAX, &value);
- return static_cast<jint>(value);
+ return value;
}
-jint
-BrowserAccessibilityAndroid::GetMaxScrollYJNI(JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetMaxScrollY() const {
int value = 0;
GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_Y_MAX, &value);
- return static_cast<jint>(value);
-}
-
-jboolean
-BrowserAccessibilityAndroid::GetClickableJNI(JNIEnv* env, jobject obj) const {
- return (IsLeaf() && !ComputeName().empty());
-}
-
-jint BrowserAccessibilityAndroid::GetSelectionStartJNI(JNIEnv* env, jobject obj)
- const {
- int sel_start = 0;
- GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start);
- return sel_start;
-}
-
-jint BrowserAccessibilityAndroid::GetSelectionEndJNI(JNIEnv* env, jobject obj)
- const {
- int sel_end = 0;
- GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end);
- return sel_end;
-}
-
-jint BrowserAccessibilityAndroid::GetEditableTextLengthJNI(
- JNIEnv* env, jobject obj) const {
- return value().length();
+ return value;
}
-int BrowserAccessibilityAndroid::GetTextChangeFromIndexJNI(
- JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetTextChangeFromIndex() const {
size_t index = 0;
while (index < old_value_.length() &&
index < new_value_.length() &&
@@ -327,8 +284,7 @@ int BrowserAccessibilityAndroid::GetTextChangeFromIndexJNI(
return index;
}
-jint BrowserAccessibilityAndroid::GetTextChangeAddedCountJNI(
- JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetTextChangeAddedCount() const {
size_t old_len = old_value_.length();
size_t new_len = new_value_.length();
size_t left = 0;
@@ -346,8 +302,7 @@ jint BrowserAccessibilityAndroid::GetTextChangeAddedCountJNI(
return (new_len - left - right);
}
-jint BrowserAccessibilityAndroid::GetTextChangeRemovedCountJNI(
- JNIEnv* env, jobject obj) const {
+int BrowserAccessibilityAndroid::GetTextChangeRemovedCount() const {
size_t old_len = old_value_.length();
size_t new_len = new_value_.length();
size_t left = 0;
@@ -365,62 +320,24 @@ jint BrowserAccessibilityAndroid::GetTextChangeRemovedCountJNI(
return (old_len - left - right);
}
-base::android::ScopedJavaLocalRef<jstring>
-BrowserAccessibilityAndroid::GetTextChangeBeforeTextJNI(
- JNIEnv* env, jobject obj) const {
- return base::android::ConvertUTF16ToJavaString(env, old_value_);
+string16 BrowserAccessibilityAndroid::GetTextChangeBeforeText() const {
+ return old_value_;
}
-string16 BrowserAccessibilityAndroid::ComputeName() const {
- if (IsIframe() ||
- role() == AccessibilityNodeData::ROLE_WEB_AREA) {
- return string16();
- }
-
- string16 description;
- GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION,
- &description);
-
- string16 text;
- if (!name().empty())
- text = name();
- else if (!description.empty())
- text = description;
- else if (!value().empty())
- text = value();
-
- if (text.empty() && HasOnlyStaticTextChildren()) {
- for (uint32 i = 0; i < child_count(); i++) {
- BrowserAccessibility* child = GetChild(i);
- text += static_cast<BrowserAccessibilityAndroid*>(child)->ComputeName();
- }
- }
-
- switch(role()) {
- case AccessibilityNodeData::ROLE_IMAGE_MAP_LINK:
- case AccessibilityNodeData::ROLE_LINK:
- case AccessibilityNodeData::ROLE_WEBCORE_LINK:
- if (!text.empty())
- text += ASCIIToUTF16(" ");
- text += ASCIIToUTF16("Link");
- break;
- case AccessibilityNodeData::ROLE_HEADING:
- // Only append "heading" if this node already has text.
- if (!text.empty())
- text += ASCIIToUTF16(" Heading");
- break;
- }
+int BrowserAccessibilityAndroid::GetSelectionStart() const {
+ int sel_start = 0;
+ GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start);
+ return sel_start;
+}
- return text;
+int BrowserAccessibilityAndroid::GetSelectionEnd() const {
+ int sel_end = 0;
+ GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end);
+ return sel_end;
}
-string16 BrowserAccessibilityAndroid::GetAriaLive() const {
- string16 aria_live;
- if (GetStringAttribute(AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS,
- &aria_live)) {
- return aria_live;
- }
- return string16();
+int BrowserAccessibilityAndroid::GetEditableTextLength() const {
+ return value().length();
}
bool BrowserAccessibilityAndroid::HasFocusableChild() const {
@@ -449,46 +366,6 @@ bool BrowserAccessibilityAndroid::IsIframe() const {
return html_tag == ASCIIToUTF16("iframe");
}
-bool BrowserAccessibilityAndroid::IsFocusable() const {
- bool focusable = HasState(AccessibilityNodeData::STATE_FOCUSABLE);
- if (IsIframe() ||
- role() == AccessibilityNodeData::ROLE_WEB_AREA) {
- focusable = false;
- }
- return focusable;
-}
-
-bool BrowserAccessibilityAndroid::IsLeaf() const {
- if (child_count() == 0)
- return true;
-
- // Iframes are always allowed to contain children.
- if (IsIframe() ||
- role() == AccessibilityNodeData::ROLE_ROOT_WEB_AREA ||
- role() == AccessibilityNodeData::ROLE_WEB_AREA) {
- return false;
- }
-
- // If it has a focusable child, we definitely can't leave out children.
- if (HasFocusableChild())
- return false;
-
- // Headings with text can drop their children.
- string16 name = ComputeName();
- if (role() == AccessibilityNodeData::ROLE_HEADING && !name.empty())
- return true;
-
- // Focusable nodes with text can drop their children.
- if (HasState(AccessibilityNodeData::STATE_FOCUSABLE) && !name.empty())
- return true;
-
- // Nodes with only static text as children can drop their children.
- if (HasOnlyStaticTextChildren())
- return true;
-
- return false;
-}
-
void BrowserAccessibilityAndroid::PostInitialize() {
BrowserAccessibility::PostInitialize();
@@ -516,7 +393,7 @@ void BrowserAccessibilityAndroid::NotifyLiveRegionUpdate(string16& aria_live) {
!EqualsASCII(aria_live, aria_strings::kAriaLiveAssertive))
return;
- string16 text = ComputeName();
+ string16 text = GetText();
if (cached_text_ != text) {
if (!text.empty()) {
manager_->NotifyAccessibilityEvent(AccessibilityNotificationObjectShow,
@@ -526,9 +403,4 @@ void BrowserAccessibilityAndroid::NotifyLiveRegionUpdate(string16& aria_live) {
}
}
-bool RegisterBrowserAccessibility(JNIEnv* env) {
- // TODO(aboxhall): replace with non-stub implementation
- return false;
-}
-
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698