@@ -314,14 +314,22 @@ class Popover extends PopoverPositionMixin(
314314 observer : '__openedChanged' ,
315315 } ,
316316
317+ /**
318+ * The `role` attribute value to be set on the popover.
319+ * When not specified, defaults to 'dialog'.
320+ */
321+ role : {
322+ type : String ,
323+ reflectToAttribute : true ,
324+ } ,
325+
317326 /**
318327 * The `role` attribute value to be set on the overlay.
319328 *
320329 * @attr {string} overlay-role
321330 */
322331 overlayRole : {
323332 type : String ,
324- value : 'dialog' ,
325333 } ,
326334
327335 /**
@@ -413,7 +421,7 @@ class Popover extends PopoverPositionMixin(
413421 }
414422
415423 static get observers ( ) {
416- return [ '__sizeChanged(width, height, _overlayElement)' , '__updateAriaAttributes(opened, overlayRole , target)' ] ;
424+ return [ '__sizeChanged(width, height, _overlayElement)' , '__updateAriaAttributes(opened, role , target)' ] ;
417425 }
418426
419427 /**
@@ -520,15 +528,24 @@ class Popover extends PopoverPositionMixin(
520528 super . ready ( ) ;
521529
522530 this . _overlayElement = this . $ . overlay ;
531+
532+ if ( ! this . hasAttribute ( 'role' ) ) {
533+ this . role = 'dialog' ;
534+ }
523535 }
524536
525537 /** @protected */
526- updated ( props ) {
527- super . updated ( props ) ;
538+ willUpdate ( props ) {
539+ super . willUpdate ( props ) ;
528540
529541 if ( props . has ( 'overlayRole' ) ) {
530- this . setAttribute ( ' role' , this . overlayRole ) ;
542+ this . role = this . overlayRole ;
531543 }
544+ }
545+
546+ /** @protected */
547+ updated ( props ) {
548+ super . updated ( props ) ;
532549
533550 if ( props . has ( 'accessibleName' ) ) {
534551 if ( this . accessibleName ) {
@@ -610,7 +627,7 @@ class Popover extends PopoverPositionMixin(
610627 }
611628
612629 /** @private */
613- __updateAriaAttributes ( opened , overlayRole , target ) {
630+ __updateAriaAttributes ( opened , role , target ) {
614631 if ( this . __oldTarget ) {
615632 const oldEffectiveTarget = this . __oldTarget . ariaTarget || this . __oldTarget ;
616633 oldEffectiveTarget . removeAttribute ( 'aria-haspopup' ) ;
@@ -621,7 +638,7 @@ class Popover extends PopoverPositionMixin(
621638 if ( target ) {
622639 const effectiveTarget = target . ariaTarget || target ;
623640
624- const isDialog = overlayRole === 'dialog' || overlayRole === 'alertdialog' ;
641+ const isDialog = role === 'dialog' || role === 'alertdialog' ;
625642 effectiveTarget . setAttribute ( 'aria-haspopup' , isDialog ? 'dialog' : 'true' ) ;
626643
627644 effectiveTarget . setAttribute ( 'aria-expanded' , opened ? 'true' : 'false' ) ;
0 commit comments