Commit f8e7c20d authored by Kevin Babbitt's avatar Kevin Babbitt Committed by Commit Bot

Use tree positions for CreatePositionAt{Start,End}OfDocument

Narrator frequently calls ExpandToEnclosingUnit() for page or document
units when moving by words. This call was accounting for a sizable
fraction of each movement step, and about 56% of it was spent creating
the start and end positions. Switching to tree positions to find them
eliminates almost all of that cost.

Bug: 928948
Change-Id: I447aae5f089a27d041c2b173b16bf40629cb64ca
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1745547
Commit-Queue: Nektarios Paisios <nektar@chromium.org>
Reviewed-by: default avatarKurt Catti-Schmidt <kschmi@microsoft.com>
Reviewed-by: default avatarNektarios Paisios <nektar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#686426}
parent 5b33398e
...@@ -863,41 +863,29 @@ class AXPosition { ...@@ -863,41 +863,29 @@ class AXPosition {
} }
AXPositionInstance CreatePositionAtStartOfDocument() const { AXPositionInstance CreatePositionAtStartOfDocument() const {
if (IsNullPosition()) AXPositionInstance position =
return CreateNullPosition(); AsTreePosition()->CreateDocumentAncestorPosition();
if (!position->IsNullPosition()) {
AXPositionInstance iterator = Clone(); position = position->CreatePositionAtStartOfAnchor();
while (!iterator->IsNullPosition()) { if (IsTextPosition())
if (IsDocument(iterator->GetRole()) && position = position->AsTextPosition();
iterator->CreateParentPosition()->IsNullPosition()) {
return iterator->CreatePositionAtStartOfAnchor();
}
iterator = iterator->CreateParentPosition();
} }
return CreateNullPosition(); return position;
} }
AXPositionInstance CreatePositionAtEndOfDocument() const { AXPositionInstance CreatePositionAtEndOfDocument() const {
if (IsNullPosition()) AXPositionInstance position =
return CreateNullPosition(); AsTreePosition()->CreateDocumentAncestorPosition();
if (!position->IsNullPosition()) {
AXPositionInstance iterator = Clone(); while (position->AnchorChildCount()) {
while (!iterator->IsNullPosition()) { position =
if (IsDocument(iterator->GetRole()) && position->CreateChildPositionAt(position->AnchorChildCount() - 1);
iterator->CreateParentPosition()->IsNullPosition()) {
AXPositionInstance tree_position = iterator->AsTreePosition();
DCHECK(tree_position);
while (tree_position->AnchorChildCount()) {
tree_position = tree_position->CreateChildPositionAt(
tree_position->AnchorChildCount() - 1);
}
iterator =
tree_position->AsLeafTextPosition()->CreatePositionAtEndOfAnchor();
return iterator;
} }
iterator = iterator->CreateParentPosition(); position = position->CreatePositionAtEndOfAnchor();
if (IsTextPosition())
position = position->AsTextPosition();
} }
return CreateNullPosition(); return position;
} }
AXPositionInstance CreateChildPositionAt(int child_index) const { AXPositionInstance CreateChildPositionAt(int child_index) const {
...@@ -2382,6 +2370,18 @@ class AXPosition { ...@@ -2382,6 +2370,18 @@ class AXPosition {
return false; return false;
} }
AXPositionInstance CreateDocumentAncestorPosition() const {
AXPositionInstance iterator = Clone();
while (!iterator->IsNullPosition()) {
if (IsDocument(iterator->GetRole()) &&
iterator->CreateParentPosition()->IsNullPosition()) {
break;
}
iterator = iterator->CreateParentPosition();
}
return iterator;
}
AXPositionKind kind_; AXPositionKind kind_;
AXTreeID tree_id_; AXTreeID tree_id_;
int32_t anchor_id_; int32_t anchor_id_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment