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 |