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 {
}
AXPositionInstance CreatePositionAtStartOfDocument() const {
if (IsNullPosition())
return CreateNullPosition();
AXPositionInstance iterator = Clone();
while (!iterator->IsNullPosition()) {
if (IsDocument(iterator->GetRole()) &&
iterator->CreateParentPosition()->IsNullPosition()) {
return iterator->CreatePositionAtStartOfAnchor();
}
iterator = iterator->CreateParentPosition();
AXPositionInstance position =
AsTreePosition()->CreateDocumentAncestorPosition();
if (!position->IsNullPosition()) {
position = position->CreatePositionAtStartOfAnchor();
if (IsTextPosition())
position = position->AsTextPosition();
}
return CreateNullPosition();
return position;
}
AXPositionInstance CreatePositionAtEndOfDocument() const {
if (IsNullPosition())
return CreateNullPosition();
AXPositionInstance iterator = Clone();
while (!iterator->IsNullPosition()) {
if (IsDocument(iterator->GetRole()) &&
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;
AXPositionInstance position =
AsTreePosition()->CreateDocumentAncestorPosition();
if (!position->IsNullPosition()) {
while (position->AnchorChildCount()) {
position =
position->CreateChildPositionAt(position->AnchorChildCount() - 1);
}
iterator = iterator->CreateParentPosition();
position = position->CreatePositionAtEndOfAnchor();
if (IsTextPosition())
position = position->AsTextPosition();
}
return CreateNullPosition();
return position;
}
AXPositionInstance CreateChildPositionAt(int child_index) const {
......@@ -2382,6 +2370,18 @@ class AXPosition {
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_;
AXTreeID tree_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