@@ -350,6 +350,54 @@ describe('details-menu element', function() {
350
350
} )
351
351
} )
352
352
353
+ describe ( 'with labels as menu item with indeterminate checkboxes' , function ( ) {
354
+ beforeEach ( function ( ) {
355
+ const container = document . createElement ( 'div' )
356
+ container . innerHTML = `
357
+ <details>
358
+ <summary>Click</summary>
359
+ <details-menu>
360
+ <label tabindex="0" role="menuitemcheckbox" aria-checked="false"><input type="checkbox" name="robot"> Hubot</label>
361
+ <label tabindex="0" role="menuitemcheckbox" aria-checked="true"><input type="checkbox" name="robot" checked> Bender</label>
362
+ <label tabindex="0" role="menuitemcheckbox" aria-checked="false"><input type="checkbox" name="robot"> BB-8</label>
363
+ </details-menu>
364
+ </details>
365
+ `
366
+ document . body . append ( container )
367
+ } )
368
+
369
+ afterEach ( function ( ) {
370
+ document . body . innerHTML = ''
371
+ } )
372
+
373
+ it ( 'manages checked state and fires events' , function ( ) {
374
+ const details = document . querySelector ( 'details' )
375
+ const summary = document . querySelector ( 'summary' )
376
+ const item = details . querySelector ( 'label' )
377
+ const input = item . querySelector ( 'input' )
378
+ let eventCounter = 0
379
+ document . addEventListener ( 'details-menu-selected' , ( ) => eventCounter ++ , true )
380
+
381
+ input . indeterminate = true
382
+ input . dispatchEvent ( new Event ( 'change' , { bubbles : true } ) )
383
+
384
+ summary . dispatchEvent ( new MouseEvent ( 'click' , { bubbles : true } ) )
385
+ assert ( details . open , 'menu opens' )
386
+ assert . equal ( item . getAttribute ( 'aria-checked' ) , 'mixed' )
387
+
388
+ item . dispatchEvent ( new MouseEvent ( 'click' , { bubbles : true } ) )
389
+ assert ( details . open , 'menu stays open' )
390
+ assert . equal ( item . getAttribute ( 'aria-checked' ) , 'true' )
391
+ assert . equal ( details . querySelectorAll ( '[aria-checked="true"]' ) . length , 2 )
392
+
393
+ item . dispatchEvent ( new MouseEvent ( 'click' , { bubbles : true } ) )
394
+ assert . equal ( item . getAttribute ( 'aria-checked' ) , 'false' )
395
+ assert . equal ( details . querySelectorAll ( '[aria-checked="true"]' ) . length , 1 )
396
+
397
+ assert . equal ( eventCounter , 3 , 'selected event is fired three times' )
398
+ } )
399
+ } )
400
+
353
401
describe ( 'with no valid menu items' , function ( ) {
354
402
beforeEach ( function ( ) {
355
403
const container = document . createElement ( 'div' )
0 commit comments