@@ -741,6 +741,80 @@ describe('Hoverifier', () => {
741741 }
742742 } )
743743
744+ it ( 'keeps the overlay open when the mouse briefly moves over another token on the way to the overlay' , ( ) => {
745+ for ( const codeView of testcases ) {
746+ const scheduler = new TestScheduler ( ( a , b ) => chai . assert . deepEqual ( a , b ) )
747+
748+ const hover = { }
749+
750+ scheduler . run ( ( { cold, expectObservable } ) => {
751+ const hoverOverlayElement = document . createElement ( 'div' )
752+
753+ const hoverifier = createHoverifier ( {
754+ closeButtonClicks : new Observable < MouseEvent > ( ) ,
755+ hoverOverlayElements : of ( hoverOverlayElement ) ,
756+ hoverOverlayRerenders : EMPTY ,
757+ getHover : createStubHoverProvider ( hover ) ,
758+ getDocumentHighlights : createStubDocumentHighlightProvider ( ) ,
759+ getActions : ( ) => of ( null ) ,
760+ pinningEnabled : true ,
761+ } )
762+
763+ const positionJumps = new Subject < PositionJump > ( )
764+
765+ const positionEvents = of ( codeView . codeView ) . pipe ( findPositionsFromEvents ( { domFunctions : codeView } ) )
766+
767+ const subscriptions = new Subscription ( )
768+
769+ subscriptions . add ( hoverifier )
770+ subscriptions . add (
771+ hoverifier . hoverify ( {
772+ dom : codeView ,
773+ positionEvents,
774+ positionJumps,
775+ resolveContext : ( ) => codeView . revSpec ,
776+ } )
777+ )
778+
779+ const hoverAndDefinitionUpdates = hoverifier . hoverStateUpdates . pipe (
780+ filter ( propertyIsDefined ( 'hoverOverlayProps' ) ) ,
781+ map ( ( { hoverOverlayProps } ) => hoverOverlayProps . hoveredToken ?. character ) ,
782+ distinctUntilChanged ( isEqual )
783+ )
784+
785+ const outputDiagram = `${ TOOLTIP_DISPLAY_DELAY + MOUSEOVER_DELAY + 1 } ms a`
786+
787+ const outputValues : { [ key : string ] : number } = {
788+ a : 6 ,
789+ }
790+
791+ cold ( `a b ${ TOOLTIP_DISPLAY_DELAY } ms c d 1ms e` , {
792+ a : [ 'mouseover' , 6 ] ,
793+ b : [ 'mousemove' , 6 ] ,
794+ c : [ 'mouseover' , 19 ] ,
795+ d : [ 'mousemove' , 19 ] ,
796+ e : [ 'mouseover' , 'overlay' ] ,
797+ } as Record < string , [ SupportedMouseEvent , number | 'overlay' ] > ) . subscribe ( ( [ eventType , value ] ) => {
798+ if ( value === 'overlay' ) {
799+ hoverOverlayElement . dispatchEvent (
800+ new MouseEvent ( eventType , {
801+ bubbles : true , // Must be true so that React can see it.
802+ } )
803+ )
804+ } else {
805+ dispatchMouseEventAtPositionImpure ( eventType , codeView , {
806+ line : 24 ,
807+ character : value ,
808+ } )
809+ }
810+ } )
811+
812+ expectObservable ( hoverAndDefinitionUpdates ) . toBe ( outputDiagram , outputValues )
813+ } )
814+ break
815+ }
816+ } )
817+
744818 it ( 'dedupes mouseover and mousemove event on same token' , ( ) => {
745819 for ( const codeView of testcases ) {
746820 const scheduler = new TestScheduler ( ( a , b ) => chai . assert . deepEqual ( a , b ) )
0 commit comments