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 <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 gfx::Rect bounds; | 263 gfx::Rect bounds; |
264 for (size_t i = 0; i < InternalChildCount() && child_end < start + len; ++i) { | 264 for (size_t i = 0; i < InternalChildCount() && child_end < start + len; ++i) { |
265 BrowserAccessibility* child = InternalGetChild(i); | 265 BrowserAccessibility* child = InternalGetChild(i); |
266 if (child->GetRole() != ui::AX_ROLE_INLINE_TEXT_BOX) { | 266 if (child->GetRole() != ui::AX_ROLE_INLINE_TEXT_BOX) { |
267 DLOG(WARNING) << "BrowserAccessibility objects with role STATIC_TEXT " << | 267 DLOG(WARNING) << "BrowserAccessibility objects with role STATIC_TEXT " << |
268 "should have children of role INLINE_TEXT_BOX."; | 268 "should have children of role INLINE_TEXT_BOX."; |
269 continue; | 269 continue; |
270 } | 270 } |
271 | 271 |
272 std::string child_text; | 272 std::string child_text; |
273 child->GetStringAttribute(ui::AX_ATTR_VALUE, &child_text); | 273 child->GetStringAttribute(ui::AX_ATTR_NAME, &child_text); |
274 int child_len = static_cast<int>(child_text.size()); | 274 int child_len = static_cast<int>(child_text.size()); |
275 child_start = child_end; | 275 child_start = child_end; |
276 child_end += child_len; | 276 child_end += child_len; |
277 | 277 |
278 if (child_end < start) | 278 if (child_end < start) |
279 continue; | 279 continue; |
280 | 280 |
281 int overlap_start = std::max(start, child_start); | 281 int overlap_start = std::max(start, child_start); |
282 int overlap_end = std::min(end, child_end); | 282 int overlap_end = std::min(end, child_end); |
283 | 283 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 int child_start = 0; | 362 int child_start = 0; |
363 int child_end = 0; | 363 int child_end = 0; |
364 | 364 |
365 // Go through the inline text boxes. | 365 // Go through the inline text boxes. |
366 for (size_t i = 0; i < InternalChildCount(); ++i) { | 366 for (size_t i = 0; i < InternalChildCount(); ++i) { |
367 // The next child starts where the previous one ended. | 367 // The next child starts where the previous one ended. |
368 child_start = child_end; | 368 child_start = child_end; |
369 BrowserAccessibility* child = InternalGetChild(i); | 369 BrowserAccessibility* child = InternalGetChild(i); |
370 DCHECK_EQ(child->GetRole(), ui::AX_ROLE_INLINE_TEXT_BOX); | 370 DCHECK_EQ(child->GetRole(), ui::AX_ROLE_INLINE_TEXT_BOX); |
371 const std::string& child_text = child->GetStringAttribute( | 371 const std::string& child_text = child->GetStringAttribute( |
372 ui::AX_ATTR_VALUE); | 372 ui::AX_ATTR_NAME); |
373 int child_len = static_cast<int>(child_text.size()); | 373 int child_len = static_cast<int>(child_text.size()); |
374 child_end += child_len; // End is one past the last character. | 374 child_end += child_len; // End is one past the last character. |
375 | 375 |
376 const std::vector<int32>& word_starts = child->GetIntListAttribute( | 376 const std::vector<int32>& word_starts = child->GetIntListAttribute( |
377 ui::AX_ATTR_WORD_STARTS); | 377 ui::AX_ATTR_WORD_STARTS); |
378 if (word_starts.empty()) { | 378 if (word_starts.empty()) { |
379 word_start = child_end; | 379 word_start = child_end; |
380 continue; | 380 continue; |
381 } | 381 } |
382 | 382 |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 switch (GetRole()) { | 718 switch (GetRole()) { |
719 case ui::AX_ROLE_COMBO_BOX: | 719 case ui::AX_ROLE_COMBO_BOX: |
720 case ui::AX_ROLE_SEARCH_BOX: | 720 case ui::AX_ROLE_SEARCH_BOX: |
721 case ui::AX_ROLE_TEXT_FIELD: | 721 case ui::AX_ROLE_TEXT_FIELD: |
722 return true; | 722 return true; |
723 default: | 723 default: |
724 return false; | 724 return false; |
725 } | 725 } |
726 } | 726 } |
727 | 727 |
| 728 std::string BrowserAccessibility::ComputeAccessibleNameFromDescendants() { |
| 729 std::string name; |
| 730 for (size_t i = 0; i < InternalChildCount(); ++i) { |
| 731 BrowserAccessibility* child = InternalGetChild(i); |
| 732 std::string child_name; |
| 733 if (child->GetStringAttribute(ui::AX_ATTR_NAME, &child_name)) { |
| 734 if (!name.empty()) |
| 735 name += " "; |
| 736 name += child_name; |
| 737 } else if (!child->HasState(ui::AX_STATE_FOCUSABLE)) { |
| 738 child_name = child->ComputeAccessibleNameFromDescendants(); |
| 739 if (!child_name.empty()) { |
| 740 if (!name.empty()) |
| 741 name += " "; |
| 742 name += child_name; |
| 743 } |
| 744 } |
| 745 } |
| 746 |
| 747 return name; |
| 748 } |
| 749 |
728 int BrowserAccessibility::GetStaticTextLenRecursive() const { | 750 int BrowserAccessibility::GetStaticTextLenRecursive() const { |
729 if (GetRole() == ui::AX_ROLE_STATIC_TEXT || | 751 if (GetRole() == ui::AX_ROLE_STATIC_TEXT || |
730 GetRole() == ui::AX_ROLE_LINE_BREAK) { | 752 GetRole() == ui::AX_ROLE_LINE_BREAK) { |
731 return static_cast<int>(GetStringAttribute(ui::AX_ATTR_VALUE).size()); | 753 return static_cast<int>(GetStringAttribute(ui::AX_ATTR_NAME).size()); |
732 } | 754 } |
733 | 755 |
734 int len = 0; | 756 int len = 0; |
735 for (size_t i = 0; i < InternalChildCount(); ++i) | 757 for (size_t i = 0; i < InternalChildCount(); ++i) |
736 len += InternalGetChild(i)->GetStaticTextLenRecursive(); | 758 len += InternalGetChild(i)->GetStaticTextLenRecursive(); |
737 return len; | 759 return len; |
738 } | 760 } |
739 | 761 |
740 void BrowserAccessibility::FixEmptyBounds(gfx::Rect* bounds) const | 762 void BrowserAccessibility::FixEmptyBounds(gfx::Rect* bounds) const |
741 { | 763 { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 } | 819 } |
798 need_to_offset_web_area = true; | 820 need_to_offset_web_area = true; |
799 } | 821 } |
800 parent = parent->GetParent(); | 822 parent = parent->GetParent(); |
801 } | 823 } |
802 | 824 |
803 return bounds; | 825 return bounds; |
804 } | 826 } |
805 | 827 |
806 } // namespace content | 828 } // namespace content |
OLD | NEW |