@@ -12,6 +12,21 @@ function waitForThumbnailVisible(page, pageNum) {
1212 ) ;
1313}
1414
15+ async function waitForMenu ( page , buttonSelector , visible = true ) {
16+ return page . waitForFunction (
17+ ( selector , vis ) => {
18+ const button = document . querySelector ( selector ) ;
19+ if ( ! button ) {
20+ return false ;
21+ }
22+ return button . getAttribute ( "aria-expanded" ) === ( vis ? "true" : "false" ) ;
23+ } ,
24+ { } ,
25+ buttonSelector ,
26+ visible
27+ ) ;
28+ }
29+
1530describe ( "PDF Thumbnail View" , ( ) => {
1631 describe ( "Works without errors" , ( ) => {
1732 let pages ;
@@ -201,4 +216,105 @@ describe("PDF Thumbnail View", () => {
201216 ) ;
202217 } ) ;
203218 } ) ;
219+
220+ describe ( "The manage dropdown menu" , ( ) => {
221+ let pages ;
222+
223+ beforeEach ( async ( ) => {
224+ pages = await loadAndWait (
225+ "tracemonkey.pdf" ,
226+ "#viewsManagerToggleButton" ,
227+ null ,
228+ null ,
229+ { enableSplitMerge : true }
230+ ) ;
231+ } ) ;
232+
233+ afterEach ( async ( ) => {
234+ await closePages ( pages ) ;
235+ } ) ;
236+
237+ async function enableMenuItems ( page ) {
238+ await page . evaluate ( ( ) => {
239+ document
240+ . querySelectorAll ( "#viewsManagerStatusActionOptions button" )
241+ . forEach ( button => {
242+ button . disabled = false ;
243+ } ) ;
244+ } ) ;
245+ }
246+
247+ it ( "should open with Enter key and remain open" , async ( ) => {
248+ await Promise . all (
249+ pages . map ( async ( [ browserName , page ] ) => {
250+ await page . click ( "#viewsManagerToggleButton" ) ;
251+ await waitForThumbnailVisible ( page , 1 ) ;
252+
253+ await enableMenuItems ( page ) ;
254+
255+ // Focus the manage button
256+ await kbFocusNext ( page ) ;
257+ await kbFocusNext ( page ) ;
258+ await page . waitForSelector ( "#viewsManagerStatusActionButton:focus" , {
259+ visible : true ,
260+ } ) ;
261+
262+ // Press Enter to open the menu
263+ await page . keyboard . press ( "Enter" ) ;
264+
265+ await waitForMenu ( page , "#viewsManagerStatusActionButton" ) ;
266+
267+ // Verify first menu item can be focused
268+ await page . waitForSelector ( "#viewsManagerStatusActionCopy:focus" , {
269+ visible : true ,
270+ } ) ;
271+
272+ // Close menu with Escape
273+ await page . keyboard . press ( "Escape" ) ;
274+ await waitForMenu ( page , "#viewsManagerStatusActionButton" , false ) ;
275+ } )
276+ ) ;
277+ } ) ;
278+
279+ it ( "should open with Space key and remain open" , async ( ) => {
280+ await Promise . all (
281+ pages . map ( async ( [ browserName , page ] ) => {
282+ await page . click ( "#viewsManagerToggleButton" ) ;
283+ await waitForThumbnailVisible ( page , 1 ) ;
284+
285+ await enableMenuItems ( page ) ;
286+
287+ // Focus the manage button
288+ await kbFocusNext ( page ) ;
289+ await kbFocusNext ( page ) ;
290+ await page . waitForSelector ( "#viewsManagerStatusActionButton:focus" , {
291+ visible : true ,
292+ } ) ;
293+
294+ // Press Space to open the menu
295+ await page . keyboard . press ( " " ) ;
296+
297+ await waitForMenu ( page , "#viewsManagerStatusActionButton" ) ;
298+
299+ // Verify first menu item can be focused
300+ await page . waitForSelector ( "#viewsManagerStatusActionCopy:focus" , {
301+ visible : true ,
302+ } ) ;
303+
304+ // Navigate menu items with arrow keys
305+ await page . keyboard . press ( "ArrowDown" ) ;
306+ await page . waitForSelector ( "#viewsManagerStatusActionCut:focus" , {
307+ visible : true ,
308+ } ) ;
309+
310+ // Menu should still be open
311+ await waitForMenu ( page , "#viewsManagerStatusActionButton" ) ;
312+
313+ // Close menu with Escape
314+ await page . keyboard . press ( "Escape" ) ;
315+ await waitForMenu ( page , "#viewsManagerStatusActionButton" , false ) ;
316+ } )
317+ ) ;
318+ } ) ;
319+ } ) ;
204320} ) ;
0 commit comments