@@ -67,6 +67,7 @@ this.tabs = class extends ExtensionAPIPersistent {
67
67
PERSISTENT_EVENTS = { }
68
68
69
69
/**
70
+ * @param {BaseContext } context
70
71
* @returns {tabs__tabs.ApiGetterReturn }
71
72
*/
72
73
getAPI ( context ) {
@@ -76,140 +77,90 @@ this.tabs = class extends ExtensionAPIPersistent {
76
77
* @param {number } tabId
77
78
*/
78
79
async function get ( tabId ) {
79
- const window = [ ...lazy . WindowTracker . registeredWindows . values ( ) ] . find (
80
- ( window ) =>
81
- window . windowTabs ( ) . some ( ( tab ) => tab . view . browserId === tabId ) ,
82
- )
80
+ const tab = extension . tabManager . get ( tabId )
83
81
84
- if ( ! window ) {
82
+ if ( ! tab ) {
85
83
return Promise . reject ( {
86
84
message : `Cannot find tab matching the id ${ tabId } ` ,
87
85
} )
88
86
}
89
87
90
- const tab = window
91
- . windowTabs ( )
92
- . find ( ( tab ) => tab . view . browserId === tabId )
88
+ return tab
89
+ }
93
90
94
- if ( ! tab ) {
95
- return Promise . reject ( {
96
- message : `Cannot find tab matching the id ${ tabId } ` ,
97
- } )
91
+ /**
92
+ * @param {number } [tabId]
93
+ */
94
+ async function getTabOrActive ( tabId ) {
95
+ /** @type {TabBase } */
96
+ let tab
97
+
98
+ if ( tabId ) {
99
+ tab = extension . tabManager . get ( tabId )
100
+ } else {
101
+ const nativeTab = lazy . WindowTracker . getActiveWindow ( ) ?. activeTab ( )
102
+ if ( ! nativeTab ) {
103
+ return Promise . reject ( {
104
+ message : 'Could not find active tab' ,
105
+ } )
106
+ }
107
+ tab = extension . tabManager . publicWrapTab ( nativeTab )
98
108
}
99
109
100
- return { tab, window }
110
+ return tab
101
111
}
102
112
103
113
return {
104
114
tabs : {
105
115
async get ( tabId ) {
106
- const { tab, window } = await get ( tabId )
107
- return serialize ( extension ) ( [ tab , window ] )
116
+ const tab = await get ( tabId )
117
+ return tab . convert ( )
108
118
} ,
109
119
110
120
async goBack ( tabId ) {
111
- let tab
112
-
113
- if ( tabId ) {
114
- tab = await get ( tabId ) . then ( ( all ) => all . tab )
115
- } else {
116
- tab = lazy . WindowTracker . getActiveWindow ( ) ?. activeTab ( )
117
- if ( ! tab ) {
118
- return
119
- }
120
- }
121
- const complete = new Promise ( ( res ) => {
122
- /** @param {boolean } isLoading */
123
- function complete ( isLoading ) {
124
- if ( isLoading ) {
125
- return
126
- }
127
- tab . view . events . off ( 'loadingChange' , complete )
128
- res ( undefined )
129
- }
130
-
131
- tab . view . events . on ( 'loadingChange' , complete )
132
- } )
133
- tab . view . browser . goBack ( )
134
- return complete
121
+ const tab = await getTabOrActive ( tabId )
122
+ tab . browser . goBack ( )
135
123
} ,
136
124
137
125
async goForward ( tabId ) {
138
- let tab
139
-
140
- if ( tabId ) {
141
- tab = await get ( tabId ) . then ( ( all ) => all . tab )
142
- } else {
143
- tab = lazy . WindowTracker . getActiveWindow ( ) ?. activeTab ( )
144
- if ( ! tab ) {
145
- return
146
- }
147
- }
148
-
149
- const complete = new Promise ( ( res ) => {
150
- /** @param {boolean } isLoading */
151
- function complete ( isLoading ) {
152
- if ( isLoading ) {
153
- return
154
- }
155
- tab . view . events . off ( 'loadingChange' , complete )
156
- res ( undefined )
157
- }
158
-
159
- tab . view . events . on ( 'loadingChange' , complete )
160
- } )
161
- tab . view . browser . goForward ( )
162
- return complete
126
+ const tab = await getTabOrActive ( tabId )
127
+ tab . browser . goForward ( )
163
128
} ,
164
129
165
130
async query ( queryInfo ) {
166
- return query ( queryInfo ) . map ( serialize ( extension ) )
131
+ return Array . from ( extension . tabManager . query ( queryInfo , context ) ) . map (
132
+ ( tab ) => tab . convert ( ) ,
133
+ )
167
134
} ,
168
135
169
- async remove ( tabIds ) {
170
- const windows = [ ...lazy . WindowTracker . registeredWindows . entries ( ) ]
171
-
172
- if ( typeof tabIds === 'number' ) {
173
- for ( const window of windows . map ( ( w ) => w [ 1 ] ) ) {
174
- const tabs = window . windowTabs ( )
175
- for ( const tab of tabs ) {
176
- if ( tab . view . browserId === tabIds ) {
177
- return window . windowTabs . update ( ( tabs ) =>
178
- tabs . filter ( ( tab ) => tab . view . browserId !== tabIds ) ,
179
- )
180
- }
181
- }
182
- }
136
+ async remove ( tabSelector ) {
137
+ const tabIds =
138
+ typeof tabSelector == 'number' ? [ tabSelector ] : tabSelector
183
139
184
- return
185
- }
140
+ const windows = [ ...lazy . WindowTracker . registeredWindows . entries ( ) ]
186
141
187
142
for ( const window of windows . map ( ( w ) => w [ 1 ] ) ) {
188
143
const tabs = window . windowTabs ( )
189
- for ( const tab of tabs ) {
190
- if ( tabIds . includes ( tab . view . browserId || - 1 ) ) {
191
- window . windowTabs . update ( ( tabs ) =>
192
- tabs . filter (
193
- ( tab ) => ! tabIds . includes ( tab . view . browserId || - 1 ) ,
194
- ) ,
195
- )
196
- break
197
- }
144
+
145
+ if ( tabs . some ( ( tab ) => tabIds . includes ( tab . view . browserId || - 1 ) ) ) {
146
+ window . windowTabs . update ( ( tabs ) =>
147
+ tabs . filter (
148
+ ( tab ) => ! tabIds . includes ( tab . view . browserId || - 1 ) ,
149
+ ) ,
150
+ )
198
151
}
199
152
}
200
153
} ,
201
154
202
- async reload ( tabIds ) {
203
- if ( typeof tabIds === 'number' ) {
204
- const { tab } = await get ( tabIds )
205
- tab . view . browser . reload ( )
206
- return
207
- }
155
+ async reload ( tabSelector ) {
156
+ const tabIds =
157
+ typeof tabSelector == 'number' ? [ tabSelector ] : tabSelector
208
158
209
- for ( const id of tabIds ) {
210
- const { tab } = await get ( id )
211
- tab . view . browser . reload ( )
212
- }
159
+ await Promise . all (
160
+ tabIds
161
+ . map ( ( id ) => get ( id ) )
162
+ . map ( ( tab ) => tab . then ( ( tab ) => tab . browser . reload ( ) ) ) ,
163
+ )
213
164
} ,
214
165
215
166
async update ( tabId , updateProperties ) {
@@ -223,6 +174,7 @@ this.tabs = class extends ExtensionAPIPersistent {
223
174
}
224
175
225
176
let errors = null
177
+ /** @type {import("@browser/tabs").WindowTab | undefined } */
226
178
let retTab
227
179
228
180
window . windowTabs . update ( ( tabs ) =>
@@ -267,7 +219,8 @@ this.tabs = class extends ExtensionAPIPersistent {
267
219
}
268
220
269
221
if ( retTab ) {
270
- return serialize ( extension ) ( [ retTab , window ] )
222
+ const tab = extension . tabManager . getWrapper ( retTab )
223
+ return tab ?. convert ( )
271
224
}
272
225
273
226
return
0 commit comments