Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/accessibility/browser_accessibility.h" | 5 #include "content/browser/accessibility/browser_accessibility.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 | 31 |
| 32 BrowserAccessibility::~BrowserAccessibility() { | 32 BrowserAccessibility::~BrowserAccessibility() { |
| 33 } | 33 } |
| 34 | 34 |
| 35 void BrowserAccessibility::Init(BrowserAccessibilityManager* manager, | 35 void BrowserAccessibility::Init(BrowserAccessibilityManager* manager, |
| 36 ui::AXNode* node) { | 36 ui::AXNode* node) { |
| 37 manager_ = manager; | 37 manager_ = manager; |
| 38 node_ = node; | 38 node_ = node; |
| 39 } | 39 } |
| 40 | 40 |
| 41 void BrowserAccessibility::OnDataChanged() { | |
| 42 GetStringAttribute(ui::AX_ATTR_NAME, &name_); | |
| 43 GetStringAttribute(ui::AX_ATTR_VALUE, &value_); | |
| 44 } | |
| 45 | |
| 46 bool BrowserAccessibility::PlatformIsLeaf() const { | 41 bool BrowserAccessibility::PlatformIsLeaf() const { |
| 47 if (InternalChildCount() == 0) | 42 if (InternalChildCount() == 0) |
| 48 return true; | 43 return true; |
| 49 | 44 |
| 50 // All of these roles may have children that we use as internal | 45 // All of these roles may have children that we use as internal |
| 51 // implementation details, but we want to expose them as leaves | 46 // implementation details, but we want to expose them as leaves |
| 52 // to platform accessibility APIs. | 47 // to platform accessibility APIs. |
| 53 switch (GetRole()) { | 48 switch (GetRole()) { |
| 54 case ui::AX_ROLE_LINE_BREAK: | 49 case ui::AX_ROLE_LINE_BREAK: |
| 55 case ui::AX_ROLE_SLIDER: | 50 case ui::AX_ROLE_SLIDER: |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 if (result->HasBoolAttribute(ui::AX_ATTR_IS_AX_TREE_HOST)) { | 84 if (result->HasBoolAttribute(ui::AX_ATTR_IS_AX_TREE_HOST)) { |
| 90 BrowserAccessibilityManager* child_manager = | 85 BrowserAccessibilityManager* child_manager = |
| 91 manager_->delegate()->AccessibilityGetChildFrame(result->GetId()); | 86 manager_->delegate()->AccessibilityGetChildFrame(result->GetId()); |
| 92 if (child_manager) | 87 if (child_manager) |
| 93 result = child_manager->GetRoot(); | 88 result = child_manager->GetRoot(); |
| 94 } | 89 } |
| 95 | 90 |
| 96 return result; | 91 return result; |
| 97 } | 92 } |
| 98 | 93 |
| 94 bool BrowserAccessibility::PlatformIsChildOfLeaf() const { | |
|
aboxhall
2015/01/22 21:22:09
Is this something we could or should reasonably ca
dmazzoni
2015/01/23 23:26:13
Worth considering! Right now our bottlenecks are m
| |
| 95 BrowserAccessibility* ancestor = GetParent(); | |
| 96 while (ancestor) { | |
| 97 if (ancestor->PlatformIsLeaf()) | |
| 98 return true; | |
| 99 ancestor = ancestor->GetParent(); | |
| 100 } | |
| 101 | |
| 102 return false; | |
| 103 } | |
| 104 | |
| 99 BrowserAccessibility* BrowserAccessibility::GetPreviousSibling() { | 105 BrowserAccessibility* BrowserAccessibility::GetPreviousSibling() { |
| 100 if (GetParent() && GetIndexInParent() > 0) | 106 if (GetParent() && GetIndexInParent() > 0) |
| 101 return GetParent()->InternalGetChild(GetIndexInParent() - 1); | 107 return GetParent()->InternalGetChild(GetIndexInParent() - 1); |
| 102 | 108 |
| 103 return NULL; | 109 return NULL; |
| 104 } | 110 } |
| 105 | 111 |
| 106 BrowserAccessibility* BrowserAccessibility::GetNextSibling() { | 112 BrowserAccessibility* BrowserAccessibility::GetNextSibling() { |
| 107 if (GetParent() && | 113 if (GetParent() && |
| 108 GetIndexInParent() >= 0 && | 114 GetIndexInParent() >= 0 && |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 if (descendant_result) | 383 if (descendant_result) |
| 378 return descendant_result; | 384 return descendant_result; |
| 379 if (child_result) | 385 if (child_result) |
| 380 return child_result; | 386 return child_result; |
| 381 | 387 |
| 382 return this; | 388 return this; |
| 383 } | 389 } |
| 384 | 390 |
| 385 void BrowserAccessibility::Destroy() { | 391 void BrowserAccessibility::Destroy() { |
| 386 // Allow the object to fire a TextRemoved notification. | 392 // Allow the object to fire a TextRemoved notification. |
| 387 name_.clear(); | |
| 388 value_.clear(); | |
| 389 | |
| 390 manager_->NotifyAccessibilityEvent(ui::AX_EVENT_HIDE, this); | 393 manager_->NotifyAccessibilityEvent(ui::AX_EVENT_HIDE, this); |
| 391 node_ = NULL; | 394 node_ = NULL; |
| 392 manager_ = NULL; | 395 manager_ = NULL; |
| 393 | 396 |
| 394 NativeReleaseReference(); | 397 NativeReleaseReference(); |
| 395 } | 398 } |
| 396 | 399 |
| 397 void BrowserAccessibility::NativeReleaseReference() { | 400 void BrowserAccessibility::NativeReleaseReference() { |
| 398 delete this; | 401 delete this; |
| 399 } | 402 } |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 550 bool BrowserAccessibility::GetString16Attribute( | 553 bool BrowserAccessibility::GetString16Attribute( |
| 551 ui::AXStringAttribute attribute, | 554 ui::AXStringAttribute attribute, |
| 552 base::string16* value) const { | 555 base::string16* value) const { |
| 553 std::string value_utf8; | 556 std::string value_utf8; |
| 554 if (!GetStringAttribute(attribute, &value_utf8)) | 557 if (!GetStringAttribute(attribute, &value_utf8)) |
| 555 return false; | 558 return false; |
| 556 *value = base::UTF8ToUTF16(value_utf8); | 559 *value = base::UTF8ToUTF16(value_utf8); |
| 557 return true; | 560 return true; |
| 558 } | 561 } |
| 559 | 562 |
| 560 void BrowserAccessibility::SetStringAttribute( | |
| 561 ui::AXStringAttribute attribute, const std::string& value) { | |
| 562 if (!node_) | |
| 563 return; | |
| 564 ui::AXNodeData data = GetData(); | |
| 565 for (size_t i = 0; i < data.string_attributes.size(); ++i) { | |
| 566 if (data.string_attributes[i].first == attribute) { | |
| 567 data.string_attributes[i].second = value; | |
| 568 node_->SetData(data); | |
| 569 return; | |
| 570 } | |
| 571 } | |
| 572 if (!value.empty()) { | |
| 573 data.string_attributes.push_back(std::make_pair(attribute, value)); | |
| 574 node_->SetData(data); | |
| 575 } | |
| 576 } | |
| 577 | |
| 578 bool BrowserAccessibility::HasIntListAttribute( | 563 bool BrowserAccessibility::HasIntListAttribute( |
| 579 ui::AXIntListAttribute attribute) const { | 564 ui::AXIntListAttribute attribute) const { |
| 580 const ui::AXNodeData& data = GetData(); | 565 const ui::AXNodeData& data = GetData(); |
| 581 for (size_t i = 0; i < data.intlist_attributes.size(); ++i) { | 566 for (size_t i = 0; i < data.intlist_attributes.size(); ++i) { |
| 582 if (data.intlist_attributes[i].first == attribute) | 567 if (data.intlist_attributes[i].first == attribute) |
| 583 return true; | 568 return true; |
| 584 } | 569 } |
| 585 | 570 |
| 586 return false; | 571 return false; |
| 587 } | 572 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 695 if (!parent) | 680 if (!parent) |
| 696 return false; | 681 return false; |
| 697 | 682 |
| 698 BrowserAccessibility* grandparent = parent->GetParent(); | 683 BrowserAccessibility* grandparent = parent->GetParent(); |
| 699 if (!grandparent) | 684 if (!grandparent) |
| 700 return false; | 685 return false; |
| 701 | 686 |
| 702 return grandparent->GetRole() == ui::AX_ROLE_IFRAME_PRESENTATIONAL; | 687 return grandparent->GetRole() == ui::AX_ROLE_IFRAME_PRESENTATIONAL; |
| 703 } | 688 } |
| 704 | 689 |
| 705 std::string BrowserAccessibility::GetTextRecursive() const { | |
| 706 if (!name_.empty()) { | |
| 707 return name_; | |
| 708 } | |
| 709 | |
| 710 std::string result; | |
| 711 for (uint32 i = 0; i < PlatformChildCount(); ++i) | |
| 712 result += PlatformGetChild(i)->GetTextRecursive(); | |
| 713 return result; | |
| 714 } | |
| 715 | |
| 716 int BrowserAccessibility::GetStaticTextLenRecursive() const { | 690 int BrowserAccessibility::GetStaticTextLenRecursive() const { |
| 717 if (GetRole() == ui::AX_ROLE_STATIC_TEXT) | 691 if (GetRole() == ui::AX_ROLE_STATIC_TEXT) |
| 718 return static_cast<int>(GetStringAttribute(ui::AX_ATTR_VALUE).size()); | 692 return static_cast<int>(GetStringAttribute(ui::AX_ATTR_VALUE).size()); |
| 719 | 693 |
| 720 int len = 0; | 694 int len = 0; |
| 721 for (size_t i = 0; i < InternalChildCount(); ++i) | 695 for (size_t i = 0; i < InternalChildCount(); ++i) |
| 722 len += InternalGetChild(i)->GetStaticTextLenRecursive(); | 696 len += InternalGetChild(i)->GetStaticTextLenRecursive(); |
| 723 return len; | 697 return len; |
| 724 } | 698 } |
| 725 | 699 |
| 726 } // namespace content | 700 } // namespace content |
| OLD | NEW |