@@ -12,7 +12,7 @@ describe('menu', () => {
1212 page . trigger ( ) . click ( ) ;
1313
1414 page . expectMenuPresent ( true ) ;
15- expect ( page . menu ( ) . getText ( ) ) . toEqual ( "One\nTwo\nThree" ) ;
15+ expect ( page . menu ( ) . getText ( ) ) . toEqual ( "One\nTwo\nThree\nFour " ) ;
1616 } ) ;
1717
1818 it ( 'should close menu when area outside menu is clicked' , ( ) => {
@@ -45,14 +45,14 @@ describe('menu', () => {
4545
4646 it ( 'should support multiple triggers opening the same menu' , ( ) => {
4747 page . triggerTwo ( ) . click ( ) ;
48- expect ( page . menu ( ) . getText ( ) ) . toEqual ( "One\nTwo\nThree" ) ;
48+ expect ( page . menu ( ) . getText ( ) ) . toEqual ( "One\nTwo\nThree\nFour " ) ;
4949 page . expectMenuAlignedWith ( page . menu ( ) , 'trigger-two' ) ;
5050
5151 page . body ( ) . click ( ) ;
5252 page . expectMenuPresent ( false ) ;
5353
5454 page . trigger ( ) . click ( ) ;
55- expect ( page . menu ( ) . getText ( ) ) . toEqual ( "One\nTwo\nThree" ) ;
55+ expect ( page . menu ( ) . getText ( ) ) . toEqual ( "One\nTwo\nThree\nFour " ) ;
5656 page . expectMenuAlignedWith ( page . menu ( ) , 'trigger' ) ;
5757
5858 page . body ( ) . click ( ) ;
@@ -66,6 +66,137 @@ describe('menu', () => {
6666 } ) ;
6767 } ) ;
6868
69+ describe ( 'keyboard events' , ( ) => {
70+ beforeEach ( ( ) => {
71+ // click start button to avoid tabbing past navigation
72+ page . start ( ) . click ( ) ;
73+ page . pressKey ( protractor . Key . TAB ) ;
74+ } ) ;
75+
76+ it ( 'should auto-focus the first item when opened with keyboard' , ( ) => {
77+ page . pressKey ( protractor . Key . ENTER ) ;
78+ page . expectFocusOn ( page . items ( 0 ) ) ;
79+ } ) ;
80+
81+ it ( 'should not focus the first item when opened with mouse' , ( ) => {
82+ page . trigger ( ) . click ( ) ;
83+ page . expectFocusOn ( page . trigger ( ) ) ;
84+ } ) ;
85+
86+ it ( 'should focus subsequent items when down arrow is pressed' , ( ) => {
87+ page . pressKey ( protractor . Key . ENTER ) ;
88+ page . pressKey ( protractor . Key . DOWN ) ;
89+ page . expectFocusOn ( page . items ( 1 ) ) ;
90+ } ) ;
91+
92+ it ( 'should focus previous items when up arrow is pressed' , ( ) => {
93+ page . pressKey ( protractor . Key . ENTER ) ;
94+ page . pressKey ( protractor . Key . DOWN ) ;
95+ page . pressKey ( protractor . Key . UP ) ;
96+ page . expectFocusOn ( page . items ( 0 ) ) ;
97+ } ) ;
98+
99+ it ( 'should focus subsequent items when tab is pressed' , ( ) => {
100+ page . pressKey ( protractor . Key . ENTER ) ;
101+ page . pressKey ( protractor . Key . TAB ) ;
102+ page . expectFocusOn ( page . items ( 1 ) ) ;
103+ } ) ;
104+
105+ it ( 'should focus previous items when shift-tab is pressed' , ( ) => {
106+ page . pressKey ( protractor . Key . ENTER ) ;
107+ page . pressKey ( protractor . Key . TAB ) ;
108+ // need a protractor "chord" to hit shift-tab simultaneously
109+ page . pressKey ( protractor . Key . chord ( protractor . Key . SHIFT , protractor . Key . TAB ) ) ;
110+ page . expectFocusOn ( page . items ( 0 ) ) ;
111+ } ) ;
112+
113+ it ( 'should handle a mix of tabs and arrow presses' , ( ) => {
114+ page . pressKey ( protractor . Key . ENTER ) ;
115+ page . pressKey ( protractor . Key . TAB ) ;
116+ page . pressKey ( protractor . Key . UP ) ;
117+ page . expectFocusOn ( page . items ( 0 ) ) ;
118+
119+ page . pressKey ( protractor . Key . DOWN ) ;
120+ page . pressKey ( protractor . Key . chord ( protractor . Key . SHIFT , protractor . Key . TAB ) ) ;
121+ page . expectFocusOn ( page . items ( 0 ) ) ;
122+ } ) ;
123+
124+ it ( 'should skip disabled items using arrow keys' , ( ) => {
125+ page . pressKey ( protractor . Key . ENTER ) ;
126+ page . pressKey ( protractor . Key . DOWN ) ;
127+ page . pressKey ( protractor . Key . DOWN ) ;
128+ page . expectFocusOn ( page . items ( 3 ) ) ;
129+
130+ page . pressKey ( protractor . Key . UP ) ;
131+ page . expectFocusOn ( page . items ( 1 ) ) ;
132+ } ) ;
133+
134+ it ( 'should skip disabled items using tabs' , ( ) => {
135+ page . pressKey ( protractor . Key . ENTER ) ;
136+ page . pressKey ( protractor . Key . TAB ) ;
137+ page . pressKey ( protractor . Key . TAB ) ;
138+ page . expectFocusOn ( page . items ( 3 ) ) ;
139+
140+ page . pressKey ( protractor . Key . chord ( protractor . Key . SHIFT , protractor . Key . TAB ) ) ;
141+ page . expectFocusOn ( page . items ( 1 ) ) ;
142+ } ) ;
143+
144+ it ( 'should close the menu when tabbing past items' , ( ) => {
145+ page . pressKey ( protractor . Key . ENTER ) ;
146+ page . pressKey ( protractor . Key . TAB ) ;
147+ page . pressKey ( protractor . Key . TAB ) ;
148+ page . pressKey ( protractor . Key . TAB ) ;
149+ page . expectMenuPresent ( false ) ;
150+
151+ page . start ( ) . click ( ) ;
152+ page . pressKey ( protractor . Key . TAB ) ;
153+ page . pressKey ( protractor . Key . ENTER ) ;
154+ page . pressKey ( protractor . Key . chord ( protractor . Key . SHIFT , protractor . Key . TAB ) ) ;
155+ page . expectMenuPresent ( false ) ;
156+ } ) ;
157+
158+ it ( 'should close the menu when arrow keying past items' , ( ) => {
159+ page . pressKey ( protractor . Key . ENTER ) ;
160+ page . pressKey ( protractor . Key . DOWN ) ;
161+ page . pressKey ( protractor . Key . DOWN ) ;
162+ page . pressKey ( protractor . Key . DOWN ) ;
163+ page . expectMenuPresent ( false ) ;
164+
165+ page . start ( ) . click ( ) ;
166+ page . pressKey ( protractor . Key . TAB ) ;
167+ page . pressKey ( protractor . Key . ENTER ) ;
168+ page . pressKey ( protractor . Key . UP ) ;
169+ page . expectMenuPresent ( false ) ;
170+ } ) ;
171+
172+ it ( 'should focus before and after trigger when tabbing past items' , ( ) => {
173+ page . pressKey ( protractor . Key . ENTER ) ;
174+ page . pressKey ( protractor . Key . TAB ) ;
175+ page . pressKey ( protractor . Key . TAB ) ;
176+ page . pressKey ( protractor . Key . TAB ) ;
177+ page . expectFocusOn ( page . triggerTwo ( ) ) ;
178+
179+ // navigate back to trigger
180+ page . pressKey ( protractor . Key . chord ( protractor . Key . SHIFT , protractor . Key . TAB ) ) ;
181+ page . pressKey ( protractor . Key . ENTER ) ;
182+
183+ page . pressKey ( protractor . Key . chord ( protractor . Key . SHIFT , protractor . Key . TAB ) ) ;
184+ page . expectFocusOn ( page . start ( ) ) ;
185+ } ) ;
186+
187+ it ( 'should focus on trigger when arrow keying past items' , ( ) => {
188+ page . pressKey ( protractor . Key . ENTER ) ;
189+ page . pressKey ( protractor . Key . DOWN ) ;
190+ page . pressKey ( protractor . Key . DOWN ) ;
191+ page . pressKey ( protractor . Key . DOWN ) ;
192+ page . expectFocusOn ( page . trigger ( ) ) ;
193+
194+ page . pressKey ( protractor . Key . ENTER ) ;
195+ page . pressKey ( protractor . Key . UP ) ;
196+ page . expectFocusOn ( page . trigger ( ) ) ;
197+ } ) ;
198+ } ) ;
199+
69200 describe ( 'position - ' , ( ) => {
70201
71202 it ( 'should default menu alignment to "after below" when not set' , ( ) => {
0 commit comments