| Index: content/browser/accessibility/browser_accessibility.cc
|
| diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
|
| index e48625d5595dc23f03d5d311d0a5b7d93a1c91ff..f2d76016cc3298cc9df5488c72387a024cb11b1a 100644
|
| --- a/content/browser/accessibility/browser_accessibility.cc
|
| +++ b/content/browser/accessibility/browser_accessibility.cc
|
| @@ -526,197 +526,6 @@ base::string16 BrowserAccessibility::GetValue() const {
|
| return value;
|
| }
|
|
|
| -int BrowserAccessibility::GetLineStartBoundary(
|
| - int start,
|
| - ui::TextBoundaryDirection direction,
|
| - ui::AXTextAffinity affinity) const {
|
| - DCHECK_GE(start, 0);
|
| - DCHECK_LE(start, static_cast<int>(GetText().length()));
|
| -
|
| - if (IsSimpleTextControl()) {
|
| - return ui::FindAccessibleTextBoundary(GetText(), GetLineStartOffsets(),
|
| - ui::LINE_BOUNDARY, start, direction,
|
| - affinity);
|
| - }
|
| -
|
| - // Keeps track of the start offset of each consecutive line.
|
| - int line_start = 0;
|
| - // Keeps track of the length of each consecutive line.
|
| - int line_length = 0;
|
| - for (size_t i = 0; i < InternalChildCount(); ++i) {
|
| - const BrowserAccessibility* child = InternalGetChild(i);
|
| - DCHECK(child);
|
| - // Child objects are of length one, since they are represented by a
|
| - // single embedded object character. The exception is text-only objects.
|
| - int child_length = 1;
|
| - if (child->IsTextOnlyObject())
|
| - child_length = static_cast<int>(child->GetText().length());
|
| -
|
| - // Determine if |start| is within this child. As a special case, if
|
| - // the affinity is upstream, then the cursor position between two
|
| - // lines belongs to the previous line.
|
| - bool start_index_within_child = start < child_length;
|
| - if (start == child_length &&
|
| - !child->IsNextSiblingOnSameLine() &&
|
| - affinity == ui::AX_TEXT_AFFINITY_UPSTREAM) {
|
| - start_index_within_child = true;
|
| - }
|
| -
|
| - // Stop when we reach both the child containing our start offset and, in
|
| - // case we are searching forward, the child that is at the end of the line
|
| - // on which this object is located.
|
| - if (start_index_within_child && (direction == ui::BACKWARDS_DIRECTION ||
|
| - !child->IsNextSiblingOnSameLine())) {
|
| - // Recurse into the inline text boxes.
|
| - if (child->GetRole() == ui::AX_ROLE_STATIC_TEXT) {
|
| - switch (direction) {
|
| - case ui::FORWARDS_DIRECTION:
|
| - line_length += child->GetLineStartBoundary(
|
| - std::max(start, 0), direction, affinity);
|
| - break;
|
| - case ui::BACKWARDS_DIRECTION:
|
| - line_start += child->GetLineStartBoundary(
|
| - std::max(start, 0), direction, affinity);
|
| - break;
|
| - }
|
| - } else {
|
| - line_length += child_length;
|
| - }
|
| -
|
| - break;
|
| - }
|
| - line_length += child_length;
|
| -
|
| - if (!child->IsNextSiblingOnSameLine()) {
|
| - // We are on a new line.
|
| - line_start += line_length;
|
| - line_length = 0;
|
| - }
|
| -
|
| - start -= child_length;
|
| - }
|
| -
|
| - switch (direction) {
|
| - case ui::FORWARDS_DIRECTION:
|
| - return line_start + line_length;
|
| - case ui::BACKWARDS_DIRECTION:
|
| - return line_start;
|
| - }
|
| - NOTREACHED();
|
| - return 0;
|
| -}
|
| -
|
| -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 = static_cast<int>(GetText().size());
|
| - int word_start = word_start_not_found;
|
| -
|
| - switch (GetRole()) {
|
| - case ui::AX_ROLE_STATIC_TEXT: {
|
| - int prev_word_start = word_start_not_found;
|
| - int child_start = 0;
|
| - int child_end = 0;
|
| -
|
| - // Go through the inline text boxes.
|
| - for (size_t i = 0; i < InternalChildCount(); ++i) {
|
| - // The next child starts where the previous one ended.
|
| - child_start = child_end;
|
| - const BrowserAccessibility* child = InternalGetChild(i);
|
| - DCHECK_EQ(child->GetRole(), ui::AX_ROLE_INLINE_TEXT_BOX);
|
| - int child_len = static_cast<int>(child->GetText().size());
|
| - child_end += child_len; // End is one past the last character.
|
| -
|
| - const std::vector<int32_t>& word_starts =
|
| - child->GetIntListAttribute(ui::AX_ATTR_WORD_STARTS);
|
| - if (word_starts.empty()) {
|
| - word_start = child_end;
|
| - continue;
|
| - }
|
| -
|
| - int local_start = start - child_start;
|
| - std::vector<int32_t>::const_iterator iter = std::upper_bound(
|
| - word_starts.begin(), word_starts.end(), local_start);
|
| - if (iter != word_starts.end()) {
|
| - if (direction == ui::FORWARDS_DIRECTION) {
|
| - word_start = child_start + *iter;
|
| - } else if (direction == ui::BACKWARDS_DIRECTION) {
|
| - if (iter == word_starts.begin()) {
|
| - // Return the position of the last word in the previous child.
|
| - word_start = prev_word_start;
|
| - } else {
|
| - word_start = child_start + *(iter - 1);
|
| - }
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| - break;
|
| - }
|
| -
|
| - // No word start that is greater than the requested offset has been
|
| - // found.
|
| - prev_word_start = child_start + *(iter - 1);
|
| - if (direction == ui::FORWARDS_DIRECTION) {
|
| - word_start = child_end;
|
| - } else if (direction == ui::BACKWARDS_DIRECTION) {
|
| - word_start = prev_word_start;
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| - }
|
| - return word_start;
|
| - }
|
| -
|
| - case ui::AX_ROLE_LINE_BREAK:
|
| - // Words never start at a line break.
|
| - return word_start_not_found;
|
| -
|
| - default:
|
| - // If there are no children, the word start boundary is still unknown or
|
| - // found previously depending on the direction.
|
| - if (!InternalChildCount())
|
| - return word_start_not_found;
|
| -
|
| - const BrowserAccessibility* this_object = this;
|
| - // Standard text fields such as textarea have an embedded div inside them
|
| - // that should be skipped.
|
| - // TODO(nektar): This is fragile. Replace with code that flattens tree.
|
| - if (IsSimpleTextControl() && InternalChildCount() == 1) {
|
| - this_object = InternalGetChild(0);
|
| - }
|
| - int child_start = 0;
|
| - for (size_t i = 0; i < this_object->InternalChildCount(); ++i) {
|
| - BrowserAccessibility* child = this_object->InternalGetChild(i);
|
| - // Child objects are of length one, since they are represented by a
|
| - // single embedded object character. The exception is text-only objects.
|
| - int child_len = 1;
|
| - if (child->IsTextOnlyObject()) {
|
| - child_len = static_cast<int>(child->GetText().length());
|
| - 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;
|
| - }
|
| - }
|
| -
|
| - child_start += child_len;
|
| - if (start >= child_len)
|
| - start -= child_len;
|
| - else
|
| - start = -1;
|
| - }
|
| - return word_start;
|
| - }
|
| -}
|
| -
|
| BrowserAccessibility* BrowserAccessibility::ApproximateHitTest(
|
| const gfx::Point& point) {
|
| // The best result found that's a child of this object.
|
| @@ -1134,10 +943,11 @@ std::vector<int> BrowserAccessibility::GetLineStartOffsets() const {
|
| }
|
|
|
| BrowserAccessibility::AXPlatformPositionInstance
|
| -BrowserAccessibility::CreatePositionAt(int offset) const {
|
| +BrowserAccessibility::CreatePositionAt(int offset,
|
| + ui::AXTextAffinity affinity) const {
|
| DCHECK(manager_);
|
| - return AXPlatformPosition::CreateTextPosition(
|
| - manager_->ax_tree_id(), GetId(), offset, ui::AX_TEXT_AFFINITY_DOWNSTREAM);
|
| + return AXPlatformPosition::CreateTextPosition(manager_->ax_tree_id(), GetId(),
|
| + offset, affinity);
|
| }
|
|
|
| base::string16 BrowserAccessibility::GetInnerText() const {
|
|
|