@@ -34,6 +34,7 @@ import {
34
34
} from '@open-wc/testing' ;
35
35
import { sendKeys } from '@web/test-runner-commands' ;
36
36
import {
37
+ clickAndHoverTarget ,
37
38
definedOverlayElement ,
38
39
virtualElement ,
39
40
} from '../stories/overlay.stories' ;
@@ -50,6 +51,9 @@ import {
50
51
isOnTopLayer ,
51
52
} from '../../../test/testing-helpers.js' ;
52
53
import { Menu } from '@spectrum-web-components/menu' ;
54
+ import { Button } from '@spectrum-web-components/button' ;
55
+ import { isWebKit } from '@spectrum-web-components/shared' ;
56
+ import { SAFARI_FOCUS_RING_CLASS } from '@spectrum-web-components/overlay/src/InteractionController.js' ;
53
57
54
58
async function styledFixture < T extends Element > (
55
59
story : TemplateResult
@@ -786,6 +790,74 @@ describe('Overlay - type="modal"', () => {
786
790
await close ;
787
791
expect ( el . open ) . to . be . null ;
788
792
} ) ;
793
+
794
+ describe . only ( 'maintains consistency of focus ring in different browsers' , ( ) => {
795
+ it ( 'should not open hover overlay right after closing the click overlay using the mouse' , async ( ) => {
796
+ const overlayTrigger = await fixture < OverlayTrigger > (
797
+ clickAndHoverTarget ( )
798
+ ) ;
799
+
800
+ await elementUpdated ( overlayTrigger ) ;
801
+ expect ( overlayTrigger . open ) . to . be . undefined ;
802
+
803
+ const trigger = overlayTrigger . querySelector (
804
+ 'sp-button[slot="trigger"]'
805
+ ) as Button ;
806
+
807
+ const opened = oneEvent ( trigger , 'sp-opened' ) ;
808
+ trigger . click ( ) ;
809
+ await opened ;
810
+
811
+ expect ( overlayTrigger . open ) . to . equal ( 'click' ) ;
812
+
813
+ const closed = oneEvent ( trigger , 'sp-closed' ) ;
814
+ sendMouse ( {
815
+ steps : [
816
+ {
817
+ type : 'click' ,
818
+ position : [ 1 , 1 ] ,
819
+ } ,
820
+ ] ,
821
+ } ) ;
822
+ await closed ;
823
+
824
+ expect ( overlayTrigger . open ) . to . be . undefined ;
825
+ expect ( document . activeElement === trigger , 'trigger focused' ) . to . be
826
+ . true ;
827
+ if ( isWebKit ( ) )
828
+ expect ( trigger . classList . contains ( SAFARI_FOCUS_RING_CLASS ) ) . to
829
+ . be . true ;
830
+ } ) ;
831
+
832
+ it ( 'should not open hover overlay right after closing the click overlay using the keyboard' , async ( ) => {
833
+ const overlayTrigger = await fixture < OverlayTrigger > (
834
+ clickAndHoverTarget ( )
835
+ ) ;
836
+
837
+ const trigger = overlayTrigger . querySelector (
838
+ 'sp-button[slot="trigger"]'
839
+ ) as Button ;
840
+
841
+ const opened = oneEvent ( trigger , 'sp-opened' ) ;
842
+ trigger . click ( ) ;
843
+ await opened ;
844
+
845
+ expect ( overlayTrigger . open ) . to . equal ( 'click' ) ;
846
+
847
+ const closed = oneEvent ( trigger , 'sp-closed' ) ;
848
+ sendKeys ( {
849
+ press : 'Escape' ,
850
+ } ) ;
851
+ await closed ;
852
+
853
+ expect ( overlayTrigger . open ) . to . be . undefined ;
854
+ expect ( document . activeElement === trigger , 'trigger focused' ) . to . be
855
+ . true ;
856
+ if ( isWebKit ( ) )
857
+ expect ( trigger . classList . contains ( SAFARI_FOCUS_RING_CLASS ) ) . to
858
+ . be . true ;
859
+ } ) ;
860
+ } ) ;
789
861
} ) ;
790
862
describe ( 'Overlay - timing' , ( ) => {
791
863
it ( 'manages multiple modals in a row without preventing them from closing' , async ( ) => {
0 commit comments