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 0797a36a0fc0c8af0e8faa15f4e5189615321aa3..575404aba2925ab160905bb769c613b097caa391 100644 |
| --- a/content/browser/accessibility/browser_accessibility.cc |
| +++ b/content/browser/accessibility/browser_accessibility.cc |
| @@ -7,6 +7,7 @@ |
| #include <stddef.h> |
| #include <algorithm> |
| +#include <functional> |
| #include "base/logging.h" |
| #include "base/strings/string_number_conversions.h" |
| @@ -533,9 +534,7 @@ int BrowserAccessibility::GetLineStartBoundary( |
| DCHECK_LE(start, static_cast<int>(GetText().length())); |
| if (IsSimpleTextControl()) { |
| - const std::vector<int32_t>& line_breaks = |
| - GetIntListAttribute(ui::AX_ATTR_LINE_BREAKS); |
| - return ui::FindAccessibleTextBoundary(GetText(), line_breaks, |
| + return ui::FindAccessibleTextBoundary(GetText(), ComputeLineBreaks(), |
| ui::LINE_BOUNDARY, start, direction, |
| affinity); |
| } |
| @@ -1142,6 +1141,33 @@ std::string BrowserAccessibility::ComputeAccessibleNameFromDescendants() { |
| return name; |
| } |
| +std::vector<int> BrowserAccessibility::ComputeLineBreaks() const { |
| + std::vector<int> line_breaks; |
| + int offset = 0; |
| + for (size_t i = 0; i < InternalChildCount(); ++i) { |
| + const BrowserAccessibility* child = InternalGetChild(i); |
| + DCHECK(child); |
| + switch |
| + child->GetRole() { |
| + case ui::AX_ROLE_INLINE_TEXT_BOX: |
|
dmazzoni
2016/09/02 15:55:00
This algorithm is fine, it will certainly work cor
|
| + offset += child->GetText().length(); |
| + if (!child->IsNextSiblingOnSameLine()) |
| + line_breaks.push_back(offset); |
| + break; |
| + case ui::AX_ROLE_LINE_BREAK: |
| + line_breaks.push_back(offset); |
| + offset += child->GetText().length(); |
| + break; |
| + default: |
| + std::vector<int> child_breaks = child->ComputeLineBreaks(); |
| + std::transform(child_breaks.begin(), child_breaks.end(), child_breaks.begin(), std::bind2nd()std::plus<int>, offset)); |
|
dmazzoni
2016/09/02 15:55:00
Needs indentation
Could you write this using a la
|
| + line_breaks.insert(line_breaks.end(), child_breaks.begin(), |
| + child_breaks.end()); |
| + } |
| + } |
| + return line_breaks; |
| +} |
| + |
| base::string16 BrowserAccessibility::GetInnerText() const { |
| if (IsTextOnlyObject()) |
| return GetString16Attribute(ui::AX_ATTR_NAME); |