@@ -106,39 +106,40 @@ export function createBrowserTabController(
106106 if ( ! tabId || ! page ) throw new Error ( "No browser tab is selected" )
107107 return { tabId, page }
108108 }
109-
110- return {
111- show ( ) {
112- tab . show ( )
113- return status ( )
114- } ,
115- async open ( url ) {
116- const normalized = normalizeBrowserUrl ( url , [ "http:" , "https:" ] )
117- tab . show ( )
118- tab . setLoading ( true )
119- const page = session . selectedPage ( )
120- if ( ! page ) {
121- try {
122- const created = await session . newTab ( normalized )
123- expectedUrls . set ( created . tabId , normalized )
124- tab . setLoading ( created . page . loading )
125- return status ( )
126- } catch ( error ) {
127- tab . setLoading ( false )
128- throw error
129- }
130- }
131- const tabId = session . snapshot ( ) . selectedTabId
132- if ( ! tabId ) throw new Error ( "No browser tab is selected" )
133- expectedUrls . set ( tabId , normalized )
109+ const open = async ( url : string ) => {
110+ const normalized = normalizeBrowserUrl ( url , [ "http:" , "https:" ] )
111+ tab . show ( )
112+ tab . setLoading ( true )
113+ const page = session . selectedPage ( )
114+ if ( ! page ) {
134115 try {
135- await page . goto ( normalized )
116+ const created = await session . newTab ( normalized )
117+ expectedUrls . set ( created . tabId , normalized )
118+ tab . setLoading ( created . page . loading )
136119 return status ( )
137120 } catch ( error ) {
138121 tab . setLoading ( false )
139122 throw error
140123 }
124+ }
125+ const tabId = session . snapshot ( ) . selectedTabId
126+ if ( ! tabId ) throw new Error ( "No browser tab is selected" )
127+ expectedUrls . set ( tabId , normalized )
128+ try {
129+ await page . goto ( normalized )
130+ return status ( )
131+ } catch ( error ) {
132+ tab . setLoading ( false )
133+ throw error
134+ }
135+ }
136+
137+ return {
138+ show ( ) {
139+ tab . show ( )
140+ return status ( )
141141 } ,
142+ open : ( url ) => open ( url ) ,
142143 async newTab ( url ) {
143144 const normalized = url === undefined ? initialUrl : normalizeBrowserUrl ( url , [ "http:" , "https:" ] )
144145 tab . show ( )
@@ -168,7 +169,28 @@ export function createBrowserTabController(
168169 return status ( )
169170 } ,
170171 async closeTab ( tabId ) {
171- if ( ! ( await session . closeTab ( tabId ) ) ) throw new Error ( `Browser tab not found: ${ tabId ?? "selected" } ` )
172+ const before = session . snapshot ( )
173+ const previousTab = tab . snapshot ( )
174+ const closingTabId = tabId ?? before . selectedTabId
175+ const closingFinalTab = before . tabs . length === 1 && before . tabs [ 0 ] ?. tabId === closingTabId
176+ const closedTab = closingFinalTab ? tab . close ( ) : undefined
177+ const restoreTab = ( ) => {
178+ if ( ! closedTab || tab . snapshot ( ) !== closedTab || ! previousTab . open ) return
179+ tab . show ( )
180+ if ( ! previousTab . active ) tab . hide ( )
181+ if ( previousTab . loading ) tab . setLoading ( true )
182+ }
183+ let closed : boolean
184+ try {
185+ closed = await session . closeTab ( tabId )
186+ } catch ( error ) {
187+ restoreTab ( )
188+ throw error
189+ }
190+ if ( ! closed ) {
191+ restoreTab ( )
192+ throw new Error ( `Browser tab not found: ${ tabId ?? "selected" } ` )
193+ }
172194 await session . settle ( )
173195 return status ( )
174196 } ,
0 commit comments