@@ -5,15 +5,31 @@ import { createSharedState } from '@vitejs/devtools-kit/utils/shared-state'
55import { beforeEach , describe , expect , it , vi } from 'vitest'
66import { createDocksContext } from '../context'
77
8- const { requestDockPopupOpenMock } = vi . hoisted ( ( ) => {
8+ const {
9+ executeSetupScriptMock,
10+ registerMainFrameDockActionHandlerMock,
11+ requestDockPopupOpenMock,
12+ triggerMainFrameDockActionMock,
13+ } = vi . hoisted ( ( ) => {
914 return {
15+ executeSetupScriptMock : vi . fn ( ) ,
16+ registerMainFrameDockActionHandlerMock : vi . fn ( ) ,
1017 requestDockPopupOpenMock : vi . fn ( ) ,
18+ triggerMainFrameDockActionMock : vi . fn ( ) ,
1119 }
1220} )
1321
1422vi . mock ( '../popup' , ( ) => {
1523 return {
24+ registerMainFrameDockActionHandler : registerMainFrameDockActionHandlerMock ,
1625 requestDockPopupOpen : requestDockPopupOpenMock ,
26+ triggerMainFrameDockAction : triggerMainFrameDockActionMock ,
27+ }
28+ } )
29+
30+ vi . mock ( '../setup-script' , ( ) => {
31+ return {
32+ executeSetupScript : executeSetupScriptMock ,
1733 }
1834} )
1935
@@ -43,7 +59,12 @@ function createMockRpc(entries: DevToolsDockEntry[] = []): DevToolsRpcClient {
4359
4460describe ( 'dock popup entry switching' , ( ) => {
4561 beforeEach ( ( ) => {
62+ executeSetupScriptMock . mockReset ( )
63+ executeSetupScriptMock . mockResolvedValue ( undefined )
64+ registerMainFrameDockActionHandlerMock . mockClear ( )
4665 requestDockPopupOpenMock . mockClear ( )
66+ triggerMainFrameDockActionMock . mockReset ( )
67+ triggerMainFrameDockActionMock . mockResolvedValue ( undefined )
4768 } )
4869
4970 it ( 'routes popup entry through popup request event flow' , async ( ) => {
@@ -58,4 +79,77 @@ describe('dock popup entry switching', () => {
5879 expect ( context . panel . store . open ) . toBe ( false )
5980 expect ( context . docks . selectedId ) . toBeNull ( )
6081 } )
82+
83+ it ( 'registers action handler bridge on main frame context' , async ( ) => {
84+ const actionEntry : DevToolsDockEntry = {
85+ type : 'action' ,
86+ id : 'action-main-bridge' ,
87+ title : 'Action' ,
88+ icon : 'test' ,
89+ action : {
90+ importFrom : 'test' ,
91+ importName : 'default' ,
92+ } ,
93+ }
94+ const rpc = createMockRpc ( [ actionEntry ] )
95+ const context = await createDocksContext ( 'embedded' , rpc )
96+
97+ expect ( registerMainFrameDockActionHandlerMock ) . toHaveBeenCalledTimes ( 1 )
98+ const handler = registerMainFrameDockActionHandlerMock . mock . calls [ 0 ] ?. [ 0 ]
99+ expect ( handler ) . toBeTypeOf ( 'function' )
100+
101+ const result = await handler ?.( 'action-main-bridge' )
102+
103+ expect ( result ) . toBe ( true )
104+ expect ( executeSetupScriptMock ) . toHaveBeenCalledTimes ( 1 )
105+ expect ( context . docks . selectedId ) . toBe ( 'action-main-bridge' )
106+ } )
107+
108+ it ( 'delegates popup action click to main frame handler' , async ( ) => {
109+ triggerMainFrameDockActionMock . mockResolvedValue ( true )
110+ const actionEntry : DevToolsDockEntry = {
111+ type : 'action' ,
112+ id : 'action-popup-delegated' ,
113+ title : 'Action' ,
114+ icon : 'test' ,
115+ action : {
116+ importFrom : 'test' ,
117+ importName : 'default' ,
118+ } ,
119+ }
120+ const rpc = createMockRpc ( [ actionEntry ] )
121+ const context = await createDocksContext ( 'embedded' , rpc )
122+
123+ const result = await context . docks . switchEntry ( 'action-popup-delegated' )
124+
125+ expect ( result ) . toBe ( true )
126+ expect ( triggerMainFrameDockActionMock ) . toHaveBeenCalledWith ( 'action-popup-delegated' )
127+ expect ( executeSetupScriptMock ) . not . toHaveBeenCalled ( )
128+ expect ( context . panel . store . open ) . toBe ( false )
129+ expect ( context . docks . selectedId ) . toBeNull ( )
130+ } )
131+
132+ it ( 'falls back to local action handler when main frame delegation is unavailable' , async ( ) => {
133+ triggerMainFrameDockActionMock . mockResolvedValue ( undefined )
134+ const actionEntry : DevToolsDockEntry = {
135+ type : 'action' ,
136+ id : 'action-popup-fallback' ,
137+ title : 'Action' ,
138+ icon : 'test' ,
139+ action : {
140+ importFrom : 'test' ,
141+ importName : 'default' ,
142+ } ,
143+ }
144+ const rpc = createMockRpc ( [ actionEntry ] )
145+ const context = await createDocksContext ( 'embedded' , rpc )
146+
147+ const result = await context . docks . switchEntry ( 'action-popup-fallback' )
148+
149+ expect ( result ) . toBe ( true )
150+ expect ( triggerMainFrameDockActionMock ) . toHaveBeenCalledWith ( 'action-popup-fallback' )
151+ expect ( executeSetupScriptMock ) . toHaveBeenCalledTimes ( 1 )
152+ expect ( context . panel . store . open ) . toBe ( true )
153+ expect ( context . docks . selectedId ) . toBe ( 'action-popup-fallback' )
154+ } )
61155} )
0 commit comments