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

+53
View File
@@ -753,3 +753,56 @@ func TestStickyBrowserModeSurvivesNavigationChromeAndWindowSuspension(t *testing
}
}
}
func TestStructuralNavigationAutomaticFocus(t *testing.T) {
for _, tc := range []struct {
name, role string
enabled bool
origin review.NavigationOrigin
sticky, want review.DocumentMode
}{
{name: "default entry", role: "entry", want: review.BrowseMode},
{name: "entry opt in", role: "entry", enabled: true, want: review.FocusMode},
{name: "combo opt in", role: "combo box", enabled: true, want: review.FocusMode},
{name: "heading stays browse", role: "heading", enabled: true, want: review.BrowseMode},
{name: "link stays browse", role: "link", enabled: true, want: review.BrowseMode},
{name: "sticky browse", role: "entry", enabled: true, sticky: review.BrowseMode, want: review.BrowseMode},
{name: "sticky focus", role: "heading", enabled: true, sticky: review.FocusMode, want: review.FocusMode},
{name: "caret unchanged", role: "entry", enabled: true, origin: review.CaretNavigation, want: review.BrowseMode},
} {
t.Run(tc.name, func(t *testing.T) {
keys := &modeKeys{}
browser := newBrowserModeController(nil, keys, nil)
browser.settings = func() review.ModeSettings {
settings := review.DefaultModeSettings()
settings.StructuralTriggersFocus = tc.enabled
return settings
}
owner := modeContext(t, tc.role, false)
browser.stickyModes[owner.TopLevel.ID().BusName] = tc.sticky
origin := tc.origin
if origin == review.NativeNavigation {
origin = review.StructuralNavigation
}
result := review.Result{DocumentPosition: review.DocumentPosition{Document: owner.TopLevel, Snapshot: owner.Ancestors[0], Origin: origin}, DocumentCaretContext: owner.Ancestors}
queue := &fakeSpeechQueue{spoken: make(chan string, 4)}
browser.navigated(result.DocumentPosition, owner.TopLevel.ID())
browser.navigationMode(result, queue)
if browser.mode != tc.want || keys.enabled != (tc.want == review.BrowseMode) {
t.Fatalf("mode=%v browse keys=%t, want %v", browser.mode, keys.enabled, tc.want)
}
if tc.want == review.FocusMode && tc.sticky == review.InactiveMode {
select {
case message := <-queue.spoken:
if message != "Focus mode" {
t.Fatalf("announcement=%q", message)
}
default:
t.Fatal("missing focus mode announcement")
}
} else if len(queue.spoken) != 0 {
t.Fatal("unnecessary mode announcement")
}
})
}
}