Add autofocus mode.

This commit is contained in:
Storm Dragon committed 2026-10-28 22:06:04 -04:00
1 parent b232c1eebb
commit 3e2429b8a5
19 files changed
+279 -8

No files matched your search

+73
View File
@@ -482,6 +482,14 @@ func (queue *readAllProbeQueue) Enqueue(request speechRequest) {
}
func TestNativeBrowserModes(t *testing.T) {
testNativeBrowserModes(t, false)
}
func TestNativeBrowserStructuralFocus(t *testing.T) {
testNativeBrowserModes(t, true)
}
func testNativeBrowserModes(t *testing.T, structuralFocus bool) {
if os.Getenv("CTHULHU_NATIVE_BROWSER") != "1" {
t.Skip("requires private browser session")
}
@@ -519,6 +527,13 @@ func TestNativeBrowserModes(t *testing.T) {
}
defer worker.Stop(context.Background())
browser := newBrowserModeController(listener, commands, adapter)
var automaticFocus atomic.Bool
automaticFocus.Store(structuralFocus)
browser.settings = func() review.ModeSettings {
settings := review.DefaultModeSettings()
settings.StructuralTriggersFocus = automaticFocus.Load()
return settings
}
if err = browser.Start(ctx); err != nil {
t.Fatal(err)
}
@@ -750,6 +765,64 @@ func TestNativeBrowserModes(t *testing.T) {
t.Fatal("could not focus first document heading after reload")
}
browseReady()
if structuralFocus {
keys("h")
wait("Reading section, heading level 2")
browseReady()
keys("e")
waitPrefix("Display name")
wait("Focus mode")
if commands.BrowseNavigationEnabled() {
t.Fatal("automatic focus retained browse keys")
}
keys("h")
wait("h")
tree, err := adapter.CaptureDocument(ctx, worker.Focus())
if err != nil {
t.Fatal(err)
}
ref, err := tree.Reference(worker.Focus())
if err != nil {
t.Fatal(err)
}
document, err := tree.Document(ctx, ref)
if err != nil {
t.Fatal(err)
}
typedInEntry := false
for _, node := range document.Nodes {
if node.Snapshot.Name == "Display name" && node.Snapshot.Role == "entry" {
entry, err := tree.Reference(node.Snapshot.ID())
if err != nil {
t.Fatal(err)
}
// Captured document text can predate the edit. Read the native
// field directly to prove delivery rather than key echo alone.
text, err := adapter.ReadDocumentCaret(ctx, entry, 0, atspi.DocumentCaretLine)
if err != nil {
t.Fatal(err)
}
typedInEntry = text.Text == "h"
}
}
if !typedInEntry {
t.Fatal("typing did not reach the structurally selected entry")
}
keys("Insert+a")
wait("Browse mode")
browseReady()
keys("h")
wait("Ordinary unfocusable heading, heading level 2")
browseReady()
automaticFocus.Store(false)
keys("shift+e")
waitPrefix("Secret")
browseReady()
keys("shift+e")
waitPrefix("Display name")
browseReady()
return
}
keys("h")
wait("Reading section, heading level 2")
if err := worker.ReadFlat(review.Line, 0); err != nil {