Skip to content

Commit

Permalink
Make BrowserAccessibilityManager use AXTree (re-land).
Browse files Browse the repository at this point in the history
This is the final step of migrating content/*/accessibility to make
full use of the new infrastructure in ui/accessibility.

Previously, BrowserAccessibilityManager owned the tree of
BrowserAccessibility objects and handled making changes to the
tree in response to messages from the renderer. Now, AXTree
handles the updates from the renderer and notifies
BrowserAccessibilityManager (via AXTreeDelegate) when it
should create or destroy BrowserAccessibility objects, and when
it should notify a BrowserAccessibility object that it's been
modified.

This makes the serialization/unserialization logic fully tested now,
and greatly clarifies the semantics of when in the update cycle
various notifications are called (e.g., PreInitialize and PostInitialize
are now OnDataChanged and OnUpdateFinished).

BUG=316726
NOTRY=true

Review URL: https://codereview.chromium.org/234723003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@265021 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
dmazzoni@chromium.org committed Apr 21, 2014
1 parent 3087b9e commit d96f384
Show file tree
Hide file tree
Showing 26 changed files with 598 additions and 656 deletions.
237 changes: 133 additions & 104 deletions content/browser/accessibility/browser_accessibility.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,23 @@ BrowserAccessibility* BrowserAccessibility::Create() {

BrowserAccessibility::BrowserAccessibility()
: manager_(NULL),
deprecated_parent_(NULL),
deprecated_index_in_parent_(0),
instance_active_(false) {
data_.id = 0;
data_.role = ui::AX_ROLE_UNKNOWN;
data_.state = 0;
node_(NULL) {
}

BrowserAccessibility::~BrowserAccessibility() {
}

void BrowserAccessibility::Init(BrowserAccessibilityManager* manager,
ui::AXNode* node) {
manager_ = manager;
node_ = node;
}

void BrowserAccessibility::OnDataChanged() {
GetStringAttribute(ui::AX_ATTR_NAME, &name_);
GetStringAttribute(ui::AX_ATTR_VALUE, &value_);
}

bool BrowserAccessibility::PlatformIsLeaf() const {
if (InternalChildCount() == 0)
return true;
Expand All @@ -60,56 +66,10 @@ uint32 BrowserAccessibility::PlatformChildCount() const {
return PlatformIsLeaf() ? 0 : InternalChildCount();
}

void BrowserAccessibility::DetachTree(
std::vector<BrowserAccessibility*>* nodes) {
nodes->push_back(this);
for (size_t i = 0; i < InternalChildCount(); ++i)
InternalGetChild(i)->DetachTree(nodes);
deprecated_children_.clear();
deprecated_parent_ = NULL;
}

void BrowserAccessibility::InitializeTreeStructure(
BrowserAccessibilityManager* manager,
BrowserAccessibility* parent,
int32 id,
int32 index_in_parent) {
manager_ = manager;
deprecated_parent_ = parent;
data_.id = id;
deprecated_index_in_parent_ = index_in_parent;
}

void BrowserAccessibility::InitializeData(const ui::AXNodeData& src) {
DCHECK_EQ(data_.id, src.id);
data_ = src;
instance_active_ = true;

GetStringAttribute(ui::AX_ATTR_NAME, &name_);
GetStringAttribute(ui::AX_ATTR_VALUE, &value_);

PreInitialize();
}

bool BrowserAccessibility::IsNative() const {
return false;
}

void BrowserAccessibility::SwapChildren(
std::vector<BrowserAccessibility*>& children) {
children.swap(deprecated_children_);
}

void BrowserAccessibility::UpdateParent(BrowserAccessibility* parent,
int index_in_parent) {
deprecated_parent_ = parent;
deprecated_index_in_parent_ = index_in_parent;
}

void BrowserAccessibility::SetLocation(const gfx::Rect& new_location) {
data_.location = new_location;
}

bool BrowserAccessibility::IsDescendantOf(
BrowserAccessibility* ancestor) {
if (this == ancestor) {
Expand Down Expand Up @@ -145,6 +105,59 @@ BrowserAccessibility* BrowserAccessibility::GetNextSibling() {
return NULL;
}

uint32 BrowserAccessibility::InternalChildCount() const {
if (!node_ || !manager_)
return 0;
return static_cast<uint32>(node_->child_count());
}

BrowserAccessibility* BrowserAccessibility::InternalGetChild(
uint32 child_index) const {
if (!node_ || !manager_)
return NULL;
return manager_->GetFromAXNode(node_->children()[child_index]);
}

BrowserAccessibility* BrowserAccessibility::GetParent() const {
if (!node_ || !manager_)
return NULL;
ui::AXNode* parent = node_->parent();
return parent ? manager_->GetFromAXNode(parent) : NULL;
}

int32 BrowserAccessibility::GetIndexInParent() const {
return node_ ? node_->index_in_parent() : -1;
}

int32 BrowserAccessibility::GetId() const {
return node_ ? node_->id() : -1;
}

const ui::AXNodeData& BrowserAccessibility::GetData() const {
CR_DEFINE_STATIC_LOCAL(ui::AXNodeData, empty_data, ());
if (node_)
return node_->data();
else
return empty_data;
}

gfx::Rect BrowserAccessibility::GetLocation() const {
return GetData().location;
}

int32 BrowserAccessibility::GetRole() const {
return GetData().role;
}

int32 BrowserAccessibility::GetState() const {
return GetData().state;
}

const std::vector<std::pair<std::string, std::string> >&
BrowserAccessibility::GetHtmlAttributes() const {
return GetData().html_attributes;
}

gfx::Rect BrowserAccessibility::GetLocalBoundsRect() const {
gfx::Rect bounds = GetLocation();

Expand Down Expand Up @@ -350,19 +363,14 @@ BrowserAccessibility* BrowserAccessibility::BrowserAccessibilityForPoint(
}

void BrowserAccessibility::Destroy() {
for (uint32 i = 0; i < InternalChildCount(); i++)
InternalGetChild(i)->Destroy();
deprecated_children_.clear();

// Allow the object to fire a TextRemoved notification.
name_.clear();
value_.clear();
PostInitialize();

manager_->NotifyAccessibilityEvent(ui::AX_EVENT_HIDE, this);
node_ = NULL;
manager_ = NULL;

instance_active_ = false;
manager_->RemoveNode(this);
NativeReleaseReference();
}

Expand All @@ -372,8 +380,9 @@ void BrowserAccessibility::NativeReleaseReference() {

bool BrowserAccessibility::HasBoolAttribute(
ui::AXBoolAttribute attribute) const {
for (size_t i = 0; i < data_.bool_attributes.size(); ++i) {
if (data_.bool_attributes[i].first == attribute)
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.bool_attributes.size(); ++i) {
if (data.bool_attributes[i].first == attribute)
return true;
}

Expand All @@ -383,19 +392,21 @@ bool BrowserAccessibility::HasBoolAttribute(

bool BrowserAccessibility::GetBoolAttribute(
ui::AXBoolAttribute attribute) const {
for (size_t i = 0; i < data_.bool_attributes.size(); ++i) {
if (data_.bool_attributes[i].first == attribute)
return data_.bool_attributes[i].second;
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.bool_attributes.size(); ++i) {
if (data.bool_attributes[i].first == attribute)
return data.bool_attributes[i].second;
}

return false;
}

bool BrowserAccessibility::GetBoolAttribute(
ui::AXBoolAttribute attribute, bool* value) const {
for (size_t i = 0; i < data_.bool_attributes.size(); ++i) {
if (data_.bool_attributes[i].first == attribute) {
*value = data_.bool_attributes[i].second;
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.bool_attributes.size(); ++i) {
if (data.bool_attributes[i].first == attribute) {
*value = data.bool_attributes[i].second;
return true;
}
}
Expand All @@ -405,8 +416,9 @@ bool BrowserAccessibility::GetBoolAttribute(

bool BrowserAccessibility::HasFloatAttribute(
ui::AXFloatAttribute attribute) const {
for (size_t i = 0; i < data_.float_attributes.size(); ++i) {
if (data_.float_attributes[i].first == attribute)
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.float_attributes.size(); ++i) {
if (data.float_attributes[i].first == attribute)
return true;
}

Expand All @@ -415,19 +427,21 @@ bool BrowserAccessibility::HasFloatAttribute(

float BrowserAccessibility::GetFloatAttribute(
ui::AXFloatAttribute attribute) const {
for (size_t i = 0; i < data_.float_attributes.size(); ++i) {
if (data_.float_attributes[i].first == attribute)
return data_.float_attributes[i].second;
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.float_attributes.size(); ++i) {
if (data.float_attributes[i].first == attribute)
return data.float_attributes[i].second;
}

return 0.0;
}

bool BrowserAccessibility::GetFloatAttribute(
ui::AXFloatAttribute attribute, float* value) const {
for (size_t i = 0; i < data_.float_attributes.size(); ++i) {
if (data_.float_attributes[i].first == attribute) {
*value = data_.float_attributes[i].second;
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.float_attributes.size(); ++i) {
if (data.float_attributes[i].first == attribute) {
*value = data.float_attributes[i].second;
return true;
}
}
Expand All @@ -437,28 +451,31 @@ bool BrowserAccessibility::GetFloatAttribute(

bool BrowserAccessibility::HasIntAttribute(
ui::AXIntAttribute attribute) const {
for (size_t i = 0; i < data_.int_attributes.size(); ++i) {
if (data_.int_attributes[i].first == attribute)
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.int_attributes.size(); ++i) {
if (data.int_attributes[i].first == attribute)
return true;
}

return false;
}

int BrowserAccessibility::GetIntAttribute(ui::AXIntAttribute attribute) const {
for (size_t i = 0; i < data_.int_attributes.size(); ++i) {
if (data_.int_attributes[i].first == attribute)
return data_.int_attributes[i].second;
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.int_attributes.size(); ++i) {
if (data.int_attributes[i].first == attribute)
return data.int_attributes[i].second;
}

return 0;
}

bool BrowserAccessibility::GetIntAttribute(
ui::AXIntAttribute attribute, int* value) const {
for (size_t i = 0; i < data_.int_attributes.size(); ++i) {
if (data_.int_attributes[i].first == attribute) {
*value = data_.int_attributes[i].second;
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.int_attributes.size(); ++i) {
if (data.int_attributes[i].first == attribute) {
*value = data.int_attributes[i].second;
return true;
}
}
Expand All @@ -468,8 +485,9 @@ bool BrowserAccessibility::GetIntAttribute(

bool BrowserAccessibility::HasStringAttribute(
ui::AXStringAttribute attribute) const {
for (size_t i = 0; i < data_.string_attributes.size(); ++i) {
if (data_.string_attributes[i].first == attribute)
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.string_attributes.size(); ++i) {
if (data.string_attributes[i].first == attribute)
return true;
}

Expand All @@ -478,20 +496,22 @@ bool BrowserAccessibility::HasStringAttribute(

const std::string& BrowserAccessibility::GetStringAttribute(
ui::AXStringAttribute attribute) const {
const ui::AXNodeData& data = GetData();
CR_DEFINE_STATIC_LOCAL(std::string, empty_string, ());
for (size_t i = 0; i < data_.string_attributes.size(); ++i) {
if (data_.string_attributes[i].first == attribute)
return data_.string_attributes[i].second;
for (size_t i = 0; i < data.string_attributes.size(); ++i) {
if (data.string_attributes[i].first == attribute)
return data.string_attributes[i].second;
}

return empty_string;
}

bool BrowserAccessibility::GetStringAttribute(
ui::AXStringAttribute attribute, std::string* value) const {
for (size_t i = 0; i < data_.string_attributes.size(); ++i) {
if (data_.string_attributes[i].first == attribute) {
*value = data_.string_attributes[i].second;
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.string_attributes.size(); ++i) {
if (data.string_attributes[i].first == attribute) {
*value = data.string_attributes[i].second;
return true;
}
}
Expand Down Expand Up @@ -519,20 +539,27 @@ bool BrowserAccessibility::GetString16Attribute(

void BrowserAccessibility::SetStringAttribute(
ui::AXStringAttribute attribute, const std::string& value) {
for (size_t i = 0; i < data_.string_attributes.size(); ++i) {
if (data_.string_attributes[i].first == attribute) {
data_.string_attributes[i].second = value;
if (!node_)
return;
ui::AXNodeData data = GetData();
for (size_t i = 0; i < data.string_attributes.size(); ++i) {
if (data.string_attributes[i].first == attribute) {
data.string_attributes[i].second = value;
node_->SetData(data);
return;
}
}
if (!value.empty())
data_.string_attributes.push_back(std::make_pair(attribute, value));
if (!value.empty()) {
data.string_attributes.push_back(std::make_pair(attribute, value));
node_->SetData(data);
}
}

bool BrowserAccessibility::HasIntListAttribute(
ui::AXIntListAttribute attribute) const {
for (size_t i = 0; i < data_.intlist_attributes.size(); ++i) {
if (data_.intlist_attributes[i].first == attribute)
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.intlist_attributes.size(); ++i) {
if (data.intlist_attributes[i].first == attribute)
return true;
}

Expand All @@ -541,10 +568,11 @@ bool BrowserAccessibility::HasIntListAttribute(

const std::vector<int32>& BrowserAccessibility::GetIntListAttribute(
ui::AXIntListAttribute attribute) const {
const ui::AXNodeData& data = GetData();
CR_DEFINE_STATIC_LOCAL(std::vector<int32>, empty_vector, ());
for (size_t i = 0; i < data_.intlist_attributes.size(); ++i) {
if (data_.intlist_attributes[i].first == attribute)
return data_.intlist_attributes[i].second;
for (size_t i = 0; i < data.intlist_attributes.size(); ++i) {
if (data.intlist_attributes[i].first == attribute)
return data.intlist_attributes[i].second;
}

return empty_vector;
Expand All @@ -553,9 +581,10 @@ const std::vector<int32>& BrowserAccessibility::GetIntListAttribute(
bool BrowserAccessibility::GetIntListAttribute(
ui::AXIntListAttribute attribute,
std::vector<int32>* value) const {
for (size_t i = 0; i < data_.intlist_attributes.size(); ++i) {
if (data_.intlist_attributes[i].first == attribute) {
*value = data_.intlist_attributes[i].second;
const ui::AXNodeData& data = GetData();
for (size_t i = 0; i < data.intlist_attributes.size(); ++i) {
if (data.intlist_attributes[i].first == attribute) {
*value = data.intlist_attributes[i].second;
return true;
}
}
Expand Down
Loading

0 comments on commit d96f384

Please sign in to comment.