Add autofocus mode.
This commit is contained in:
1 parent
b232c1eebb
commit
3e2429b8a5
19 files changed
+279
-8
No files matched your search
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user