@@ -108,6 +108,62 @@ const seedSyncedComponentTab = async (page: import('@playwright/test').Page) =>
108108 } )
109109}
110110
111+ const waitForWorkspaceTabOrderPersistence = async (
112+ page : import ( '@playwright/test' ) . Page ,
113+ expectedLeadingTabNames : string [ ] ,
114+ ) => {
115+ await expect
116+ . poll ( async ( ) => {
117+ return page . evaluate ( async expectedTabNames => {
118+ const request = indexedDB . open ( 'knighted-develop-workspaces' )
119+
120+ const db = await new Promise < IDBDatabase > ( ( resolve , reject ) => {
121+ request . onsuccess = ( ) => resolve ( request . result )
122+ request . onerror = ( ) => reject ( request . error )
123+ request . onblocked = ( ) => reject ( new Error ( 'Could not open IndexedDB.' ) )
124+ } )
125+
126+ try {
127+ const tx = db . transaction ( 'prWorkspaces' , 'readonly' )
128+ const store = tx . objectStore ( 'prWorkspaces' )
129+ const getAllRequest = store . getAll ( )
130+
131+ const records = await new Promise < Array < Record < string , unknown > > > (
132+ ( resolve , reject ) => {
133+ getAllRequest . onsuccess = ( ) => {
134+ const value = Array . isArray ( getAllRequest . result )
135+ ? getAllRequest . result
136+ : [ ]
137+ resolve ( value as Array < Record < string , unknown > > )
138+ }
139+ getAllRequest . onerror = ( ) => reject ( getAllRequest . error )
140+ } ,
141+ )
142+
143+ return records . some ( record => {
144+ const tabs = Array . isArray ( record . tabs ) ? record . tabs : [ ]
145+ const tabNames = tabs
146+ . map ( tab => {
147+ if ( ! tab || typeof tab !== 'object' ) {
148+ return ''
149+ }
150+
151+ return typeof ( tab as { name ?: unknown } ) . name === 'string'
152+ ? ( ( tab as { name : string } ) . name ?? '' )
153+ : ''
154+ } )
155+ . filter ( name => name . length > 0 )
156+
157+ return expectedTabNames . every ( ( name , index ) => tabNames [ index ] === name )
158+ } )
159+ } finally {
160+ db . close ( )
161+ }
162+ } , expectedLeadingTabNames )
163+ } )
164+ . toBe ( true )
165+ }
166+
111167test ( 'removing active tab selects deterministic adjacent tab' , async ( { page } ) => {
112168 await waitForInitialRender ( page )
113169
@@ -320,8 +376,8 @@ test('workspace tab drag reorder persists across reload', async ({ page }) => {
320376 await expect ( orderedTabs . nth ( 0 ) ) . toHaveAccessibleName ( 'Workspace tab module-2.tsx' )
321377 await expect ( orderedTabs . nth ( 1 ) ) . toHaveAccessibleName ( 'Workspace tab App.tsx' )
322378
323- /* Reorder persistence is debounced; wait for normal save rather than unload flush . */
324- await page . waitForTimeout ( 1000 )
379+ /* Reorder persistence is debounced; wait until IndexedDB reflects the new order . */
380+ await waitForWorkspaceTabOrderPersistence ( page , [ 'module-2.tsx' , 'App.tsx' ] )
325381
326382 await page . reload ( )
327383 await waitForInitialRender ( page )
0 commit comments