@@ -32,6 +32,94 @@ describe("Core - UI", () => {
3232 expect ( window . getComputedStyle ( menu ) . display ) . toBe ( "none" ) ;
3333 } ) ;
3434
35+ it ( "resets aria-expanded on pill when menu is closed by clicking outside" , async ( ) => {
36+ const doc = await makeRSDoc ( makeStandardOps ( ) , null , "display: block" ) ;
37+ const pill = doc . getElementById ( "respec-pill" ) ;
38+ const menu = doc . getElementById ( "respec-menu" ) ;
39+
40+ pill . click ( ) ;
41+ await new Promise ( resolve => setTimeout ( resolve ) ) ;
42+ expect ( pill . getAttribute ( "aria-expanded" ) ) . toBe ( "true" ) ;
43+
44+ doc . body . click ( ) ;
45+ await new Promise ( resolve => setTimeout ( resolve ) ) ;
46+ expect ( menu . hidden ) . toBe ( true ) ;
47+ expect ( pill . getAttribute ( "aria-expanded" ) ) . toBe ( "false" ) ;
48+ } ) ;
49+
50+ it ( "closes menu via Escape key and resets aria-expanded" , async ( ) => {
51+ const doc = await makeRSDoc ( makeStandardOps ( ) , null , "display: block" ) ;
52+ const pill = doc . getElementById ( "respec-pill" ) ;
53+ const menu = doc . getElementById ( "respec-menu" ) ;
54+
55+ pill . click ( ) ;
56+ await new Promise ( resolve => setTimeout ( resolve ) ) ;
57+ expect ( menu . hidden ) . toBe ( false ) ;
58+
59+ const escEvent = new doc . defaultView . KeyboardEvent ( "keydown" , {
60+ key : "Escape" ,
61+ bubbles : true ,
62+ } ) ;
63+ menu . dispatchEvent ( escEvent ) ;
64+ await new Promise ( resolve => setTimeout ( resolve ) ) ;
65+ expect ( menu . hidden ) . toBe ( true ) ;
66+ expect ( pill . getAttribute ( "aria-expanded" ) ) . toBe ( "false" ) ;
67+ } ) ;
68+
69+ it ( "moves focus with ArrowDown and ArrowUp keys in menu" , async ( ) => {
70+ const doc = await makeRSDoc ( makeStandardOps ( ) , null , "display: block" ) ;
71+ const ui = doc . defaultView . respecUI ;
72+
73+ const btn1 = ui . addCommand ( "Nav Command 1" , ( ) => { } , null , "" ) ;
74+ const btn2 = ui . addCommand ( "Nav Command 2" , ( ) => { } , null , "" ) ;
75+
76+ doc . getElementById ( "respec-pill" ) . click ( ) ;
77+ await new Promise ( resolve => setTimeout ( resolve ) ) ;
78+
79+ btn1 . focus ( ) ;
80+ const downEvent = new doc . defaultView . KeyboardEvent ( "keydown" , {
81+ key : "ArrowDown" ,
82+ bubbles : true ,
83+ } ) ;
84+ btn1 . dispatchEvent ( downEvent ) ;
85+ expect ( doc . activeElement ) . toBe ( btn2 ) ;
86+
87+ const upEvent = new doc . defaultView . KeyboardEvent ( "keydown" , {
88+ key : "ArrowUp" ,
89+ bubbles : true ,
90+ } ) ;
91+ btn2 . dispatchEvent ( upEvent ) ;
92+ expect ( doc . activeElement ) . toBe ( btn1 ) ;
93+ } ) ;
94+
95+ it ( "moves focus to first/last item with Home/End keys in menu" , async ( ) => {
96+ const doc = await makeRSDoc ( makeStandardOps ( ) , null , "display: block" ) ;
97+ const ui = doc . defaultView . respecUI ;
98+
99+ const btn1 = ui . addCommand ( "Home End Cmd A" , ( ) => { } , null , "" ) ;
100+ const btn2 = ui . addCommand ( "Home End Cmd B" , ( ) => { } , null , "" ) ;
101+ const btn3 = ui . addCommand ( "Home End Cmd C" , ( ) => { } , null , "" ) ;
102+
103+ doc . getElementById ( "respec-pill" ) . click ( ) ;
104+ await new Promise ( resolve => setTimeout ( resolve ) ) ;
105+
106+ btn2 . focus ( ) ;
107+ const homeEvent = new doc . defaultView . KeyboardEvent ( "keydown" , {
108+ key : "Home" ,
109+ bubbles : true ,
110+ } ) ;
111+ btn2 . dispatchEvent ( homeEvent ) ;
112+ expect ( doc . activeElement ) . toBe ( btn1 ) ;
113+
114+ btn2 . focus ( ) ;
115+ const endEvent = new doc . defaultView . KeyboardEvent ( "keydown" , {
116+ key : "End" ,
117+ bubbles : true ,
118+ } ) ;
119+ btn2 . dispatchEvent ( endEvent ) ;
120+ expect ( doc . activeElement ) . toBe ( btn3 ) ;
121+ } ) ;
122+
35123 it ( "shows errors" , async ( ) => {
36124 const doc = await makeRSDoc ( makeStandardOps ( { group : "webapps" } ) ) ;
37125 const ui = doc . defaultView . respecUI ;
0 commit comments