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 6e677cb766486ae92b022ee6c90c986b5c456edb..d8a401b6b69b42bf2d018c52068d0a5e93e007f9 100644 |
--- a/content/browser/accessibility/browser_accessibility_android.cc |
+++ b/content/browser/accessibility/browser_accessibility_android.cc |
@@ -9,6 +9,38 @@ |
#include "content/common/accessibility_messages.h" |
#include "content/common/accessibility_node_data.h" |
+namespace { |
+ |
+// These are enums from android.text.InputType in Java: |
+enum { |
+ ANDROID_TEXT_INPUTTYPE_TYPE_NULL = 0, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME = 0x4, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE = 0x14, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME = 0x24, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER = 0x2, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_PHONE = 0x3, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_TEXT = 0x1, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_URI = 0x11, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EDIT_TEXT = 0xa1, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EMAIL = 0xd1, |
+ ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_PASSWORD = 0xe1 |
+}; |
+ |
+// These are enums from android.view.View in Java: |
+enum { |
+ ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_NONE = 0, |
+ ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_POLITE = 1, |
+ ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2 |
+}; |
+ |
+// These are enums from |
+// android.view.accessibility.AccessibilityNodeInfo.RangeInfo in Java: |
+enum { |
+ ANDROID_VIEW_ACCESSIBILITY_RANGE_TYPE_FLOAT = 1 |
+}; |
+ |
+} // namespace |
+ |
namespace content { |
// static |
@@ -78,6 +110,33 @@ bool BrowserAccessibilityAndroid::IsClickable() const { |
return (PlatformIsLeaf() && !GetText().empty()); |
} |
+bool BrowserAccessibilityAndroid::IsCollection() const { |
+ return (role() == blink::WebAXRoleGrid || |
+ role() == blink::WebAXRoleList || |
+ role() == blink::WebAXRoleListBox || |
+ role() == blink::WebAXRoleTable || |
+ role() == blink::WebAXRoleTree); |
+} |
+ |
+bool BrowserAccessibilityAndroid::IsCollectionItem() const { |
+ return (role() == blink::WebAXRoleCell || |
+ role() == blink::WebAXRoleColumnHeader || |
+ role() == blink::WebAXRoleDescriptionListTerm || |
+ role() == blink::WebAXRoleListBoxOption || |
+ role() == blink::WebAXRoleListItem || |
+ role() == blink::WebAXRoleRowHeader || |
+ role() == blink::WebAXRoleTreeItem); |
+} |
+ |
+bool BrowserAccessibilityAndroid::IsContentInvalid() const { |
+ std::string invalid; |
+ return GetHtmlAttribute("aria-invalid", &invalid); |
+} |
+ |
+bool BrowserAccessibilityAndroid::IsDismissable() const { |
+ return false; // No concept of "dismissable" on the web currently. |
+} |
+ |
bool BrowserAccessibilityAndroid::IsEnabled() const { |
return HasState(blink::WebAXStateEnabled); |
} |
@@ -95,10 +154,31 @@ bool BrowserAccessibilityAndroid::IsFocused() const { |
return manager()->GetFocus(manager()->GetRoot()) == this; |
} |
+bool BrowserAccessibilityAndroid::IsHeading() const { |
+ return (role() == blink::WebAXRoleColumnHeader || |
+ role() == blink::WebAXRoleHeading || |
+ role() == blink::WebAXRoleRowHeader); |
+} |
+ |
+bool BrowserAccessibilityAndroid::IsHierarchical() const { |
+ return (role() == blink::WebAXRoleList || |
+ role() == blink::WebAXRoleTree); |
+} |
+ |
+bool BrowserAccessibilityAndroid::IsMultiLine() const { |
+ return role() == blink::WebAXRoleTextArea; |
+} |
+ |
bool BrowserAccessibilityAndroid::IsPassword() const { |
return HasState(blink::WebAXStateProtected); |
} |
+bool BrowserAccessibilityAndroid::IsRangeType() const { |
+ return (role() == blink::WebAXRoleProgressIndicator || |
+ role() == blink::WebAXRoleScrollBar || |
+ role() == blink::WebAXRoleSlider); |
+} |
+ |
bool BrowserAccessibilityAndroid::IsScrollable() const { |
int dummy; |
return GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_X_MAX, &dummy); |
@@ -112,6 +192,10 @@ bool BrowserAccessibilityAndroid::IsVisibleToUser() const { |
return !HasState(blink::WebAXStateInvisible); |
} |
+bool BrowserAccessibilityAndroid::CanOpenPopup() const { |
+ return HasState(blink::WebAXStateHaspopup); |
+} |
+ |
const char* BrowserAccessibilityAndroid::GetClassName() const { |
const char* class_name = NULL; |
@@ -215,6 +299,7 @@ int BrowserAccessibilityAndroid::GetItemIndex() const { |
switch(role()) { |
case blink::WebAXRoleListItem: |
case blink::WebAXRoleListBoxOption: |
+ case blink::WebAXRoleTreeItem: |
index = index_in_parent(); |
break; |
case blink::WebAXRoleSlider: |
@@ -340,6 +425,113 @@ int BrowserAccessibilityAndroid::GetEditableTextLength() const { |
return value().length(); |
} |
+int BrowserAccessibilityAndroid::AndroidInputType() const { |
+ std::string html_tag = GetStringAttribute( |
+ AccessibilityNodeData::ATTR_HTML_TAG); |
+ if (html_tag != "input") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_NULL; |
+ |
+ std::string type; |
+ if (!GetHtmlAttribute("type", &type)) |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT; |
+ |
+ if (type == "" || type == "text" || type == "search") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT; |
+ else if (type == "date") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE; |
+ else if (type == "datetime" || type == "datetime-local") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME; |
+ else if (type == "email") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EMAIL; |
+ else if (type == "month") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE; |
+ else if (type == "number") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER; |
+ else if (type == "password") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_PASSWORD; |
+ else if (type == "tel") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_PHONE; |
+ else if (type == "time") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME; |
+ else if (type == "url") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_URI; |
+ else if (type == "week") |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME; |
+ |
+ return ANDROID_TEXT_INPUTTYPE_TYPE_NULL; |
+} |
+ |
+int BrowserAccessibilityAndroid::AndroidLiveRegionType() const { |
+ std::string live = GetStringAttribute( |
+ AccessibilityNodeData::ATTR_LIVE_STATUS); |
+ if (live == "polite") |
+ return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_POLITE; |
+ else if (live == "assertive") |
+ return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_ASSERTIVE; |
+ return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_NONE; |
+} |
+ |
+int BrowserAccessibilityAndroid::AndroidRangeType() const { |
+ return ANDROID_VIEW_ACCESSIBILITY_RANGE_TYPE_FLOAT; |
+} |
+ |
+int BrowserAccessibilityAndroid::RowCount() const { |
+ if (role() == blink::WebAXRoleGrid || |
+ role() == blink::WebAXRoleTable) { |
+ return CountChildrenWithRole(blink::WebAXRoleRow); |
+ } |
+ |
+ if (role() == blink::WebAXRoleList || |
+ role() == blink::WebAXRoleListBox || |
+ role() == blink::WebAXRoleTree) { |
+ return PlatformChildCount(); |
+ } |
+ |
+ return 0; |
+} |
+ |
+int BrowserAccessibilityAndroid::ColumnCount() const { |
+ if (role() == blink::WebAXRoleGrid || |
+ role() == blink::WebAXRoleTable) { |
+ return CountChildrenWithRole(blink::WebAXRoleColumn); |
+ } |
+ return 0; |
+} |
+ |
+int BrowserAccessibilityAndroid::RowIndex() const { |
+ if (role() == blink::WebAXRoleListItem || |
+ role() == blink::WebAXRoleListBoxOption || |
+ role() == blink::WebAXRoleTreeItem) { |
+ return index_in_parent(); |
+ } |
+ |
+ return GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX); |
+} |
+ |
+int BrowserAccessibilityAndroid::RowSpan() const { |
+ return GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN); |
+} |
+ |
+int BrowserAccessibilityAndroid::ColumnIndex() const { |
+ return GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX); |
+} |
+ |
+int BrowserAccessibilityAndroid::ColumnSpan() const { |
+ return GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN); |
+} |
+ |
+float BrowserAccessibilityAndroid::RangeMin() const { |
+ return GetFloatAttribute(AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE); |
+} |
+ |
+float BrowserAccessibilityAndroid::RangeMax() const { |
+ return GetFloatAttribute(AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE); |
+} |
+ |
+float BrowserAccessibilityAndroid::RangeCurrentValue() const { |
+ return GetFloatAttribute(AccessibilityNodeData::ATTR_VALUE_FOR_RANGE); |
+} |
+ |
bool BrowserAccessibilityAndroid::HasFocusableChild() const { |
// This is called from PlatformIsLeaf, so don't call PlatformChildCount |
// from within this! |
@@ -408,4 +600,14 @@ void BrowserAccessibilityAndroid::NotifyLiveRegionUpdate( |
} |
} |
+int BrowserAccessibilityAndroid::CountChildrenWithRole( |
+ blink::WebAXRole role) const { |
+ int count = 0; |
+ for (uint32 i = 0; i < PlatformChildCount(); i++) { |
+ if (PlatformGetChild(i)->role() == role) |
+ count++; |
+ } |
+ return count; |
+} |
+ |
} // namespace content |