@@ -19,6 +19,9 @@ import { domRender, ssrRenderToDom, trigger } from '@qwik.dev/core/testing';
1919import { describe , expect , it } from 'vitest' ;
2020import { ErrorProvider } from '../../testing/rendering.unit-util' ;
2121import { delay } from '../shared/utils/promises' ;
22+ import { ELEMENT_SEQ } from '../../server/qwik-copy' ;
23+ import { Task , TaskFlags } from '../use/use-task' ;
24+ import { USE_ON_LOCAL } from '../shared/utils/markers' ;
2225
2326const debug = false ; //true;
2427Error . stackTraceLimit = 100 ;
@@ -796,6 +799,43 @@ describe.each([
796799 } ) ;
797800
798801 describe ( 'regression' , ( ) => {
802+ it ( 'should not double-register events on component re-render' , async ( ) => {
803+ const Cmp = component$ ( ( ) => {
804+ const count = useSignal ( 0 ) ;
805+
806+ useVisibleTask$ ( ( ) => { } ) ;
807+ // component rerender
808+ count . value ;
809+
810+ return (
811+ < div >
812+ < button onClick$ = { ( ) => count . value ++ } > Click</ button >
813+ </ div >
814+ ) ;
815+ } ) ;
816+
817+ const { document, vNode, container } = await render ( < Cmp /> , { debug } ) ;
818+
819+ if ( render === ssrRenderToDom ) {
820+ await trigger ( document . body , 'div' , 'qvisible' ) ;
821+ }
822+ const seq = vNode ! . getProp < any [ ] > ( ELEMENT_SEQ , container . $getObjectById$ ) ! ;
823+ const task = seq . find ( ( task ) => task instanceof Task ) ! ;
824+ expect ( ( task . $flags$ & TaskFlags . EVENTS_REGISTERED ) === TaskFlags . EVENTS_REGISTERED ) . toBe (
825+ false
826+ ) ;
827+ if ( render === ssrRenderToDom ) {
828+ // only on SSR after resuming we have no useOn props
829+ expect ( vNode ! . getProp ( USE_ON_LOCAL , null ) ) . toBeNull ( ) ;
830+ }
831+
832+ await trigger ( document . body , 'button' , 'click' ) ;
833+ expect ( ( task . $flags$ & TaskFlags . EVENTS_REGISTERED ) === TaskFlags . EVENTS_REGISTERED ) . toBe (
834+ true
835+ ) ;
836+ expect ( vNode ! . getProp ( USE_ON_LOCAL , null ) ) . not . toBeNull ( ) ;
837+ } ) ;
838+
799839 it ( '#1717 - custom hooks should work' , async ( ) => {
800840 const Issue1717 = component$ ( ( ) => {
801841 const val1 = useDelay ( 'valueA' ) ;
0 commit comments