Chromium Code Reviews| Index: content/browser/accessibility/browser_accessibility.cc |
| diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc |
| index 9f528bd0de10cb7f8c7624574c6b619cce9a763e..73312dcc09dca2c2094b8842038b877a842ae04f 100644 |
| --- a/content/browser/accessibility/browser_accessibility.cc |
| +++ b/content/browser/accessibility/browser_accessibility.cc |
| @@ -104,7 +104,7 @@ bool BrowserAccessibility::IsTextOnlyObject() const { |
| BrowserAccessibility* BrowserAccessibility::PlatformGetChild( |
| uint32_t child_index) const { |
| - DCHECK(child_index < PlatformChildCount()); |
| + DCHECK_LT(child_index, PlatformChildCount()); |
| BrowserAccessibility* result = nullptr; |
| if (HasIntAttribute(ui::AX_ATTR_CHILD_TREE_ID)) { |
| @@ -261,19 +261,25 @@ gfx::Rect BrowserAccessibility::GetGlobalBoundsRect() const { |
| gfx::Rect BrowserAccessibility::GetLocalBoundsForRange(int start, int len) |
| const { |
| if (GetRole() != ui::AX_ROLE_STATIC_TEXT) { |
| - // Apply recursively to all static text descendants. For example, if |
| - // you call it on a div with two text node children, it just calls |
| - // GetLocalBoundsForRange on each of the two children (adjusting |
| - // |start| for each one) and unions the resulting rects. |
| gfx::Rect bounds; |
| - for (size_t i = 0; i < InternalChildCount(); ++i) { |
| + for (size_t i = 0; i < InternalChildCount() && start >= 0; ++i) { |
| BrowserAccessibility* child = InternalGetChild(i); |
| - int child_len = child->GetInnerTextLength(); |
| - if (start < child_len && start + len > 0) { |
| - gfx::Rect child_rect = child->GetLocalBoundsForRange(start, len); |
| + // Embedded objects are of length one, since they are represented only by |
|
dmazzoni
2016/01/20 01:10:43
This comment confuses me. It talks about embedded
|
| + // a special character. |
| + int child_length_in_parent = |
| + child->IsTextOnlyObject() ? static_cast<int>(child->GetText().size()) |
| + : 1; |
| + if (start < child_length_in_parent) { |
| + gfx::Rect child_rect; |
| + if (child->IsTextOnlyObject()) |
| + child_rect = child->GetLocalBoundsForRange(start, len); |
| + else |
|
dmazzoni
2016/01/20 01:10:43
nit: Need braces around both blocks
|
| + child_rect = child->GetLocalBoundsForRange( |
| + start, static_cast<int>(child->GetText().size())); |
| bounds.Union(child_rect); |
| + len -= child_length_in_parent; |
| } |
| - start -= child_len; |
| + start -= child_length_in_parent; |
| } |
| return ElementBoundsToLocalBounds(bounds); |
| } |
| @@ -291,9 +297,7 @@ gfx::Rect BrowserAccessibility::GetLocalBoundsForRange(int start, int len) |
| continue; |
| } |
| - std::string child_text; |
| - child->GetStringAttribute(ui::AX_ATTR_NAME, &child_text); |
| - int child_len = static_cast<int>(child_text.size()); |
| + int child_len = static_cast<int>(GetText().size()); |
| child_start = child_end; |
| child_end += child_len; |
| @@ -382,7 +386,7 @@ int BrowserAccessibility::GetWordStartBoundary( |
| int start, ui::TextBoundaryDirection direction) const { |
| DCHECK_GE(start, -1); |
| // Special offset that indicates that a word boundary has not been found. |
| - int word_start_not_found = GetInnerTextLength(); |
| + int word_start_not_found = static_cast<int>(GetText().size()); |
| int word_start = word_start_not_found; |
| switch (GetRole()) { |
| @@ -397,9 +401,7 @@ int BrowserAccessibility::GetWordStartBoundary( |
| child_start = child_end; |
| BrowserAccessibility* child = InternalGetChild(i); |
| DCHECK_EQ(child->GetRole(), ui::AX_ROLE_INLINE_TEXT_BOX); |
| - const std::string& child_text = child->GetStringAttribute( |
| - ui::AX_ATTR_NAME); |
| - int child_len = static_cast<int>(child_text.size()); |
| + int child_len = static_cast<int>(GetText().size()); |
| child_end += child_len; // End is one past the last character. |
| const std::vector<int32_t>& word_starts = |
| @@ -455,19 +457,23 @@ int BrowserAccessibility::GetWordStartBoundary( |
| int child_start = 0; |
| for (size_t i = 0; i < InternalChildCount(); ++i) { |
| BrowserAccessibility* child = InternalGetChild(i); |
| - int child_len = child->GetInnerTextLength(); |
| - int child_word_start = child->GetWordStartBoundary(start, direction); |
| - if (child_word_start < child_len) { |
| - // We have found a possible word boundary. |
| - word_start = child_start + child_word_start; |
| - } |
| + // An embedded object is always represented by a single special |
| + // character. |
| + int child_len = 1; |
| + if (child->IsTextOnlyObject()) { |
| + child_len = static_cast<int>(child->GetText().size()); |
| + int child_word_start = child->GetWordStartBoundary(start, direction); |
| + if (child_word_start < child_len) { |
| + // We have found a possible word boundary. |
| + word_start = child_start + child_word_start; |
| + } |
| - // Decide when to stop searching. |
| - if ((word_start != word_start_not_found && |
| - direction == ui::FORWARDS_DIRECTION) || |
| - (start < child_len && |
| - direction == ui::BACKWARDS_DIRECTION)) { |
| - break; |
| + // Decide when to stop searching. |
| + if ((word_start != word_start_not_found && |
| + direction == ui::FORWARDS_DIRECTION) || |
| + (start < child_len && direction == ui::BACKWARDS_DIRECTION)) { |
| + break; |
| + } |
| } |
| child_start += child_len; |
| @@ -656,7 +662,7 @@ bool BrowserAccessibility::GetAriaTristate( |
| if (base::EqualsASCII(value, "mixed")) |
| *is_mixed = true; |
| - return false; // Not set |
| + return false; // Not set. |
| } |
| bool BrowserAccessibility::HasState(ui::AXState state_enum) const { |
| @@ -670,7 +676,8 @@ bool BrowserAccessibility::IsCellOrTableHeaderRole() const { |
| } |
| bool BrowserAccessibility::HasCaret() const { |
| - if (IsEditableText() && !HasState(ui::AX_STATE_RICHLY_EDITABLE) && |
| + if (HasState(ui::AX_STATE_EDITABLE) && |
| + !HasState(ui::AX_STATE_RICHLY_EDITABLE) && |
| HasIntAttribute(ui::AX_ATTR_TEXT_SEL_START) && |
| HasIntAttribute(ui::AX_ATTR_TEXT_SEL_END)) { |
| return true; |
| @@ -688,10 +695,6 @@ bool BrowserAccessibility::HasCaret() const { |
| return true; |
| } |
| -bool BrowserAccessibility::IsEditableText() const { |
| - return HasState(ui::AX_STATE_EDITABLE); |
| -} |
| - |
| bool BrowserAccessibility::IsWebAreaForPresentationalIframe() const { |
| if (GetRole() != ui::AX_ROLE_WEB_AREA && |
| GetRole() != ui::AX_ROLE_ROOT_WEB_AREA) { |
| @@ -792,10 +795,6 @@ base::string16 BrowserAccessibility::GetInnerText() const { |
| return text; |
| } |
| -int BrowserAccessibility::GetInnerTextLength() const { |
| - return static_cast<int>(GetInnerText().size()); |
| -} |
| - |
| void BrowserAccessibility::FixEmptyBounds(gfx::Rect* bounds) const |
| { |
| if (bounds->width() > 0 && bounds->height() > 0) |