summaryrefslogtreecommitdiffstats
path: root/content/browser/accessibility
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/accessibility')
-rw-r--r--content/browser/accessibility/browser_accessibility.cc202
-rw-r--r--content/browser/accessibility/browser_accessibility.h131
-rw-r--r--content/browser/accessibility/browser_accessibility_android.cc21
-rw-r--r--content/browser/accessibility/browser_accessibility_cocoa.mm230
-rw-r--r--content/browser/accessibility/browser_accessibility_gtk.cc13
-rw-r--r--content/browser/accessibility/browser_accessibility_gtk.h4
-rw-r--r--content/browser/accessibility/browser_accessibility_mac_unittest.mm5
-rw-r--r--content/browser/accessibility/browser_accessibility_manager.cc12
-rw-r--r--content/browser/accessibility/browser_accessibility_manager_unittest.cc40
-rw-r--r--content/browser/accessibility/browser_accessibility_win.cc238
-rw-r--r--content/browser/accessibility/browser_accessibility_win.h8
-rw-r--r--content/browser/accessibility/browser_accessibility_win_unittest.cc66
-rw-r--r--content/browser/accessibility/cross_platform_accessibility_browsertest.cc110
13 files changed, 646 insertions, 434 deletions
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index ae7efe2..37217c7 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -7,6 +7,7 @@
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
#include "content/browser/accessibility/browser_accessibility_manager.h"
#include "content/common/accessibility_messages.h"
@@ -64,22 +65,20 @@ void BrowserAccessibility::InitializeTreeStructure(
void BrowserAccessibility::InitializeData(const AccessibilityNodeData& src) {
DCHECK_EQ(renderer_id_, src.id);
- name_ = src.name;
- value_ = src.value;
role_ = src.role;
state_ = src.state;
string_attributes_ = src.string_attributes;
int_attributes_ = src.int_attributes;
float_attributes_ = src.float_attributes;
bool_attributes_ = src.bool_attributes;
+ intlist_attributes_ = src.intlist_attributes;
html_attributes_ = src.html_attributes;
location_ = src.location;
- indirect_child_ids_ = src.indirect_child_ids;
- line_breaks_ = src.line_breaks;
- cell_ids_ = src.cell_ids;
- unique_cell_ids_ = src.unique_cell_ids;
instance_active_ = true;
+ GetStringAttribute(AccessibilityNodeData::ATTR_NAME, &name_);
+ GetStringAttribute(AccessibilityNodeData::ATTR_VALUE, &value_);
+
PreInitialize();
}
@@ -223,55 +222,197 @@ void BrowserAccessibility::NativeReleaseReference() {
delete this;
}
+bool BrowserAccessibility::HasBoolAttribute(BoolAttribute attribute) const {
+ for (size_t i = 0; i < bool_attributes_.size(); ++i) {
+ if (bool_attributes_[i].first == attribute)
+ return true;
+ }
+
+ return false;
+}
+
+
+bool BrowserAccessibility::GetBoolAttribute(BoolAttribute attribute) const {
+ for (size_t i = 0; i < bool_attributes_.size(); ++i) {
+ if (bool_attributes_[i].first == attribute)
+ return bool_attributes_[i].second;
+ }
+
+ return false;
+}
+
bool BrowserAccessibility::GetBoolAttribute(
BoolAttribute attribute, bool* value) const {
- BoolAttrMap::const_iterator iter = bool_attributes_.find(attribute);
- if (iter != bool_attributes_.end()) {
- *value = iter->second;
- return true;
+ for (size_t i = 0; i < bool_attributes_.size(); ++i) {
+ if (bool_attributes_[i].first == attribute) {
+ *value = bool_attributes_[i].second;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool BrowserAccessibility::HasFloatAttribute(FloatAttribute attribute) const {
+ for (size_t i = 0; i < float_attributes_.size(); ++i) {
+ if (float_attributes_[i].first == attribute)
+ return true;
}
return false;
}
+float BrowserAccessibility::GetFloatAttribute(FloatAttribute attribute) const {
+ for (size_t i = 0; i < float_attributes_.size(); ++i) {
+ if (float_attributes_[i].first == attribute)
+ return float_attributes_[i].second;
+ }
+
+ return 0.0;
+}
+
bool BrowserAccessibility::GetFloatAttribute(
FloatAttribute attribute, float* value) const {
- FloatAttrMap::const_iterator iter = float_attributes_.find(attribute);
- if (iter != float_attributes_.end()) {
- *value = iter->second;
- return true;
+ for (size_t i = 0; i < float_attributes_.size(); ++i) {
+ if (float_attributes_[i].first == attribute) {
+ *value = float_attributes_[i].second;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool BrowserAccessibility::HasIntAttribute(IntAttribute attribute) const {
+ for (size_t i = 0; i < int_attributes_.size(); ++i) {
+ if (int_attributes_[i].first == attribute)
+ return true;
}
return false;
}
+int BrowserAccessibility::GetIntAttribute(IntAttribute attribute) const {
+ for (size_t i = 0; i < int_attributes_.size(); ++i) {
+ if (int_attributes_[i].first == attribute)
+ return int_attributes_[i].second;
+ }
+
+ return 0;
+}
+
bool BrowserAccessibility::GetIntAttribute(
IntAttribute attribute, int* value) const {
- IntAttrMap::const_iterator iter = int_attributes_.find(attribute);
- if (iter != int_attributes_.end()) {
- *value = iter->second;
- return true;
+ for (size_t i = 0; i < int_attributes_.size(); ++i) {
+ if (int_attributes_[i].first == attribute) {
+ *value = int_attributes_[i].second;
+ return true;
+ }
}
return false;
}
+bool BrowserAccessibility::HasStringAttribute(StringAttribute attribute) const {
+ for (size_t i = 0; i < string_attributes_.size(); ++i) {
+ if (string_attributes_[i].first == attribute)
+ return true;
+ }
+
+ return false;
+}
+
+const std::string& BrowserAccessibility::GetStringAttribute(
+ StringAttribute attribute) const {
+ CR_DEFINE_STATIC_LOCAL(std::string, empty_string, ());
+ for (size_t i = 0; i < string_attributes_.size(); ++i) {
+ if (string_attributes_[i].first == attribute)
+ return string_attributes_[i].second;
+ }
+
+ return empty_string;
+}
+
bool BrowserAccessibility::GetStringAttribute(
+ StringAttribute attribute, std::string* value) const {
+ for (size_t i = 0; i < string_attributes_.size(); ++i) {
+ if (string_attributes_[i].first == attribute) {
+ *value = string_attributes_[i].second;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+string16 BrowserAccessibility::GetString16Attribute(
+ StringAttribute attribute) const {
+ std::string value_utf8;
+ if (!GetStringAttribute(attribute, &value_utf8))
+ return string16();
+ return UTF8ToUTF16(value_utf8);
+}
+
+bool BrowserAccessibility::GetString16Attribute(
StringAttribute attribute,
string16* value) const {
- StringAttrMap::const_iterator iter = string_attributes_.find(attribute);
- if (iter != string_attributes_.end()) {
- *value = iter->second;
- return true;
+ std::string value_utf8;
+ if (!GetStringAttribute(attribute, &value_utf8))
+ return false;
+ *value = UTF8ToUTF16(value_utf8);
+ return true;
+}
+
+void BrowserAccessibility::SetStringAttribute(
+ StringAttribute attribute, const std::string& value) {
+ for (size_t i = 0; i < string_attributes_.size(); ++i) {
+ if (string_attributes_[i].first == attribute) {
+ string_attributes_[i].second = value;
+ return;
+ }
+ }
+ if (!value.empty())
+ string_attributes_.push_back(std::make_pair(attribute, value));
+}
+
+bool BrowserAccessibility::HasIntListAttribute(
+ AccessibilityNodeData::IntListAttribute attribute) const {
+ for (size_t i = 0; i < intlist_attributes_.size(); ++i) {
+ if (intlist_attributes_[i].first == attribute)
+ return true;
+ }
+
+ return false;
+}
+
+const std::vector<int32>& BrowserAccessibility::GetIntListAttribute(
+ AccessibilityNodeData::IntListAttribute attribute) const {
+ CR_DEFINE_STATIC_LOCAL(std::vector<int32>, empty_vector, ());
+ for (size_t i = 0; i < intlist_attributes_.size(); ++i) {
+ if (intlist_attributes_[i].first == attribute)
+ return intlist_attributes_[i].second;
+ }
+
+ return empty_vector;
+}
+
+bool BrowserAccessibility::GetIntListAttribute(
+ AccessibilityNodeData::IntListAttribute attribute,
+ std::vector<int32>* value) const {
+ for (size_t i = 0; i < intlist_attributes_.size(); ++i) {
+ if (intlist_attributes_[i].first == attribute) {
+ *value = intlist_attributes_[i].second;
+ return true;
+ }
}
return false;
}
bool BrowserAccessibility::GetHtmlAttribute(
- const char* html_attr, string16* value) const {
+ const char* html_attr, std::string* value) const {
for (size_t i = 0; i < html_attributes_.size(); i++) {
- const string16& attr = html_attributes_[i].first;
+ const std::string& attr = html_attributes_[i].first;
if (LowerCaseEqualsASCII(attr, html_attr)) {
*value = html_attributes_[i].second;
return true;
@@ -281,6 +422,15 @@ bool BrowserAccessibility::GetHtmlAttribute(
return false;
}
+bool BrowserAccessibility::GetHtmlAttribute(
+ const char* html_attr, string16* value) const {
+ std::string value_utf8;
+ if (!GetHtmlAttribute(html_attr, &value_utf8))
+ return false;
+ *value = UTF8ToUTF16(value_utf8);
+ return true;
+}
+
bool BrowserAccessibility::GetAriaTristate(
const char* html_attr,
bool* is_defined,
@@ -327,12 +477,12 @@ bool BrowserAccessibility::IsEditableText() const {
role_ == AccessibilityNodeData::ROLE_TEXTAREA);
}
-string16 BrowserAccessibility::GetTextRecursive() const {
+std::string BrowserAccessibility::GetTextRecursive() const {
if (!name_.empty()) {
return name_;
}
- string16 result;
+ std::string result;
for (size_t i = 0; i < children_.size(); ++i)
result += children_[i]->GetTextRecursive();
return result;
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h
index 8fda68f..33eb60d 100644
--- a/content/browser/accessibility/browser_accessibility.h
+++ b/content/browser/accessibility/browser_accessibility.h
@@ -10,6 +10,7 @@
#include <vector>
#include "base/basictypes.h"
+#include "base/strings/string16.h"
#include "build/build_config.h"
#include "content/common/accessibility_node_data.h"
#include "content/common/content_export.h"
@@ -26,12 +27,6 @@ class BrowserAccessibilityWin;
class BrowserAccessibilityGtk;
#endif
-typedef std::map<AccessibilityNodeData::BoolAttribute, bool> BoolAttrMap;
-typedef std::map<AccessibilityNodeData::FloatAttribute, float> FloatAttrMap;
-typedef std::map<AccessibilityNodeData::IntAttribute, int> IntAttrMap;
-typedef std::map<AccessibilityNodeData::StringAttribute, string16>
- StringAttrMap;
-
////////////////////////////////////////////////////////////////////////////////
//
// BrowserAccessibility
@@ -136,49 +131,21 @@ class CONTENT_EXPORT BrowserAccessibility {
// Accessors
//
- const BoolAttrMap& bool_attributes() const {
- return bool_attributes_;
- }
-
- const FloatAttrMap& float_attributes() const {
- return float_attributes_;
- }
-
- const IntAttrMap& int_attributes() const {
- return int_attributes_;
- }
-
- const StringAttrMap& string_attributes() const {
- return string_attributes_;
- }
-
const std::vector<BrowserAccessibility*>& children() const {
return children_;
}
- const std::vector<std::pair<string16, string16> >& html_attributes() const {
+ const std::vector<std::pair<std::string, std::string> >&
+ html_attributes() const {
return html_attributes_;
}
int32 index_in_parent() const { return index_in_parent_; }
- const std::vector<int32>& indirect_child_ids() const {
- return indirect_child_ids_;
- }
- const std::vector<int32>& line_breaks() const {
- return line_breaks_;
- }
- const std::vector<int32>& cell_ids() const {
- return cell_ids_;
- }
- const std::vector<int32>& unique_cell_ids() const {
- return unique_cell_ids_;
- }
gfx::Rect location() const { return location_; }
BrowserAccessibilityManager* manager() const { return manager_; }
- const string16& name() const { return name_; }
+ const std::string& name() const { return name_; }
int32 renderer_id() const { return renderer_id_; }
int32 role() const { return role_; }
- const string16& role_name() const { return role_name_; }
int32 state() const { return state_; }
- const string16& value() const { return value_; }
+ const std::string& value() const { return value_; }
bool instance_active() const { return instance_active_; }
#if defined(OS_MACOSX) && __OBJC__
@@ -189,29 +156,63 @@ class CONTENT_EXPORT BrowserAccessibility {
BrowserAccessibilityGtk* ToBrowserAccessibilityGtk();
#endif
- // Retrieve the value of a bool attribute from the bool attribute
- // map and returns true if found.
- bool GetBoolAttribute(
- AccessibilityNodeData::BoolAttribute attr, bool* value) const;
-
- // Retrieve the value of a float attribute from the float attribute
- // map and returns true if found.
+ // Accessing accessibility attributes:
+ //
+ // There are dozens of possible attributes for an accessibility node,
+ // but only a few tend to apply to any one object, so we store them
+ // in sparse arrays of <attribute id, attribute value> pairs, organized
+ // by type (bool, int, float, string, int list).
+ //
+ // There are three accessors for each type of attribute: one that returns
+ // true if the attribute is present and false if not, one that takes a
+ // pointer argument and returns true if the attribute is present (if you
+ // need to distinguish between the default value and a missing attribute),
+ // and another that returns the default value for that type if the
+ // attribute is not present. In addition, strings can be returned as
+ // either std::string or string16, for convenience.
+
+ bool HasBoolAttribute(AccessibilityNodeData::BoolAttribute attr) const;
+ bool GetBoolAttribute(AccessibilityNodeData::BoolAttribute attr) const;
+ bool GetBoolAttribute(AccessibilityNodeData::BoolAttribute attr,
+ bool* value) const;
+
+ bool HasFloatAttribute(AccessibilityNodeData::FloatAttribute attr) const;
+ float GetFloatAttribute(AccessibilityNodeData::FloatAttribute attr) const;
bool GetFloatAttribute(AccessibilityNodeData::FloatAttribute attr,
float* value) const;
- // Retrieve the value of an integer attribute from the integer attribute
- // map and returns true if found.
+ bool HasIntAttribute(AccessibilityNodeData::IntAttribute attribute) const;
+ int GetIntAttribute(AccessibilityNodeData::IntAttribute attribute) const;
bool GetIntAttribute(AccessibilityNodeData::IntAttribute attribute,
int* value) const;
- // Retrieve the value of a string attribute from the attribute map and
- // returns true if found.
- bool GetStringAttribute(
- AccessibilityNodeData::StringAttribute attribute, string16* value) const;
+ bool HasStringAttribute(
+ AccessibilityNodeData::StringAttribute attribute) const;
+ const std::string& GetStringAttribute(
+ AccessibilityNodeData::StringAttribute attribute) const;
+ bool GetStringAttribute(AccessibilityNodeData::StringAttribute attribute,
+ std::string* value) const;
+
+ bool GetString16Attribute(AccessibilityNodeData::StringAttribute attribute,
+ string16* value) const;
+ string16 GetString16Attribute(
+ AccessibilityNodeData::StringAttribute attribute) const;
+
+ bool HasIntListAttribute(
+ AccessibilityNodeData::IntListAttribute attribute) const;
+ const std::vector<int32>& GetIntListAttribute(
+ AccessibilityNodeData::IntListAttribute attribute) const;
+ bool GetIntListAttribute(AccessibilityNodeData::IntListAttribute attribute,
+ std::vector<int32>* value) const;
+
+ void SetStringAttribute(
+ AccessibilityNodeData::StringAttribute attribute,
+ const std::string& value);
// Retrieve the value of a html attribute from the attribute map and
// returns true if found.
bool GetHtmlAttribute(const char* attr, string16* value) const;
+ bool GetHtmlAttribute(const char* attr, std::string* value) const;
// Utility method to handle special cases for ARIA booleans, tristates and
// booleans which have a "mixed" state.
@@ -236,7 +237,7 @@ class CONTENT_EXPORT BrowserAccessibility {
bool IsEditableText() const;
// Append the text from this node and its children.
- string16 GetTextRecursive() const;
+ std::string GetTextRecursive() const;
protected:
// Perform platform specific initialization. This can be called multiple times
@@ -264,21 +265,23 @@ class CONTENT_EXPORT BrowserAccessibility {
std::vector<BrowserAccessibility*> children_;
// Accessibility metadata from the renderer
- string16 name_;
- string16 value_;
- BoolAttrMap bool_attributes_;
- IntAttrMap int_attributes_;
- FloatAttrMap float_attributes_;
- StringAttrMap string_attributes_;
- std::vector<std::pair<string16, string16> > html_attributes_;
+ std::string name_;
+ std::string value_;
+ std::vector<std::pair<
+ AccessibilityNodeData::BoolAttribute, bool> > bool_attributes_;
+ std::vector<std::pair<
+ AccessibilityNodeData::FloatAttribute, float> > float_attributes_;
+ std::vector<std::pair<
+ AccessibilityNodeData::IntAttribute, int> > int_attributes_;
+ std::vector<std::pair<
+ AccessibilityNodeData::StringAttribute, std::string> > string_attributes_;
+ std::vector<std::pair<
+ AccessibilityNodeData::IntListAttribute, std::vector<int32> > >
+ intlist_attributes_;
+ std::vector<std::pair<std::string, std::string> > html_attributes_;
int32 role_;
int32 state_;
- string16 role_name_;
gfx::Rect location_;
- std::vector<int32> indirect_child_ids_;
- std::vector<int32> line_breaks_;
- std::vector<int32> cell_ids_;
- std::vector<int32> unique_cell_ids_;
// BrowserAccessibility objects are reference-counted on some platforms.
// When we're done with this object and it's removed from our accessibility
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc
index 8ff37ec..a31539a 100644
--- a/content/browser/accessibility/browser_accessibility_android.cc
+++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -174,16 +174,15 @@ string16 BrowserAccessibilityAndroid::GetText() const {
return string16();
}
- string16 description;
- GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, &description);
-
+ string16 description = GetString16Attribute(
+ AccessibilityNodeData::ATTR_DESCRIPTION);
string16 text;
if (!name().empty())
- text = name();
+ text = base::UTF8ToUTF16(name());
else if (!description.empty())
text = description;
else if (!value().empty())
- text = value();
+ text = base::UTF8ToUTF16(value());
if (text.empty() && HasOnlyStaticTextChildren()) {
for (uint32 i = 0; i < child_count(); i++) {
@@ -361,8 +360,8 @@ bool BrowserAccessibilityAndroid::HasOnlyStaticTextChildren() const {
}
bool BrowserAccessibilityAndroid::IsIframe() const {
- string16 html_tag;
- GetStringAttribute(AccessibilityNodeData::ATTR_HTML_TAG, &html_tag);
+ string16 html_tag = GetString16Attribute(
+ AccessibilityNodeData::ATTR_HTML_TAG);
return html_tag == ASCIIToUTF16("iframe");
}
@@ -370,9 +369,9 @@ void BrowserAccessibilityAndroid::PostInitialize() {
BrowserAccessibility::PostInitialize();
if (IsEditableText()) {
- if (value_ != new_value_) {
+ if (base::UTF8ToUTF16(value_) != new_value_) {
old_value_ = new_value_;
- new_value_ = value_;
+ new_value_ = base::UTF8ToUTF16(value_);
}
}
@@ -380,8 +379,8 @@ void BrowserAccessibilityAndroid::PostInitialize() {
manager_->NotifyAccessibilityEvent(AccessibilityNotificationAlert, this);
string16 live;
- if (GetStringAttribute(AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS,
- &live)) {
+ if (GetString16Attribute(
+ AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS, &live)) {
NotifyLiveRegionUpdate(live);
}
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index 9d49767..8285e9d 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -33,15 +33,10 @@ namespace {
// Returns an autoreleased copy of the AccessibilityNodeData's attribute.
NSString* NSStringForStringAttribute(
- const std::map<StringAttribute, string16>& attributes,
+ BrowserAccessibility* browserAccessibility,
StringAttribute attribute) {
- std::map<StringAttribute, string16>::const_iterator iter =
- attributes.find(attribute);
- NSString* returnValue = @"";
- if (iter != attributes.end()) {
- returnValue = base::SysUTF16ToNSString(iter->second);
- }
- return returnValue;
+ return base::SysUTF8ToNSString(
+ browserAccessibility->GetStringAttribute(attribute));
}
struct MapEntry {
@@ -353,34 +348,29 @@ NSDictionary* attributeToMethodNameMap = nil;
- (NSString*)accessKey {
return NSStringForStringAttribute(
- browserAccessibility_->string_attributes(),
- AccessibilityNodeData::ATTR_ACCESS_KEY);
+ browserAccessibility_, AccessibilityNodeData::ATTR_ACCESS_KEY);
}
- (NSNumber*)ariaAtomic {
- bool boolValue = false;
- browserAccessibility_->GetBoolAttribute(
- AccessibilityNodeData::ATTR_LIVE_ATOMIC, &boolValue);
+ bool boolValue = browserAccessibility_->GetBoolAttribute(
+ AccessibilityNodeData::ATTR_LIVE_ATOMIC);
return [NSNumber numberWithBool:boolValue];
}
- (NSNumber*)ariaBusy {
- bool boolValue = false;
- browserAccessibility_->GetBoolAttribute(
- AccessibilityNodeData::ATTR_LIVE_BUSY, &boolValue);
+ bool boolValue = browserAccessibility_->GetBoolAttribute(
+ AccessibilityNodeData::ATTR_LIVE_BUSY);
return [NSNumber numberWithBool:boolValue];
}
- (NSString*)ariaLive {
return NSStringForStringAttribute(
- browserAccessibility_->string_attributes(),
- AccessibilityNodeData::ATTR_LIVE_STATUS);
+ browserAccessibility_, AccessibilityNodeData::ATTR_LIVE_STATUS);
}
- (NSString*)ariaRelevant {
return NSStringForStringAttribute(
- browserAccessibility_->string_attributes(),
- AccessibilityNodeData::ATTR_LIVE_RELEVANT);
+ browserAccessibility_, AccessibilityNodeData::ATTR_LIVE_RELEVANT);
}
// Returns an array of BrowserAccessibilityCocoa objects, representing the
@@ -401,10 +391,11 @@ NSDictionary* attributeToMethodNameMap = nil;
}
// Also, add indirect children (if any).
- for (uint32 i = 0;
- i < browserAccessibility_->indirect_child_ids().size();
- ++i) {
- int32 child_id = browserAccessibility_->indirect_child_ids()[i];
+ const std::vector<int32>& indirectChildIds =
+ browserAccessibility_->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS);
+ for (uint32 i = 0; i < indirectChildIds.size(); ++i) {
+ int32 child_id = indirectChildIds[i];
BrowserAccessibility* child =
browserAccessibility_->manager()->GetFromRendererID(child_id);
@@ -437,7 +428,8 @@ NSDictionary* attributeToMethodNameMap = nil;
NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
const std::vector<int32>& uniqueCellIds =
- browserAccessibility_->unique_cell_ids();
+ browserAccessibility_->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
for (size_t i = 0; i < uniqueCellIds.size(); ++i) {
int id = uniqueCellIds[i];
BrowserAccessibility* cell =
@@ -473,35 +465,34 @@ NSDictionary* attributeToMethodNameMap = nil;
}
- (NSString*)description {
- const std::map<StringAttribute, string16>& attributes =
- browserAccessibility_->string_attributes();
- std::map<StringAttribute, string16>::const_iterator iter =
- attributes.find(AccessibilityNodeData::ATTR_DESCRIPTION);
- if (iter != attributes.end())
- return base::SysUTF16ToNSString(iter->second);
+ std::string description;
+ if (browserAccessibility_->GetStringAttribute(
+ AccessibilityNodeData::ATTR_DESCRIPTION, &description)) {
+ return base::SysUTF8ToNSString(description);
+ }
// If the role is anything other than an image, or if there's
// a title or title UI element, just return an empty string.
if (![[self role] isEqualToString:NSAccessibilityImageRole])
return @"";
- if (!browserAccessibility_->name().empty())
+ if (browserAccessibility_->HasStringAttribute(
+ AccessibilityNodeData::ATTR_NAME)) {
return @"";
+ }
if ([self titleUIElement])
return @"";
// The remaining case is an image where there's no other title.
// Return the base part of the filename as the description.
- iter = attributes.find(AccessibilityNodeData::ATTR_URL);
- if (iter != attributes.end()) {
- string16 filename = iter->second;
+ std::string url;
+ if (browserAccessibility_->GetStringAttribute(
+ AccessibilityNodeData::ATTR_URL, &url)) {
// Given a url like http://foo.com/bar/baz.png, just return the
// base name, e.g., "baz.png".
- size_t leftIndex = filename.size();
- while (leftIndex > 0 && filename[leftIndex - 1] != '/')
- leftIndex--;
- string16 basename = filename.substr(leftIndex);
-
- return base::SysUTF16ToNSString(basename);
+ size_t leftIndex = url.rfind('/');
+ std::string basename =
+ leftIndex != std::string::npos ? url.substr(leftIndex) : url;
+ return base::SysUTF8ToNSString(basename);
}
return @"";
@@ -526,9 +517,8 @@ NSDictionary* attributeToMethodNameMap = nil;
AccessibilityNodeData::Role role = [self internalRole];
if (role == AccessibilityNodeData::ROLE_ROW ||
role == AccessibilityNodeData::ROLE_TREE_ITEM) {
- int level = 0;
- browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level);
+ int level = browserAccessibility_->GetIntAttribute(
+ AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL);
// Mac disclosureLevel is 0-based, but web levels are 1-based.
if (level > 0)
level--;
@@ -581,23 +571,18 @@ NSDictionary* attributeToMethodNameMap = nil;
- (NSString*)help {
return NSStringForStringAttribute(
- browserAccessibility_->string_attributes(),
- AccessibilityNodeData::ATTR_HELP);
+ browserAccessibility_, AccessibilityNodeData::ATTR_HELP);
}
- (NSNumber*)index {
if ([self internalRole] == AccessibilityNodeData::ROLE_COLUMN) {
- int columnIndex;
- if (browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_TABLE_COLUMN_INDEX, &columnIndex)) {
- return [NSNumber numberWithInt:columnIndex];
- }
+ int columnIndex = browserAccessibility_->GetIntAttribute(
+ AccessibilityNodeData::ATTR_TABLE_COLUMN_INDEX);
+ return [NSNumber numberWithInt:columnIndex];
} else if ([self internalRole] == AccessibilityNodeData::ROLE_ROW) {
- int rowIndex;
- if (browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_TABLE_ROW_INDEX, &rowIndex)) {
- return [NSNumber numberWithInt:rowIndex];
- }
+ int rowIndex = browserAccessibility_->GetIntAttribute(
+ AccessibilityNodeData::ATTR_TABLE_ROW_INDEX);
+ return [NSNumber numberWithInt:rowIndex];
}
return nil;
@@ -626,23 +611,20 @@ NSDictionary* attributeToMethodNameMap = nil;
}
- (NSNumber*)loadingProgress {
- float floatValue = 0.0;
- browserAccessibility_->GetFloatAttribute(
- AccessibilityNodeData::ATTR_DOC_LOADING_PROGRESS, &floatValue);
+ float floatValue = browserAccessibility_->GetFloatAttribute(
+ AccessibilityNodeData::ATTR_DOC_LOADING_PROGRESS);
return [NSNumber numberWithFloat:floatValue];
}
- (NSNumber*)maxValue {
- float floatValue = 0.0;
- browserAccessibility_->GetFloatAttribute(
- AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE, &floatValue);
+ float floatValue = browserAccessibility_->GetFloatAttribute(
+ AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE);
return [NSNumber numberWithFloat:floatValue];
}
- (NSNumber*)minValue {
- float floatValue = 0.0;
- browserAccessibility_->GetFloatAttribute(
- AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE, &floatValue);
+ float floatValue = browserAccessibility_->GetFloatAttribute(
+ AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE);
return [NSNumber numberWithFloat:floatValue];
}
@@ -728,18 +710,15 @@ NSDictionary* attributeToMethodNameMap = nil;
if ([role isEqualToString:NSAccessibilityGroupRole] ||
[role isEqualToString:NSAccessibilityRadioButtonRole]) {
- const std::vector<std::pair<string16, string16> >& htmlAttributes =
- browserAccessibility_->html_attributes();
- AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole];
- if ((browserAccessibilityRole != AccessibilityNodeData::ROLE_GROUP &&
- browserAccessibilityRole != AccessibilityNodeData::ROLE_LIST_ITEM) ||
- browserAccessibilityRole == AccessibilityNodeData::ROLE_TAB) {
- for (size_t i = 0; i < htmlAttributes.size(); ++i) {
- const std::pair<string16, string16>& htmlAttribute = htmlAttributes[i];
- if (htmlAttribute.first == ASCIIToUTF16("role")) {
- // TODO(dtseng): This is not localized; see crbug/84814.
- return base::SysUTF16ToNSString(htmlAttribute.second);
- }
+ std::string role;
+ if (browserAccessibility_->GetHtmlAttribute("role", &role)) {
+ AccessibilityNodeData::Role internalRole =
+ [self internalRole];
+ if ((internalRole != AccessibilityNodeData::ROLE_GROUP &&
+ internalRole != AccessibilityNodeData::ROLE_LIST_ITEM) ||
+ internalRole == AccessibilityNodeData::ROLE_TAB) {
+ // TODO(dtseng): This is not localized; see crbug/84814.
+ return base::SysUTF8ToNSString(role);
}
}
}
@@ -767,7 +746,8 @@ NSDictionary* attributeToMethodNameMap = nil;
NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
const std::vector<int32>& uniqueCellIds =
- browserAccessibility_->unique_cell_ids();
+ browserAccessibility_->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
for (size_t i = 0; i < uniqueCellIds.size(); ++i) {
int id = uniqueCellIds[i];
BrowserAccessibility* cell =
@@ -804,7 +784,8 @@ NSDictionary* attributeToMethodNameMap = nil;
}
} else if ([self internalRole] == AccessibilityNodeData::ROLE_COLUMN) {
const std::vector<int32>& indirectChildIds =
- browserAccessibility_->indirect_child_ids();
+ browserAccessibility_->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS);
for (uint32 i = 0; i < indirectChildIds.size(); ++i) {
int id = indirectChildIds[i];
BrowserAccessibility* rowElement =
@@ -832,8 +813,7 @@ NSDictionary* attributeToMethodNameMap = nil;
}
NSString* htmlTag = NSStringForStringAttribute(
- browserAccessibility_->string_attributes(),
- AccessibilityNodeData::ATTR_HTML_TAG);
+ browserAccessibility_, AccessibilityNodeData::ATTR_HTML_TAG);
if (browserAccessibilityRole == AccessibilityNodeData::ROLE_LIST) {
if ([htmlTag isEqualToString:@"ul"] ||
@@ -864,7 +844,8 @@ NSDictionary* attributeToMethodNameMap = nil;
}
- (NSString*)title {
- return base::SysUTF16ToNSString(browserAccessibility_->name());
+ return NSStringForStringAttribute(
+ browserAccessibility_, AccessibilityNodeData::ATTR_NAME);
}
- (id)titleUIElement {
@@ -884,9 +865,7 @@ NSDictionary* attributeToMethodNameMap = nil;
[[self role] isEqualToString:@"AXWebArea"] ?
AccessibilityNodeData::ATTR_DOC_URL :
AccessibilityNodeData::ATTR_URL;
- return NSStringForStringAttribute(
- browserAccessibility_->string_attributes(),
- urlAttribute);
+ return NSStringForStringAttribute(browserAccessibility_, urlAttribute);
}
- (id)value {
@@ -895,7 +874,7 @@ NSDictionary* attributeToMethodNameMap = nil;
// to approximate Cocoa ax behavior best as we can.
NSString* role = [self role];
if ([role isEqualToString:@"AXHeading"]) {
- int level;
+ int level = 0;
if (browserAccessibility_->GetIntAttribute(
AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level)) {
return [NSNumber numberWithInt:level];
@@ -913,11 +892,10 @@ NSDictionary* attributeToMethodNameMap = nil;
1 :
value;
- bool mixed = false;
- browserAccessibility_->GetBoolAttribute(
- AccessibilityNodeData::ATTR_BUTTON_MIXED, &mixed);
- if (mixed)
+ if (browserAccessibility_->GetBoolAttribute(
+ AccessibilityNodeData::ATTR_BUTTON_MIXED)) {
value = 2;
+ }
return [NSNumber numberWithInt:value];
} else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] ||
[role isEqualToString:NSAccessibilitySliderRole] ||
@@ -928,26 +906,24 @@ NSDictionary* attributeToMethodNameMap = nil;
return [NSNumber numberWithFloat:floatValue];
}
} else if ([role isEqualToString:NSAccessibilityColorWellRole]) {
- int r, g, b;
- browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r);
- browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g);
- browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE, &b);
+ int r = browserAccessibility_->GetIntAttribute(
+ AccessibilityNodeData::ATTR_COLOR_VALUE_RED);
+ int g = browserAccessibility_->GetIntAttribute(
+ AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN);
+ int b = browserAccessibility_->GetIntAttribute(
+ AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE);
// This string matches the one returned by a native Mac color well.
return [NSString stringWithFormat:@"rgb %7.5f %7.5f %7.5f 1",
r / 255., g / 255., b / 255.];
}
- return base::SysUTF16ToNSString(browserAccessibility_->value());
+ return NSStringForStringAttribute(
+ browserAccessibility_, AccessibilityNodeData::ATTR_VALUE);
}
- (NSString*)valueDescription {
- if (!browserAccessibility_->value().empty())
- return base::SysUTF16ToNSString(browserAccessibility_->value());
- else
- return nil;
+ return NSStringForStringAttribute(
+ browserAccessibility_, AccessibilityNodeData::ATTR_VALUE);
}
- (NSValue*)visibleCharacterRange {
@@ -958,7 +934,8 @@ NSDictionary* attributeToMethodNameMap = nil;
- (NSArray*)visibleCells {
NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
const std::vector<int32>& uniqueCellIds =
- browserAccessibility_->unique_cell_ids();
+ browserAccessibility_->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
for (size_t i = 0; i < uniqueCellIds.size(); ++i) {
int id = uniqueCellIds[i];
BrowserAccessibility* cell =
@@ -1013,7 +990,8 @@ NSDictionary* attributeToMethodNameMap = nil;
if ([attribute isEqualToString:
NSAccessibilityInsertionPointLineNumberAttribute]) {
const std::vector<int32>& line_breaks =
- browserAccessibility_->line_breaks();
+ browserAccessibility_->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_LINE_BREAKS);
for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) {
if (line_breaks[i] > selStart)
return [NSNumber numberWithInt:i];
@@ -1021,8 +999,9 @@ NSDictionary* attributeToMethodNameMap = nil;
return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())];
}
if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) {
- return base::SysUTF16ToNSString(browserAccessibility_->value().substr(
- selStart, selLength));
+ std::string value = browserAccessibility_->GetStringAttribute(
+ AccessibilityNodeData::ATTR_VALUE);
+ return base::SysUTF8ToNSString(value.substr(selStart, selLength));
}
if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) {
return [NSValue valueWithRange:NSMakeRange(selStart, selLength)];
@@ -1038,14 +1017,17 @@ NSDictionary* attributeToMethodNameMap = nil;
if (!browserAccessibility_)
return nil;
- const std::vector<int32>& line_breaks = browserAccessibility_->line_breaks();
+ const std::vector<int32>& line_breaks =
+ browserAccessibility_->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_LINE_BREAKS);
int len = static_cast<int>(browserAccessibility_->value().size());
if ([attribute isEqualToString:
NSAccessibilityStringForRangeParameterizedAttribute]) {
NSRange range = [(NSValue*)parameter rangeValue];
- return base::SysUTF16ToNSString(
- browserAccessibility_->value().substr(range.location, range.length));
+ std::string value = browserAccessibility_->GetStringAttribute(
+ AccessibilityNodeData::ATTR_VALUE);
+ return base::SysUTF8ToNSString(value.substr(range.location, range.length));
}
if ([attribute isEqualToString:
@@ -1081,12 +1063,10 @@ NSDictionary* attributeToMethodNameMap = nil;
NSArray* array = parameter;
int column = [[array objectAtIndex:0] intValue];
int row = [[array objectAtIndex:1] intValue];
- int num_columns = 0;
- int num_rows = 0;
- browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &num_columns);
- browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &num_rows);
+ int num_columns = browserAccessibility_->GetIntAttribute(
+ AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT);
+ int num_rows = browserAccessibility_->GetIntAttribute(
+ AccessibilityNodeData::ATTR_TABLE_ROW_COUNT);
if (column < 0 || column >= num_columns ||
row < 0 || row >= num_rows) {
return nil;
@@ -1335,16 +1315,15 @@ NSDictionary* attributeToMethodNameMap = nil;
}
// Live regions.
- string16 s;
- if (browserAccessibility_->GetStringAttribute(
- AccessibilityNodeData::ATTR_LIVE_STATUS, &s)) {
+ if (browserAccessibility_->HasStringAttribute(
+ AccessibilityNodeData::ATTR_LIVE_STATUS)) {
[ret addObjectsFromArray:[NSArray arrayWithObjects:
@"AXARIALive",
@"AXARIARelevant",
nil]];
}
- if (browserAccessibility_->GetStringAttribute(
- AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS, &s)) {
+ if (browserAccessibility_->HasStringAttribute(
+ AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS)) {
[ret addObjectsFromArray:[NSArray arrayWithObjects:
@"AXARIAAtomic",
@"AXARIABusy",
@@ -1352,9 +1331,8 @@ NSDictionary* attributeToMethodNameMap = nil;
}
// Title UI Element.
- int i;
- if (browserAccessibility_->GetIntAttribute(
- AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &i)) {
+ if (browserAccessibility_->HasIntAttribute(
+ AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT)) {
[ret addObjectsFromArray:[NSArray arrayWithObjects:
NSAccessibilityTitleUIElementAttribute,
nil]];
@@ -1387,10 +1365,8 @@ NSDictionary* attributeToMethodNameMap = nil;
return GetState(browserAccessibility_,
AccessibilityNodeData::STATE_FOCUSABLE);
if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
- bool canSetValue = false;
- browserAccessibility_->GetBoolAttribute(
- AccessibilityNodeData::ATTR_CAN_SET_VALUE, &canSetValue);
- return canSetValue;
+ return browserAccessibility_->GetBoolAttribute(
+ AccessibilityNodeData::ATTR_CAN_SET_VALUE);
}
if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute] &&
([[self role] isEqualToString:NSAccessibilityTextFieldRole] ||
diff --git a/content/browser/accessibility/browser_accessibility_gtk.cc b/content/browser/accessibility/browser_accessibility_gtk.cc
index 5036428..f1a1f34 100644
--- a/content/browser/accessibility/browser_accessibility_gtk.cc
+++ b/content/browser/accessibility/browser_accessibility_gtk.cc
@@ -178,7 +178,8 @@ static const gchar* browser_accessibility_get_name(AtkObject* atk_object) {
BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
if (!obj)
return NULL;
- return obj->atk_acc_name().c_str();
+
+ return obj->GetStringAttribute(AccessibilityNodeData::ATTR_NAME).c_str();
}
static const gchar* browser_accessibility_get_description(
@@ -186,7 +187,9 @@ static const gchar* browser_accessibility_get_description(
BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
if (!obj)
return NULL;
- return obj->atk_acc_description().c_str();
+
+ return obj->GetStringAttribute(
+ AccessibilityNodeData::ATTR_DESCRIPTION).c_str();
}
static AtkObject* browser_accessibility_get_parent(AtkObject* atk_object) {
@@ -467,12 +470,6 @@ bool BrowserAccessibilityGtk::IsNative() const {
}
void BrowserAccessibilityGtk::InitRoleAndState() {
- atk_acc_name_ = UTF16ToUTF8(name());
-
- string16 description;
- GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, &description);
- atk_acc_description_ = UTF16ToUTF8(description);
-
switch(role_) {
case AccessibilityNodeData::ROLE_DOCUMENT:
case AccessibilityNodeData::ROLE_ROOT_WEB_AREA:
diff --git a/content/browser/accessibility/browser_accessibility_gtk.h b/content/browser/accessibility/browser_accessibility_gtk.h
index 8f3a2e3..c8895e3 100644
--- a/content/browser/accessibility/browser_accessibility_gtk.h
+++ b/content/browser/accessibility/browser_accessibility_gtk.h
@@ -68,8 +68,6 @@ class BrowserAccessibilityGtk : public BrowserAccessibility {
AtkObject* GetAtkObject() const;
AtkRole atk_role() { return atk_role_; }
- const std::string& atk_acc_name() { return atk_acc_name_; }
- const std::string& atk_acc_description() { return atk_acc_description_; }
// BrowserAccessibility methods.
virtual void PreInitialize() OVERRIDE;
@@ -83,8 +81,6 @@ class BrowserAccessibilityGtk : public BrowserAccessibility {
AtkObject* atk_object_;
AtkRole atk_role_;
- std::string atk_acc_name_;
- std::string atk_acc_description_;
int interface_mask_;
private:
diff --git a/content/browser/accessibility/browser_accessibility_mac_unittest.mm b/content/browser/accessibility/browser_accessibility_mac_unittest.mm
index 45137ec..9f12138 100644
--- a/content/browser/accessibility/browser_accessibility_mac_unittest.mm
+++ b/content/browser/accessibility/browser_accessibility_mac_unittest.mm
@@ -68,14 +68,13 @@ class BrowserAccessibilityTest : public ui::CocoaTest {
root.location.set_width(500);
root.location.set_height(100);
root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA;
- root.string_attributes[AccessibilityNodeData::ATTR_HELP] =
- ASCIIToUTF16("HelpText");
+ root.AddStringAttribute(AccessibilityNodeData::ATTR_HELP, "HelpText");
root.child_ids.push_back(1001);
root.child_ids.push_back(1002);
AccessibilityNodeData child1;
child1.id = 1001;
- child1.name = ASCIIToUTF16("Child1");
+ child1.SetName("Child1");
child1.location.set_width(250);
child1.location.set_height(100);
child1.role = AccessibilityNodeData::ROLE_BUTTON;
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index 7def574..10c8b54 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -338,11 +338,13 @@ bool BrowserAccessibilityManager::UpdateNode(const AccessibilityNodeData& src) {
instance = CreateNode(NULL, src.id, 0);
}
- if (src.bool_attributes.find(
- AccessibilityNodeData::ATTR_UPDATE_LOCATION_ONLY) !=
- src.bool_attributes.end()) {
- instance->SetLocation(src.location);
- return true;
+ // TODO(dmazzoni): avoid a linear scan here.
+ for (size_t i = 0; i < src.bool_attributes.size(); i++) {
+ if (src.bool_attributes[i].first ==
+ AccessibilityNodeData::ATTR_UPDATE_LOCATION_ONLY) {
+ instance->SetLocation(src.location);
+ return true;
+ }
}
// Update all of the node-specific data, like its role, state, name, etc.
diff --git a/content/browser/accessibility/browser_accessibility_manager_unittest.cc b/content/browser/accessibility/browser_accessibility_manager_unittest.cc
index 5cb03cd..5ba5a2e 100644
--- a/content/browser/accessibility/browser_accessibility_manager_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_unittest.cc
@@ -92,19 +92,19 @@ TEST(BrowserAccessibilityManagerTest, TestNoLeaks) {
// BrowserAccessibilityManager.
AccessibilityNodeData button;
button.id = 2;
- button.name = UTF8ToUTF16("Button");
+ button.SetName("Button");
button.role = AccessibilityNodeData::ROLE_BUTTON;
button.state = 0;
AccessibilityNodeData checkbox;
checkbox.id = 3;
- checkbox.name = UTF8ToUTF16("Checkbox");
+ checkbox.SetName("Checkbox");
checkbox.role = AccessibilityNodeData::ROLE_CHECKBOX;
checkbox.state = 0;
AccessibilityNodeData root;
root.id = 1;
- root.name = UTF8ToUTF16("Document");
+ root.SetName("Document");
root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA;
root.state = 0;
root.child_ids.push_back(2);
@@ -170,25 +170,25 @@ TEST(BrowserAccessibilityManagerTest, TestReuseBrowserAccessibilityObjects) {
AccessibilityNodeData tree1_child1;
tree1_child1.id = 2;
- tree1_child1.name = UTF8ToUTF16("Child1");
+ tree1_child1.SetName("Child1");
tree1_child1.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_child1.state = 0;
AccessibilityNodeData tree1_child2;
tree1_child2.id = 3;
- tree1_child2.name = UTF8ToUTF16("Child2");
+ tree1_child2.SetName("Child2");
tree1_child2.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_child2.state = 0;
AccessibilityNodeData tree1_child3;
tree1_child3.id = 4;
- tree1_child3.name = UTF8ToUTF16("Child3");
+ tree1_child3.SetName("Child3");
tree1_child3.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_child3.state = 0;
AccessibilityNodeData tree1_root;
tree1_root.id = 1;
- tree1_root.name = UTF8ToUTF16("Document");
+ tree1_root.SetName("Document");
tree1_root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA;
tree1_root.state = 0;
tree1_root.child_ids.push_back(2);
@@ -205,13 +205,13 @@ TEST(BrowserAccessibilityManagerTest, TestReuseBrowserAccessibilityObjects) {
AccessibilityNodeData tree2_child0;
tree2_child0.id = 5;
- tree2_child0.name = UTF8ToUTF16("Child0");
+ tree2_child0.SetName("Child0");
tree2_child0.role = AccessibilityNodeData::ROLE_BUTTON;
tree2_child0.state = 0;
AccessibilityNodeData tree2_root;
tree2_root.id = 1;
- tree2_root.name = UTF8ToUTF16("DocumentChanged");
+ tree2_root.SetName("DocumentChanged");
tree2_root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA;
tree2_root.state = 0;
tree2_root.child_ids.push_back(5);
@@ -302,46 +302,46 @@ TEST(BrowserAccessibilityManagerTest, TestReuseBrowserAccessibilityObjects2) {
AccessibilityNodeData tree1_grandchild1;
tree1_grandchild1.id = 4;
- tree1_grandchild1.name = UTF8ToUTF16("GrandChild1");
+ tree1_grandchild1.SetName("GrandChild1");
tree1_grandchild1.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_grandchild1.state = 0;
AccessibilityNodeData tree1_child1;
tree1_child1.id = 3;
- tree1_child1.name = UTF8ToUTF16("Child1");
+ tree1_child1.SetName("Child1");
tree1_child1.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_child1.state = 0;
tree1_child1.child_ids.push_back(4);
AccessibilityNodeData tree1_grandchild2;
tree1_grandchild2.id = 6;
- tree1_grandchild2.name = UTF8ToUTF16("GrandChild1");
+ tree1_grandchild2.SetName("GrandChild1");
tree1_grandchild2.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_grandchild2.state = 0;
AccessibilityNodeData tree1_child2;
tree1_child2.id = 5;
- tree1_child2.name = UTF8ToUTF16("Child2");
+ tree1_child2.SetName("Child2");
tree1_child2.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_child2.state = 0;
tree1_child2.child_ids.push_back(6);
AccessibilityNodeData tree1_grandchild3;
tree1_grandchild3.id = 8;
- tree1_grandchild3.name = UTF8ToUTF16("GrandChild3");
+ tree1_grandchild3.SetName("GrandChild3");
tree1_grandchild3.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_grandchild3.state = 0;
AccessibilityNodeData tree1_child3;
tree1_child3.id = 7;
- tree1_child3.name = UTF8ToUTF16("Child3");
+ tree1_child3.SetName("Child3");
tree1_child3.role = AccessibilityNodeData::ROLE_BUTTON;
tree1_child3.state = 0;
tree1_child3.child_ids.push_back(8);
AccessibilityNodeData tree1_container;
tree1_container.id = 2;
- tree1_container.name = UTF8ToUTF16("Container");
+ tree1_container.SetName("Container");
tree1_container.role = AccessibilityNodeData::ROLE_GROUP;
tree1_container.state = 0;
tree1_container.child_ids.push_back(3);
@@ -350,7 +350,7 @@ TEST(BrowserAccessibilityManagerTest, TestReuseBrowserAccessibilityObjects2) {
AccessibilityNodeData tree1_root;
tree1_root.id = 1;
- tree1_root.name = UTF8ToUTF16("Document");
+ tree1_root.SetName("Document");
tree1_root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA;
tree1_root.state = 0;
tree1_root.child_ids.push_back(2);
@@ -369,20 +369,20 @@ TEST(BrowserAccessibilityManagerTest, TestReuseBrowserAccessibilityObjects2) {
AccessibilityNodeData tree2_grandchild0;
tree2_grandchild0.id = 9;
- tree2_grandchild0.name = UTF8ToUTF16("GrandChild0");
+ tree2_grandchild0.SetName("GrandChild0");
tree2_grandchild0.role = AccessibilityNodeData::ROLE_BUTTON;
tree2_grandchild0.state = 0;
AccessibilityNodeData tree2_child0;
tree2_child0.id = 10;
- tree2_child0.name = UTF8ToUTF16("Child0");
+ tree2_child0.SetName("Child0");
tree2_child0.role = AccessibilityNodeData::ROLE_BUTTON;
tree2_child0.state = 0;
tree2_child0.child_ids.push_back(9);
AccessibilityNodeData tree2_container;
tree2_container.id = 2;
- tree2_container.name = UTF8ToUTF16("Container");
+ tree2_container.SetName("Container");
tree2_container.role = AccessibilityNodeData::ROLE_GROUP;
tree2_container.state = 0;
tree2_container.child_ids.push_back(10);
diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc
index 792adc4..614dd8f 100644
--- a/content/browser/accessibility/browser_accessibility_win.cc
+++ b/content/browser/accessibility/browser_accessibility_win.cc
@@ -457,7 +457,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) {
if (!target)
return E_INVALIDARG;
- string16 name_str = target->name_;
+ std::string name_str = target->name();
// If the name is empty, see if it's labeled by another element.
if (name_str.empty()) {
@@ -474,7 +474,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) {
if (name_str.empty())
return S_FALSE;
- *name = SysAllocString(name_str.c_str());
+ *name = SysAllocString(UTF8ToUTF16(name_str).c_str());
DCHECK(*name);
return S_OK;
@@ -557,8 +557,33 @@ STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id,
if (!target)
return E_INVALIDARG;
- *value = SysAllocString(target->value_.c_str());
+ if (target->ia_role() == ROLE_SYSTEM_PROGRESSBAR ||
+ target->ia_role() == ROLE_SYSTEM_SCROLLBAR ||
+ target->ia_role() == ROLE_SYSTEM_SLIDER) {
+ string16 value_text = target->GetValueText();
+ *value = SysAllocString(value_text.c_str());
+ DCHECK(*value);
+ return S_OK;
+ }
+
+ // Expose color well value.
+ if (target->ia2_role() == IA2_ROLE_COLOR_CHOOSER) {
+ int r = target->GetIntAttribute(
+ AccessibilityNodeData::ATTR_COLOR_VALUE_RED);
+ int g = target->GetIntAttribute(
+ AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN);
+ int b = target->GetIntAttribute(
+ AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE);
+ string16 value_text;
+ value_text = base::IntToString16((r * 100) / 255) + L"% red " +
+ base::IntToString16((g * 100) / 255) + L"% green " +
+ base::IntToString16((b * 100) / 255) + L"% blue";
+ *value = SysAllocString(value_text.c_str());
+ DCHECK(*value);
+ return S_OK;
+ }
+ *value = SysAllocString(UTF8ToUTF16(target->value()).c_str());
DCHECK(*value);
return S_OK;
}
@@ -1014,9 +1039,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_accessibleAt(
if (row < 0 || row >= rows || column < 0 || column >= columns)
return E_INVALIDARG;
- DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size()));
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+ DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size()));
- int cell_id = cell_ids_[row * columns + column];
+ int cell_id = cell_ids[row * columns + column];
BrowserAccessibilityWin* cell = GetFromRendererID(cell_id);
if (cell) {
*accessible = static_cast<IAccessible*>(cell->NewReference());
@@ -1061,10 +1088,14 @@ STDMETHODIMP BrowserAccessibilityWin::get_childIndex(long row,
if (row < 0 || row >= rows || column < 0 || column >= columns)
return E_INVALIDARG;
- DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size()));
- int cell_id = cell_ids_[row * columns + column];
- for (size_t i = 0; i < unique_cell_ids_.size(); ++i) {
- if (unique_cell_ids_[i] == cell_id) {
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+ const std::vector<int32>& unique_cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
+ DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size()));
+ int cell_id = cell_ids[row * columns + column];
+ for (size_t i = 0; i < unique_cell_ids.size(); ++i) {
+ if (unique_cell_ids[i] == cell_id) {
*cell_index = (long)i;
return S_OK;
}
@@ -1094,13 +1125,17 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(long column,
if (column < 0 || column >= columns)
return E_INVALIDARG;
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
for (int i = 0; i < rows; ++i) {
- int cell_id = cell_ids_[i * columns + column];
+ int cell_id = cell_ids[i * columns + column];
BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
manager_->GetFromRendererID(cell_id));
if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) {
- if (cell->name_.size() > 0) {
- *description = SysAllocString(cell->name_.c_str());
+ string16 cell_name = cell->GetString16Attribute(
+ AccessibilityNodeData::ATTR_NAME);
+ if (cell_name.size() > 0) {
+ *description = SysAllocString(cell_name.c_str());
return S_OK;
}
@@ -1135,7 +1170,9 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnExtentAt(
if (row < 0 || row >= rows || column < 0 || column >= columns)
return E_INVALIDARG;
- int cell_id = cell_ids_[row * columns + column];
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+ int cell_id = cell_ids[row * columns + column];
BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
manager_->GetFromRendererID(cell_id));
int colspan;
@@ -1165,13 +1202,15 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index,
if (!column_index)
return E_INVALIDARG;
- int cell_id_count = static_cast<int>(unique_cell_ids_.size());
+ const std::vector<int32>& unique_cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
+ int cell_id_count = static_cast<int>(unique_cell_ids.size());
if (cell_index < 0)
return E_INVALIDARG;
if (cell_index >= cell_id_count)
return S_FALSE;
- int cell_id = unique_cell_ids_[cell_index];
+ int cell_id = unique_cell_ids[cell_index];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
int col_index;
@@ -1273,13 +1312,17 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row,
if (row < 0 || row >= rows)
return E_INVALIDARG;
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
for (int i = 0; i < columns; ++i) {
- int cell_id = cell_ids_[row * columns + i];
+ int cell_id = cell_ids[row * columns + i];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) {
- if (cell->name_.size() > 0) {
- *description = SysAllocString(cell->name_.c_str());
+ string16 cell_name = cell->GetString16Attribute(
+ AccessibilityNodeData::ATTR_NAME);
+ if (cell_name.size() > 0) {
+ *description = SysAllocString(cell_name.c_str());
return S_OK;
}
@@ -1313,7 +1356,9 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row,
if (row < 0 || row >= rows || column < 0 || column >= columns)
return E_INVALIDARG;
- int cell_id = cell_ids_[row * columns + column];
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+ int cell_id = cell_ids[row * columns + column];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
int rowspan;
@@ -1343,13 +1388,15 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index,
if (!row_index)
return E_INVALIDARG;
- int cell_id_count = static_cast<int>(unique_cell_ids_.size());
+ const std::vector<int32>& unique_cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
+ int cell_id_count = static_cast<int>(unique_cell_ids.size());
if (cell_index < 0)
return E_INVALIDARG;
if (cell_index >= cell_id_count)
return S_FALSE;
- int cell_id = unique_cell_ids_[cell_index];
+ int cell_id = unique_cell_ids[cell_index];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
int cell_row_index;
@@ -1470,13 +1517,15 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtentsAtIndex(
if (!row || !column || !row_extents || !column_extents || !is_selected)
return E_INVALIDARG;
- int cell_id_count = static_cast<int>(unique_cell_ids_.size());
+ const std::vector<int32>& unique_cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
+ int cell_id_count = static_cast<int>(unique_cell_ids.size());
if (index < 0)
return E_INVALIDARG;
if (index >= cell_id_count)
return S_FALSE;
- int cell_id = unique_cell_ids_[index];
+ int cell_id = unique_cell_ids[index];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
int rowspan;
@@ -1610,8 +1659,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
if (columns <= 0 || rows <= 0 || column < 0 || column >= columns)
return S_FALSE;
+ const std::vector<int32>& cell_ids = table->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+
for (int i = 0; i < rows; ++i) {
- int cell_id = table->cell_ids()[i * columns + column];
+ int cell_id = cell_ids[i * columns + column];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER)
@@ -1622,7 +1674,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
(*n_column_header_cells) * sizeof(cell_accessibles[0])));
int index = 0;
for (int i = 0; i < rows; ++i) {
- int cell_id = table->cell_ids()[i * columns + column];
+ int cell_id = cell_ids[i * columns + column];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) {
@@ -1706,8 +1758,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells(
if (columns <= 0 || rows <= 0 || row < 0 || row >= rows)
return S_FALSE;
+ const std::vector<int32>& cell_ids = table->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+
for (int i = 0; i < columns; ++i) {
- int cell_id = table->cell_ids()[row * columns + i];
+ int cell_id = cell_ids[row * columns + i];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER)
@@ -1718,7 +1773,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells(
(*n_row_header_cells) * sizeof(cell_accessibles[0])));
int index = 0;
for (int i = 0; i < columns; ++i) {
- int cell_id = table->cell_ids()[row * columns + i];
+ int cell_id = cell_ids[row * columns + i];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) {
@@ -2334,13 +2389,13 @@ STDMETHODIMP BrowserAccessibilityWin::get_nodeInfo(
}
string16 tag;
- if (GetStringAttribute(AccessibilityNodeData::ATTR_HTML_TAG, &tag))
+ if (GetString16Attribute(AccessibilityNodeData::ATTR_HTML_TAG, &tag))
*node_name = SysAllocString(tag.c_str());
else
*node_name = NULL;
*name_space_id = 0;
- *node_value = SysAllocString(value_.c_str());
+ *node_value = SysAllocString(UTF8ToUTF16(value_).c_str());
*num_children = children_.size();
*unique_id = unique_id_win_;
@@ -2373,9 +2428,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_attributes(
*num_attribs = html_attributes_.size();
for (unsigned short i = 0; i < *num_attribs; ++i) {
- attrib_names[i] = SysAllocString(html_attributes_[i].first.c_str());
+ attrib_names[i] = SysAllocString(
+ UTF8ToUTF16(html_attributes_[i].first).c_str());
name_space_id[i] = 0;
- attrib_values[i] = SysAllocString(html_attributes_[i].second.c_str());
+ attrib_values[i] = SysAllocString(
+ UTF8ToUTF16(html_attributes_[i].second).c_str());
}
return S_OK;
}
@@ -2394,10 +2451,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_attributesForNames(
for (unsigned short i = 0; i < num_attribs; ++i) {
name_space_id[i] = 0;
bool found = false;
- string16 name = (LPCWSTR)attrib_names[i];
+ std::string name = UTF16ToUTF8((LPCWSTR)attrib_names[i]);
for (unsigned int j = 0; j < html_attributes_.size(); ++j) {
if (html_attributes_[j].first == name) {
- attrib_values[i] = SysAllocString(html_attributes_[j].second.c_str());
+ attrib_values[i] = SysAllocString(
+ UTF8ToUTF16(html_attributes_[j].second).c_str());
found = true;
break;
}
@@ -2425,7 +2483,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_computedStyle(
string16 display;
if (max_style_properties == 0 ||
- !GetStringAttribute(AccessibilityNodeData::ATTR_DISPLAY, &display)) {
+ !GetString16Attribute(AccessibilityNodeData::ATTR_DISPLAY, &display)) {
*num_style_properties = 0;
return S_OK;
}
@@ -2454,8 +2512,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_computedStyleForProperties(
string16 name = (LPCWSTR)style_properties[i];
StringToLowerASCII(&name);
if (name == L"display") {
- string16 display;
- GetStringAttribute(AccessibilityNodeData::ATTR_DISPLAY, &display);
+ string16 display = GetString16Attribute(
+ AccessibilityNodeData::ATTR_DISPLAY);
style_values[i] = SysAllocString(display.c_str());
} else {
style_values[i] = NULL;
@@ -2579,12 +2637,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) {
if (!dom_text)
return E_INVALIDARG;
- if (name_.empty())
- return S_FALSE;
-
- *dom_text = SysAllocString(name_.c_str());
- DCHECK(*dom_text);
- return S_OK;
+ return GetStringAttributeAsBstr(
+ AccessibilityNodeData::ATTR_NAME, dom_text);
}
//
@@ -2773,24 +2827,7 @@ void BrowserAccessibilityWin::PreInitialize() {
if (ia_role_ == ROLE_SYSTEM_PROGRESSBAR ||
ia_role_ == ROLE_SYSTEM_SCROLLBAR ||
ia_role_ == ROLE_SYSTEM_SLIDER) {
- float fval;
- if (value_.empty() &&
- GetFloatAttribute(AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &fval)) {
- // TODO(dmazzoni): Use ICU to localize this?
- value_ = UTF8ToUTF16(base::DoubleToString(fval));
- }
- ia2_attributes_.push_back(L"valuetext:" + value_);
- }
-
- // Expose color well value.
- if (ia2_role_ == IA2_ROLE_COLOR_CHOOSER) {
- int r, g, b;
- GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r);
- GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g);
- GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE, &b);
- value_ = base::IntToString16((r * 100) / 255) + L"% red " +
- base::IntToString16((g * 100) / 255) + L"% green " +
- base::IntToString16((b * 100) / 255) + L"% blue";
+ ia2_attributes_.push_back(L"valuetext:" + GetValueText());
}
// Expose table cell index.
@@ -2799,7 +2836,8 @@ void BrowserAccessibilityWin::PreInitialize() {
while (table && table->role() != AccessibilityNodeData::ROLE_TABLE)
table = table->parent();
if (table) {
- const std::vector<int32>& unique_cell_ids = table->unique_cell_ids();
+ const std::vector<int32>& unique_cell_ids = table->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
for (size_t i = 0; i < unique_cell_ids.size(); ++i) {
if (unique_cell_ids[i] == renderer_id_) {
ia2_attributes_.push_back(
@@ -2830,22 +2868,21 @@ void BrowserAccessibilityWin::PreInitialize() {
// always returns the primary name in "name" and the secondary name,
// if any, in "description".
- string16 description, help, title_attr;
- int title_elem_id = 0;
- GetIntAttribute(AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &title_elem_id);
- GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, &description);
- GetStringAttribute(AccessibilityNodeData::ATTR_HELP, &help);
+ int title_elem_id = GetIntAttribute(
+ AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT);
+ std::string help = GetStringAttribute(AccessibilityNodeData::ATTR_HELP);
+ std::string description = GetStringAttribute(
+ AccessibilityNodeData::ATTR_DESCRIPTION);
// WebKit annoyingly puts the title in the description if there's no other
// description, which just confuses the rest of the logic. Put it back.
// Now "help" is always the value of the "title" attribute, if present.
+ std::string title_attr;
if (GetHtmlAttribute("title", &title_attr) &&
description == title_attr &&
help.empty()) {
help = description;
description.clear();
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION].clear();
- string_attributes_[AccessibilityNodeData::ATTR_HELP] = help;
}
// Now implement the main logic: the descripion should become the name if
@@ -2854,21 +2891,18 @@ void BrowserAccessibilityWin::PreInitialize() {
if (!description.empty()) {
name_ = description;
description.clear();
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = description;
}
if (!help.empty() && description.empty()) {
description = help;
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = help;
- string_attributes_[AccessibilityNodeData::ATTR_HELP].clear();
+ help.clear();
}
if (!description.empty() && name_.empty() && !title_elem_id) {
name_ = description;
description.clear();
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION].clear();
}
// If it's a text field, also consider the placeholder.
- string16 placeholder;
+ std::string placeholder;
if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD &&
HasState(AccessibilityNodeData::STATE_FOCUSABLE) &&
GetHtmlAttribute("placeholder", &placeholder)) {
@@ -2876,10 +2910,12 @@ void BrowserAccessibilityWin::PreInitialize() {
name_ = placeholder;
} else if (description.empty()) {
description = placeholder;
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = description;
}
}
+ SetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, description);
+ SetStringAttribute(AccessibilityNodeData::ATTR_HELP, help);
+
// On Windows, the value of a document should be its url.
if (role_ == AccessibilityNodeData::ROLE_ROOT_WEB_AREA ||
role_ == AccessibilityNodeData::ROLE_WEB_AREA) {
@@ -2898,7 +2934,6 @@ void BrowserAccessibilityWin::PreInitialize() {
// If this doesn't have a value and is linked then set its value to the url
// attribute. This allows screen readers to read an empty link's destination.
- string16 url;
if (value_.empty() && (ia_state_ & STATE_SYSTEM_LINKED))
GetStringAttribute(AccessibilityNodeData::ATTR_URL, &value_);
@@ -2931,7 +2966,7 @@ void BrowserAccessibilityWin::PostInitialize() {
for (unsigned int i = 0; i < children().size(); ++i) {
BrowserAccessibility* child = children()[i];
if (child->role() == AccessibilityNodeData::ROLE_STATIC_TEXT) {
- hypertext_ += child->name();
+ hypertext_ += UTF8ToUTF16(child->name());
} else {
hyperlink_offset_to_index_[hypertext_.size()] = hyperlinks_.size();
hypertext_ += kEmbeddedCharacter;
@@ -3035,7 +3070,7 @@ HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr(
BSTR* value_bstr) {
string16 str;
- if (!GetStringAttribute(attribute, &str))
+ if (!GetString16Attribute(attribute, &str))
return S_FALSE;
if (str.empty())
@@ -3051,7 +3086,7 @@ void BrowserAccessibilityWin::StringAttributeToIA2(
AccessibilityNodeData::StringAttribute attribute,
const char* ia2_attr) {
string16 value;
- if (GetStringAttribute(attribute, &value))
+ if (GetString16Attribute(attribute, &value))
ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + value);
}
@@ -3069,16 +3104,27 @@ void BrowserAccessibilityWin::IntAttributeToIA2(
AccessibilityNodeData::IntAttribute attribute,
const char* ia2_attr) {
int value;
- if (GetIntAttribute(attribute, &value))
+ if (GetIntAttribute(attribute, &value)) {
ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" +
base::IntToString16(value));
+ }
+}
+
+string16 BrowserAccessibilityWin::GetValueText() {
+ float fval;
+ string16 value = UTF8ToUTF16(value_);
+ if (value.empty() &&
+ GetFloatAttribute(AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &fval)) {
+ value = UTF8ToUTF16(base::DoubleToString(fval));
+ }
+ return value;
}
-const string16& BrowserAccessibilityWin::TextForIAccessibleText() {
+string16 BrowserAccessibilityWin::TextForIAccessibleText() {
if (IsEditableText())
- return value_;
+ return UTF8ToUTF16(value_);
return (role_ == AccessibilityNodeData::ROLE_STATIC_TEXT) ?
- name_ : hypertext_;
+ UTF8ToUTF16(name_) : hypertext_;
}
void BrowserAccessibilityWin::HandleSpecialTextOffset(const string16& text,
@@ -3111,8 +3157,10 @@ LONG BrowserAccessibilityWin::FindBoundary(
ui::TextBoundaryDirection direction) {
HandleSpecialTextOffset(text, &start_offset);
ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary);
+ const std::vector<int32>& line_breaks = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_LINE_BREAKS);
return ui::FindAccessibleTextBoundary(
- text, line_breaks_, boundary, start_offset, direction);
+ text, line_breaks, boundary, start_offset, direction);
}
BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromRendererID(
@@ -3184,18 +3232,14 @@ void BrowserAccessibilityWin::InitRoleAndState() {
if (GetHtmlAttribute("aria-invalid", &invalid))
ia2_state_ |= IA2_STATE_INVALID_ENTRY;
- bool mixed = false;
- GetBoolAttribute(AccessibilityNodeData::ATTR_BUTTON_MIXED, &mixed);
- if (mixed)
+ if (GetBoolAttribute(AccessibilityNodeData::ATTR_BUTTON_MIXED))
ia_state_ |= STATE_SYSTEM_MIXED;
- bool editable = false;
- GetBoolAttribute(AccessibilityNodeData::ATTR_CAN_SET_VALUE, &editable);
- if (editable)
+ if (GetBoolAttribute(AccessibilityNodeData::ATTR_CAN_SET_VALUE))
ia2_state_ |= IA2_STATE_EDITABLE;
- string16 html_tag;
- GetStringAttribute(AccessibilityNodeData::ATTR_HTML_TAG, &html_tag);
+ string16 html_tag = GetString16Attribute(
+ AccessibilityNodeData::ATTR_HTML_TAG);
ia_role_ = 0;
ia2_role_ = 0;
switch (role_) {
@@ -3307,8 +3351,8 @@ void BrowserAccessibilityWin::InitRoleAndState() {
ia_state_ |= STATE_SYSTEM_READONLY;
break;
case AccessibilityNodeData::ROLE_GROUP: {
- string16 aria_role;
- GetStringAttribute(AccessibilityNodeData::ATTR_ROLE, &aria_role);
+ string16 aria_role = GetString16Attribute(
+ AccessibilityNodeData::ATTR_ROLE);
if (aria_role == L"group" || html_tag == L"fieldset") {
ia_role_ = ROLE_SYSTEM_GROUPING;
} else if (html_tag == L"li") {
@@ -3507,8 +3551,8 @@ void BrowserAccessibilityWin::InitRoleAndState() {
ia_role_ = ROLE_SYSTEM_PAGETAB;
break;
case AccessibilityNodeData::ROLE_TABLE: {
- string16 aria_role;
- GetStringAttribute(AccessibilityNodeData::ATTR_ROLE, &aria_role);
+ string16 aria_role = GetString16Attribute(
+ AccessibilityNodeData::ATTR_ROLE);
if (aria_role == L"treegrid") {
ia_role_ = ROLE_SYSTEM_OUTLINE;
} else {
@@ -3609,9 +3653,7 @@ void BrowserAccessibilityWin::InitRoleAndState() {
}
if (!HasState(AccessibilityNodeData::STATE_READONLY))
ia_state_ &= ~(STATE_SYSTEM_READONLY);
- bool aria_readonly = false;
- GetBoolAttribute(AccessibilityNodeData::ATTR_ARIA_READONLY, &aria_readonly);
- if (aria_readonly)
+ if (GetBoolAttribute(AccessibilityNodeData::ATTR_ARIA_READONLY))
ia_state_ |= STATE_SYSTEM_READONLY;
// The role should always be set.
diff --git a/content/browser/accessibility/browser_accessibility_win.h b/content/browser/accessibility/browser_accessibility_win.h
index b659932..db8040e 100644
--- a/content/browser/accessibility/browser_accessibility_win.h
+++ b/content/browser/accessibility/browser_accessibility_win.h
@@ -771,6 +771,7 @@ BrowserAccessibilityWin
// Accessors.
int32 ia_role() const { return ia_role_; }
int32 ia_state() const { return ia_state_; }
+ const string16& role_name() const { return role_name_; }
int32 ia2_role() const { return ia2_role_; }
int32 ia2_state() const { return ia2_state_; }
const std::vector<string16>& ia2_attributes() const {
@@ -816,9 +817,13 @@ BrowserAccessibilityWin
void IntAttributeToIA2(AccessibilityNodeData::IntAttribute attribute,
const char* ia2_attr);
+ // Get the value text, which might come from the floating-point
+ // value for some roles.
+ string16 GetValueText();
+
// Get the text of this node for the purposes of IAccessibleText - it may
// be the name, it may be the value, etc. depending on the role.
- const string16& TextForIAccessibleText();
+ string16 TextForIAccessibleText();
// If offset is a member of IA2TextSpecialOffsets this function updates the
// value of offset and returns, otherwise offset remains unchanged.
@@ -847,6 +852,7 @@ BrowserAccessibilityWin
// IAccessible role and state.
int32 ia_role_;
int32 ia_state_;
+ string16 role_name_;
// IAccessible2 role and state.
int32 ia2_role_;
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc
index 98a5d40..c65c1f3 100644
--- a/content/browser/accessibility/browser_accessibility_win_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/memory/scoped_ptr.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/win/scoped_bstr.h"
#include "base/win/scoped_comptr.h"
#include "base/win/scoped_variant.h"
@@ -113,19 +114,19 @@ TEST_F(BrowserAccessibilityTest, TestNoLeaks) {
// BrowserAccessibilityManager.
AccessibilityNodeData button;
button.id = 2;
- button.name = L"Button";
+ button.SetName("Button");
button.role = AccessibilityNodeData::ROLE_BUTTON;
button.state = 0;
AccessibilityNodeData checkbox;
checkbox.id = 3;
- checkbox.name = L"Checkbox";
+ checkbox.SetName("Checkbox");
checkbox.role = AccessibilityNodeData::ROLE_CHECKBOX;
checkbox.state = 0;
AccessibilityNodeData root;
root.id = 1;
- root.name = L"Document";
+ root.SetName("Document");
root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA;
root.state = 0;
root.child_ids.push_back(2);
@@ -183,12 +184,12 @@ TEST_F(BrowserAccessibilityTest, TestChildrenChange) {
AccessibilityNodeData text;
text.id = 2;
text.role = AccessibilityNodeData::ROLE_STATIC_TEXT;
- text.name = L"old text";
+ text.SetName("old text");
text.state = 0;
AccessibilityNodeData root;
root.id = 1;
- root.name = L"Document";
+ root.SetName("Document");
root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA;
root.state = 0;
root.child_ids.push_back(2);
@@ -225,11 +226,15 @@ TEST_F(BrowserAccessibilityTest, TestChildrenChange) {
text_accessible.Release();
// Notify the BrowserAccessibilityManager that the text child has changed.
- text.name = L"new text";
+ AccessibilityNodeData text2;
+ text2.id = 2;
+ text2.role = AccessibilityNodeData::ROLE_STATIC_TEXT;
+ text2.SetName("new text");
+ text2.SetName("old text");
AccessibilityHostMsg_NotificationParams param;
param.notification_type = AccessibilityNotificationChildrenChanged;
- param.nodes.push_back(text);
- param.id = text.id;
+ param.nodes.push_back(text2);
+ param.id = text2.id;
std::vector<AccessibilityHostMsg_NotificationParams> notifications;
notifications.push_back(param);
manager->OnAccessibilityNotifications(notifications);
@@ -314,12 +319,17 @@ TEST_F(BrowserAccessibilityTest, TestChildrenChangeNoLeaks) {
}
TEST_F(BrowserAccessibilityTest, TestTextBoundaries) {
+ std::string text1_value = "One two three.\nFour five six.";
+
AccessibilityNodeData text1;
text1.id = 11;
text1.role = AccessibilityNodeData::ROLE_TEXT_FIELD;
text1.state = 0;
- text1.value = L"One two three.\nFour five six.";
- text1.line_breaks.push_back(15);
+ text1.AddStringAttribute(AccessibilityNodeData::ATTR_VALUE, text1_value);
+ std::vector<int32> line_breaks;
+ line_breaks.push_back(15);
+ text1.AddIntListAttribute(
+ AccessibilityNodeData::ATTR_LINE_BREAKS, line_breaks);
AccessibilityNodeData root;
root.id = 1;
@@ -344,7 +354,7 @@ TEST_F(BrowserAccessibilityTest, TestTextBoundaries) {
base::win::ScopedBstr text;
ASSERT_EQ(S_OK, text1_obj->get_text(0, text1_len, text.Receive()));
- ASSERT_EQ(text1.value, string16(text));
+ ASSERT_EQ(text1_value, base::UTF16ToUTF8(string16(text)));
text.Reset();
ASSERT_EQ(S_OK, text1_obj->get_text(0, 4, text.Receive()));
@@ -405,17 +415,20 @@ TEST_F(BrowserAccessibilityTest, TestTextBoundaries) {
}
TEST_F(BrowserAccessibilityTest, TestSimpleHypertext) {
+ const std::string text1_name = "One two three.";
+ const std::string text2_name = " Four five six.";
+
AccessibilityNodeData text1;
text1.id = 11;
text1.role = AccessibilityNodeData::ROLE_STATIC_TEXT;
text1.state = 1 << AccessibilityNodeData::STATE_READONLY;
- text1.name = L"One two three.";
+ text1.SetName(text1_name);
AccessibilityNodeData text2;
text2.id = 12;
text2.role = AccessibilityNodeData::ROLE_STATIC_TEXT;
text2.state = 1 << AccessibilityNodeData::STATE_READONLY;
- text2.name = L" Four five six.";
+ text2.SetName(text2_name);
AccessibilityNodeData root;
root.id = 1;
@@ -439,7 +452,7 @@ TEST_F(BrowserAccessibilityTest, TestSimpleHypertext) {
base::win::ScopedBstr text;
ASSERT_EQ(S_OK, root_obj->get_text(0, text_len, text.Receive()));
- EXPECT_EQ(text1.name + text2.name, string16(text));
+ EXPECT_EQ(text1_name + text2_name, base::UTF16ToUTF8(string16(text)));
long hyperlink_count;
ASSERT_EQ(S_OK, root_obj->get_nHyperlinks(&hyperlink_count));
@@ -468,22 +481,27 @@ TEST_F(BrowserAccessibilityTest, TestSimpleHypertext) {
}
TEST_F(BrowserAccessibilityTest, TestComplexHypertext) {
+ const std::string text1_name = "One two three.";
+ const std::string text2_name = " Four five six.";
+ const std::string button1_text_name = "red";
+ const std::string link1_text_name = "blue";
+
AccessibilityNodeData text1;
text1.id = 11;
text1.role = AccessibilityNodeData::ROLE_STATIC_TEXT;
text1.state = 1 << AccessibilityNodeData::STATE_READONLY;
- text1.name = L"One two three.";
+ text1.SetName(text1_name);
AccessibilityNodeData text2;
text2.id = 12;
text2.role = AccessibilityNodeData::ROLE_STATIC_TEXT;
text2.state = 1 << AccessibilityNodeData::STATE_READONLY;
- text2.name = L" Four five six.";
+ text2.SetName(text2_name);
AccessibilityNodeData button1, button1_text;
button1.id = 13;
button1_text.id = 15;
- button1_text.name = L"red";
+ button1_text.SetName(button1_text_name);
button1.role = AccessibilityNodeData::ROLE_BUTTON;
button1_text.role = AccessibilityNodeData::ROLE_STATIC_TEXT;
button1.state = 1 << AccessibilityNodeData::STATE_READONLY;
@@ -493,7 +511,7 @@ TEST_F(BrowserAccessibilityTest, TestComplexHypertext) {
AccessibilityNodeData link1, link1_text;
link1.id = 14;
link1_text.id = 16;
- link1_text.name = L"blue";
+ link1_text.SetName(link1_text_name);
link1.role = AccessibilityNodeData::ROLE_LINK;
link1_text.role = AccessibilityNodeData::ROLE_STATIC_TEXT;
link1.state = 1 << AccessibilityNodeData::STATE_READONLY;
@@ -527,8 +545,10 @@ TEST_F(BrowserAccessibilityTest, TestComplexHypertext) {
base::win::ScopedBstr text;
ASSERT_EQ(S_OK, root_obj->get_text(0, text_len, text.Receive()));
- const string16 embed = BrowserAccessibilityWin::kEmbeddedCharacter;
- EXPECT_EQ(text1.name + embed + text2.name + embed, string16(text));
+ const std::string embed = base::UTF16ToUTF8(
+ BrowserAccessibilityWin::kEmbeddedCharacter);
+ EXPECT_EQ(text1_name + embed + text2_name + embed,
+ UTF16ToUTF8(string16(text)));
text.Reset();
long hyperlink_count;
@@ -545,7 +565,8 @@ TEST_F(BrowserAccessibilityTest, TestComplexHypertext) {
EXPECT_EQ(S_OK,
hyperlink.QueryInterface<IAccessibleText>(hypertext.Receive()));
EXPECT_EQ(S_OK, hypertext->get_text(0, 3, text.Receive()));
- EXPECT_STREQ(L"red", text);
+ EXPECT_STREQ(button1_text_name.c_str(),
+ base::UTF16ToUTF8(string16(text)).c_str());
text.Reset();
hyperlink.Release();
hypertext.Release();
@@ -554,7 +575,8 @@ TEST_F(BrowserAccessibilityTest, TestComplexHypertext) {
EXPECT_EQ(S_OK,
hyperlink.QueryInterface<IAccessibleText>(hypertext.Receive()));
EXPECT_EQ(S_OK, hypertext->get_text(0, 4, text.Receive()));
- EXPECT_STREQ(L"blue", text);
+ EXPECT_STREQ(link1_text_name.c_str(),
+ base::UTF16ToUTF8(string16(text)).c_str());
text.Reset();
hyperlink.Release();
hypertext.Release();
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
index 4f4d93c..1acceab 100644
--- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
+++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -89,16 +89,15 @@ CrossPlatformAccessibilityBrowserTest::TearDownInProcessBrowserTestFixture() {
}
// Convenience method to get the value of a particular AccessibilityNodeData
-// node attribute as a UTF-8 const char*.
+// node attribute as a UTF-8 string.
std::string CrossPlatformAccessibilityBrowserTest::GetAttr(
const AccessibilityNodeData& node,
const AccessibilityNodeData::StringAttribute attr) {
- std::map<AccessibilityNodeData::StringAttribute, string16>::const_iterator
- iter = node.string_attributes.find(attr);
- if (iter != node.string_attributes.end())
- return UTF16ToUTF8(iter->second);
- else
- return std::string();
+ for (size_t i = 0; i < node.string_attributes.size(); ++i) {
+ if (node.string_attributes[i].first == attr)
+ return node.string_attributes[i].second;
+ }
+ return std::string();
}
// Convenience method to get the value of a particular AccessibilityNodeData
@@ -106,12 +105,11 @@ std::string CrossPlatformAccessibilityBrowserTest::GetAttr(
int CrossPlatformAccessibilityBrowserTest::GetIntAttr(
const AccessibilityNodeData& node,
const AccessibilityNodeData::IntAttribute attr) {
- std::map<AccessibilityNodeData::IntAttribute, int32>::const_iterator iter =
- node.int_attributes.find(attr);
- if (iter != node.int_attributes.end())
- return iter->second;
- else
- return -1;
+ for (size_t i = 0; i < node.int_attributes.size(); ++i) {
+ if (node.int_attributes[i].first == attr)
+ return node.int_attributes[i].second;
+ }
+ return -1;
}
// Convenience method to get the value of a particular AccessibilityNodeData
@@ -119,12 +117,11 @@ int CrossPlatformAccessibilityBrowserTest::GetIntAttr(
bool CrossPlatformAccessibilityBrowserTest::GetBoolAttr(
const AccessibilityNodeData& node,
const AccessibilityNodeData::BoolAttribute attr) {
- std::map<AccessibilityNodeData::BoolAttribute, bool>::const_iterator iter =
- node.bool_attributes.find(attr);
- if (iter != node.bool_attributes.end())
- return iter->second;
- else
- return false;
+ for (size_t i = 0; i < node.bool_attributes.size(); ++i) {
+ if (node.bool_attributes[i].first == attr)
+ return node.bool_attributes[i].second;
+ }
+ return false;
}
// Marked flaky per http://crbug.com/101984
@@ -152,7 +149,9 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
EXPECT_STREQ(
"text/html",
GetAttr(tree, AccessibilityNodeData::ATTR_DOC_MIMETYPE).c_str());
- EXPECT_STREQ("Accessibility Test", UTF16ToUTF8(tree.name).c_str());
+ EXPECT_STREQ(
+ "Accessibility Test",
+ GetAttr(tree, AccessibilityNodeData::ATTR_NAME).c_str());
EXPECT_EQ(AccessibilityNodeData::ROLE_ROOT_WEB_AREA, tree.role);
// Check properites of the BODY element.
@@ -171,15 +170,17 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
EXPECT_EQ(AccessibilityNodeData::ROLE_BUTTON, button.role);
EXPECT_STREQ(
"input", GetAttr(button, AccessibilityNodeData::ATTR_HTML_TAG).c_str());
- EXPECT_STREQ("push", UTF16ToUTF8(button.name).c_str());
+ EXPECT_STREQ(
+ "push",
+ GetAttr(button, AccessibilityNodeData::ATTR_NAME).c_str());
EXPECT_STREQ(
"inline-block",
GetAttr(button, AccessibilityNodeData::ATTR_DISPLAY).c_str());
ASSERT_EQ(2U, button.html_attributes.size());
- EXPECT_STREQ("type", UTF16ToUTF8(button.html_attributes[0].first).c_str());
- EXPECT_STREQ("button", UTF16ToUTF8(button.html_attributes[0].second).c_str());
- EXPECT_STREQ("value", UTF16ToUTF8(button.html_attributes[1].first).c_str());
- EXPECT_STREQ("push", UTF16ToUTF8(button.html_attributes[1].second).c_str());
+ EXPECT_STREQ("type", button.html_attributes[0].first.c_str());
+ EXPECT_STREQ("button", button.html_attributes[0].second.c_str());
+ EXPECT_STREQ("value", button.html_attributes[1].first.c_str());
+ EXPECT_STREQ("push", button.html_attributes[1].second.c_str());
const AccessibilityNodeDataTreeNode& checkbox = body.children[1];
EXPECT_EQ(AccessibilityNodeData::ROLE_CHECKBOX, checkbox.role);
@@ -189,10 +190,8 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
"inline-block",
GetAttr(checkbox, AccessibilityNodeData::ATTR_DISPLAY).c_str());
ASSERT_EQ(1U, checkbox.html_attributes.size());
- EXPECT_STREQ(
- "type", UTF16ToUTF8(checkbox.html_attributes[0].first).c_str());
- EXPECT_STREQ(
- "checkbox", UTF16ToUTF8(checkbox.html_attributes[0].second).c_str());
+ EXPECT_STREQ("type", checkbox.html_attributes[0].first.c_str());
+ EXPECT_STREQ("checkbox", checkbox.html_attributes[0].second.c_str());
}
IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
@@ -217,7 +216,9 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
"input", GetAttr(text, AccessibilityNodeData::ATTR_HTML_TAG).c_str());
EXPECT_EQ(0, GetIntAttr(text, AccessibilityNodeData::ATTR_TEXT_SEL_START));
EXPECT_EQ(0, GetIntAttr(text, AccessibilityNodeData::ATTR_TEXT_SEL_END));
- EXPECT_STREQ("Hello, world.", UTF16ToUTF8(text.value).c_str());
+ EXPECT_STREQ(
+ "Hello, world.",
+ GetAttr(text, AccessibilityNodeData::ATTR_VALUE).c_str());
// TODO(dmazzoni): as soon as more accessibility code is cross-platform,
// this code should test that the accessible info is dynamically updated
@@ -246,7 +247,9 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
"input", GetAttr(text, AccessibilityNodeData::ATTR_HTML_TAG).c_str());
EXPECT_EQ(0, GetIntAttr(text, AccessibilityNodeData::ATTR_TEXT_SEL_START));
EXPECT_EQ(13, GetIntAttr(text, AccessibilityNodeData::ATTR_TEXT_SEL_END));
- EXPECT_STREQ("Hello, world.", UTF16ToUTF8(text.value).c_str());
+ EXPECT_STREQ(
+ "Hello, world.",
+ GetAttr(text, AccessibilityNodeData::ATTR_VALUE).c_str());
}
IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
@@ -276,13 +279,22 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
const AccessibilityNodeDataTreeNode& column1 = table.children[1];
EXPECT_EQ(AccessibilityNodeData::ROLE_COLUMN, column1.role);
EXPECT_EQ(0U, column1.children.size());
- EXPECT_EQ(1U, column1.indirect_child_ids.size());
- EXPECT_EQ(cell1.id, column1.indirect_child_ids[0]);
+ EXPECT_EQ(1U, column1.intlist_attributes.size());
+ EXPECT_EQ(AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS,
+ column1.intlist_attributes[0].first);
+ const std::vector<int32> column1_indirect_child_ids =
+ column1.intlist_attributes[0].second;
+ EXPECT_EQ(1U, column1_indirect_child_ids.size());
+ EXPECT_EQ(cell1.id, column1_indirect_child_ids[0]);
const AccessibilityNodeDataTreeNode& column2 = table.children[2];
EXPECT_EQ(AccessibilityNodeData::ROLE_COLUMN, column2.role);
EXPECT_EQ(0U, column2.children.size());
- EXPECT_EQ(1U, column2.indirect_child_ids.size());
- EXPECT_EQ(cell2.id, column2.indirect_child_ids[0]);
+ EXPECT_EQ(AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS,
+ column2.intlist_attributes[0].first);
+ const std::vector<int32> column2_indirect_child_ids =
+ column2.intlist_attributes[0].second;
+ EXPECT_EQ(1U, column2_indirect_child_ids.size());
+ EXPECT_EQ(cell2.id, column2_indirect_child_ids[0]);
}
IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
@@ -329,7 +341,9 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
const AccessibilityNodeDataTreeNode& button1 = body.children[0];
EXPECT_EQ(AccessibilityNodeData::ROLE_BUTTON, button1.role);
- EXPECT_STREQ("Button 1", UTF16ToUTF8(button1.name).c_str());
+ EXPECT_STREQ(
+ "Button 1",
+ GetAttr(button1, AccessibilityNodeData::ATTR_NAME).c_str());
const AccessibilityNodeDataTreeNode& iframe = body.children[1];
EXPECT_STREQ("iframe",
@@ -349,11 +363,13 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
const AccessibilityNodeDataTreeNode& button2 = sub_body.children[0];
EXPECT_EQ(AccessibilityNodeData::ROLE_BUTTON, button2.role);
- EXPECT_STREQ("Button 2", UTF16ToUTF8(button2.name).c_str());
+ EXPECT_STREQ("Button 2",
+ GetAttr(button2, AccessibilityNodeData::ATTR_NAME).c_str());
const AccessibilityNodeDataTreeNode& button3 = body.children[2];
EXPECT_EQ(AccessibilityNodeData::ROLE_BUTTON, button3.role);
- EXPECT_STREQ("Button 3", UTF16ToUTF8(button3.name).c_str());
+ EXPECT_STREQ("Button 3",
+ GetAttr(button3, AccessibilityNodeData::ATTR_NAME).c_str());
}
IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
@@ -413,13 +429,17 @@ IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
const AccessibilityNodeDataTreeNode& cell3 = table.children[1].children[0];
const AccessibilityNodeDataTreeNode& cell4 = table.children[1].children[1];
- ASSERT_EQ(6U, table.cell_ids.size());
- EXPECT_EQ(cell1.id, table.cell_ids[0]);
- EXPECT_EQ(cell1.id, table.cell_ids[1]);
- EXPECT_EQ(cell2.id, table.cell_ids[2]);
- EXPECT_EQ(cell3.id, table.cell_ids[3]);
- EXPECT_EQ(cell4.id, table.cell_ids[4]);
- EXPECT_EQ(cell4.id, table.cell_ids[5]);
+ ASSERT_EQ(AccessibilityNodeData::ATTR_CELL_IDS,
+ table.intlist_attributes[0].first);
+ const std::vector<int32>& table_cell_ids =
+ table.intlist_attributes[0].second;
+ ASSERT_EQ(6U, table_cell_ids.size());
+ EXPECT_EQ(cell1.id, table_cell_ids[0]);
+ EXPECT_EQ(cell1.id, table_cell_ids[1]);
+ EXPECT_EQ(cell2.id, table_cell_ids[2]);
+ EXPECT_EQ(cell3.id, table_cell_ids[3]);
+ EXPECT_EQ(cell4.id, table_cell_ids[4]);
+ EXPECT_EQ(cell4.id, table_cell_ids[5]);
EXPECT_EQ(0, GetIntAttr(cell1,
AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX));