38 lines
1.2 KiB
Go
38 lines
1.2 KiB
Go
// Copyright (c) 2026 Storm Dragon
|
|
// Authors: Storm Dragon, Angus Kola
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package atspi
|
|
|
|
// Chromium can echo a static text caret on its enclosing label/paragraph.
|
|
// Include only a single-child chain sharing the complete text offset domain.
|
|
// Composite parents have their own hypertext offsets and cannot be matched.
|
|
func documentCaretEchoAncestors(tree *AccessibleTree, reference ObjectReference) []ObjectID {
|
|
var ids []ObjectID
|
|
child, err := tree.Resolve(reference)
|
|
if err != nil || child.CharacterCount <= 0 {
|
|
return nil
|
|
}
|
|
for attempts := 0; attempts < maxTreeNodes; attempts++ {
|
|
parent, ok, err := tree.Parent(reference)
|
|
if err != nil || !ok {
|
|
break
|
|
}
|
|
snapshot, err := tree.Resolve(parent)
|
|
if err != nil || IsWebDocumentRole(snapshot.Role) || snapshot.Editable || snapshot.CharacterCount != child.CharacterCount {
|
|
break
|
|
}
|
|
first, ok, err := tree.FirstChild(parent)
|
|
if err != nil || !ok || first != reference {
|
|
break
|
|
}
|
|
last, ok, err := tree.LastChild(parent)
|
|
if err != nil || !ok || last != reference {
|
|
break
|
|
}
|
|
ids = append(ids, parent.ID())
|
|
reference, child = parent, snapshot
|
|
}
|
|
return ids
|
|
}
|