summaryrefslogtreecommitdiffstats
path: root/chrome/browser/accessibility/browser_accessibility.cc
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-23 22:19:39 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-23 22:19:39 +0000
commit219edb72922b55aeb817029660e44795ba1c74ae (patch)
treec6a76e3afc1d9ef6a53397dc66041848b770ff27 /chrome/browser/accessibility/browser_accessibility.cc
parentcffc1ec53b392b9ace2cd246e9014ac0b9161ae0 (diff)
downloadchromium_src-219edb72922b55aeb817029660e44795ba1c74ae.zip
chromium_src-219edb72922b55aeb817029660e44795ba1c74ae.tar.gz
chromium_src-219edb72922b55aeb817029660e44795ba1c74ae.tar.bz2
Revert 90265 - Move browser accessibility code from chrome to content.
BUG=85932 TEST=none Review URL: http://codereview.chromium.org/7233022 TBR=dmazzoni@chromium.org Review URL: http://codereview.chromium.org/7247022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90279 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/accessibility/browser_accessibility.cc')
-rw-r--r--chrome/browser/accessibility/browser_accessibility.cc204
1 files changed, 204 insertions, 0 deletions
diff --git a/chrome/browser/accessibility/browser_accessibility.cc b/chrome/browser/accessibility/browser_accessibility.cc
new file mode 100644
index 0000000..92a4819
--- /dev/null
+++ b/chrome/browser/accessibility/browser_accessibility.cc
@@ -0,0 +1,204 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/accessibility/browser_accessibility.h"
+
+#include "base/logging.h"
+#include "base/string_number_conversions.h"
+#include "chrome/browser/accessibility/browser_accessibility_manager.h"
+
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+// There's no OS-specific implementation of BrowserAccessibilityManager
+// on Unix, so just instantiate the base class.
+// static
+BrowserAccessibility* BrowserAccessibility::Create() {
+ return new BrowserAccessibility();
+}
+#endif
+
+BrowserAccessibility::BrowserAccessibility()
+ : manager_(NULL),
+ parent_(NULL),
+ child_id_(0),
+ index_in_parent_(0),
+ renderer_id_(0),
+ ref_count_(1),
+ role_(0),
+ state_(0),
+ instance_active_(false) {
+}
+
+BrowserAccessibility::~BrowserAccessibility() {
+}
+
+void BrowserAccessibility::DetachTree(
+ std::vector<BrowserAccessibility*>* nodes) {
+ nodes->push_back(this);
+ for (size_t i = 0; i < children_.size(); i++)
+ children_[i]->DetachTree(nodes);
+ children_.clear();
+ parent_ = NULL;
+}
+
+void BrowserAccessibility::Initialize(
+ BrowserAccessibilityManager* manager,
+ BrowserAccessibility* parent,
+ int32 child_id,
+ int32 index_in_parent,
+ const webkit_glue::WebAccessibility& src) {
+ manager_ = manager;
+ parent_ = parent;
+ child_id_ = child_id;
+ index_in_parent_ = index_in_parent;
+
+ renderer_id_ = src.id;
+ name_ = src.name;
+ value_ = src.value;
+ attributes_ = src.attributes;
+ html_attributes_ = src.html_attributes;
+ location_ = src.location;
+ role_ = src.role;
+ state_ = src.state;
+ indirect_child_ids_ = src.indirect_child_ids;
+ line_breaks_ = src.line_breaks;
+
+ Initialize();
+}
+
+void BrowserAccessibility::Initialize() {
+ instance_active_ = true;
+}
+
+void BrowserAccessibility::AddChild(BrowserAccessibility* child) {
+ children_.push_back(child);
+}
+
+void BrowserAccessibility::UpdateParent(BrowserAccessibility* parent,
+ int index_in_parent) {
+ parent_ = parent;
+ index_in_parent_ = index_in_parent;
+}
+
+bool BrowserAccessibility::IsDescendantOf(
+ BrowserAccessibility* ancestor) {
+ if (this == ancestor) {
+ return true;
+ } else if (parent_) {
+ return parent_->IsDescendantOf(ancestor);
+ }
+
+ return false;
+}
+
+BrowserAccessibility* BrowserAccessibility::GetChild(uint32 child_index) {
+ DCHECK(child_index < children_.size());
+ return children_[child_index];
+}
+
+BrowserAccessibility* BrowserAccessibility::GetPreviousSibling() {
+ if (parent_ && index_in_parent_ > 0)
+ return parent_->children_[index_in_parent_ - 1];
+
+ return NULL;
+}
+
+BrowserAccessibility* BrowserAccessibility::GetNextSibling() {
+ if (parent_ &&
+ index_in_parent_ >= 0 &&
+ index_in_parent_ < static_cast<int>(parent_->children_.size() - 1)) {
+ return parent_->children_[index_in_parent_ + 1];
+ }
+
+ return NULL;
+}
+
+gfx::Rect BrowserAccessibility::GetBoundsRect() {
+ gfx::Rect bounds = location_;
+
+ // Adjust the bounds by the top left corner of the containing view's bounds
+ // in screen coordinates.
+ gfx::Point top_left = manager_->GetViewBounds().origin();
+ bounds.Offset(top_left);
+
+ // Adjust top left position by the root document's scroll offset.
+ BrowserAccessibility* root = manager_->GetRoot();
+ int scroll_x = 0;
+ int scroll_y = 0;
+ root->GetAttributeAsInt(
+ WebAccessibility::ATTR_DOC_SCROLLX, &scroll_x);
+ root->GetAttributeAsInt(
+ WebAccessibility::ATTR_DOC_SCROLLY, &scroll_y);
+ bounds.Offset(-scroll_x, -scroll_y);
+
+ return bounds;
+}
+
+BrowserAccessibility* BrowserAccessibility::BrowserAccessibilityForPoint(
+ const gfx::Point& point) {
+ // Walk the children recursively looking for the BrowserAccessibility that
+ // most tightly encloses the specified point.
+ for (int i = children_.size() - 1; i >= 0; --i) {
+ BrowserAccessibility* child = children_[i];
+ if (child->GetBoundsRect().Contains(point))
+ return child->BrowserAccessibilityForPoint(point);
+ }
+ return this;
+}
+
+void BrowserAccessibility::InternalAddReference() {
+ ref_count_++;
+}
+
+void BrowserAccessibility::InternalReleaseReference(bool recursive) {
+ DCHECK_GT(ref_count_, 0);
+
+ if (recursive || ref_count_ == 1) {
+ for (std::vector<BrowserAccessibility*>::iterator iter = children_.begin();
+ iter != children_.end();
+ ++iter) {
+ (*iter)->InternalReleaseReference(true);
+ }
+ }
+
+ ref_count_--;
+ if (ref_count_ == 0) {
+ instance_active_ = false;
+ children_.clear();
+ manager_->Remove(child_id_, renderer_id_);
+ NativeReleaseReference();
+ }
+}
+
+void BrowserAccessibility::NativeReleaseReference() {
+ delete this;
+}
+
+bool BrowserAccessibility::HasAttribute(
+ WebAccessibility::Attribute attribute) {
+ return (attributes_.find(attribute) != attributes_.end());
+}
+
+bool BrowserAccessibility::GetAttribute(
+ WebAccessibility::Attribute attribute, string16* value) {
+ std::map<int32, string16>::iterator iter = attributes_.find(attribute);
+ if (iter != attributes_.end()) {
+ *value = iter->second;
+ return true;
+ }
+
+ return false;
+}
+
+bool BrowserAccessibility::GetAttributeAsInt(
+ WebAccessibility::Attribute attribute, int* value_int) {
+ string16 value_str;
+
+ if (!GetAttribute(attribute, &value_str))
+ return false;
+
+ if (!base::StringToInt(value_str, value_int))
+ return false;
+
+ return true;
+}