Skip to content

Commit 4184afc

Browse files
fix: reliably detect default user context (#3947)
Rely on [`Target.getBrowserContexts`](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-getBrowserContexts)'s `defaultBrowserContextId`, introduced in Chromium `145.0.7578.0` by https://crrev.com/c/7254258.
1 parent c139171 commit 4184afc

File tree

1 file changed

+36
-17
lines changed

1 file changed

+36
-17
lines changed

src/bidiMapper/BidiServer.ts

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -203,29 +203,14 @@ export class BidiServer extends EventEmitter<BidiServerEvent> {
203203
parser?: BidiCommandParameterParser,
204204
logger?: LoggerFn,
205205
): Promise<BidiServer> {
206-
// The default context is not exposed in Target.getBrowserContexts but can
207-
// be observed via Target.getTargets. To determine the default browser
208-
// context, we check which one is mentioned in Target.getTargets and not in
209-
// Target.getBrowserContexts.
210-
const [{browserContextIds}, {targetInfos}] = await Promise.all([
211-
browserCdpClient.sendCommand('Target.getBrowserContexts'),
212-
browserCdpClient.sendCommand('Target.getTargets'),
206+
const [defaultUserContextId] = await Promise.all([
207+
this.#getDefaultUserContextId(browserCdpClient),
213208
// Required for `Browser.downloadWillBegin` events.
214209
browserCdpClient.sendCommand('Browser.setDownloadBehavior', {
215210
behavior: 'default',
216211
eventsEnabled: true,
217212
}),
218213
]);
219-
let defaultUserContextId = 'default';
220-
for (const info of targetInfos) {
221-
if (
222-
info.browserContextId &&
223-
!browserContextIds.includes(info.browserContextId)
224-
) {
225-
defaultUserContextId = info.browserContextId;
226-
break;
227-
}
228-
}
229214

230215
const server = new BidiServer(
231216
bidiTransport,
@@ -240,6 +225,40 @@ export class BidiServer extends EventEmitter<BidiServerEvent> {
240225
return server;
241226
}
242227

228+
static async #getDefaultUserContextId(
229+
browserCdpClient: CdpClient,
230+
): Promise<string> {
231+
// In chromium before `145.0.7578.0`, the default context is not exposed in
232+
// `Target.getBrowserContexts`, but can be observed via `Target.getTargets`.
233+
// If so, try to determine the default browser context by checking which one
234+
// is mentioned in `Target.getTargets` and not in
235+
// `Target.getBrowserContexts`.
236+
// TODO(after 2026-02-24): rely only on `defaultBrowserContextId` from
237+
// `Target.getBrowserContexts` after Chromium 145 reaches stable.
238+
const [{defaultBrowserContextId, browserContextIds}, {targetInfos}] =
239+
await Promise.all([
240+
browserCdpClient.sendCommand('Target.getBrowserContexts'),
241+
browserCdpClient.sendCommand('Target.getTargets'),
242+
]);
243+
244+
if (defaultBrowserContextId) {
245+
return defaultBrowserContextId;
246+
}
247+
248+
for (const info of targetInfos) {
249+
if (
250+
info.browserContextId &&
251+
!browserContextIds.includes(info.browserContextId)
252+
) {
253+
// The target belongs to a browser context that is not mentioned in
254+
// `Target.getBrowserContexts`. This is the default browser context.
255+
return info.browserContextId;
256+
}
257+
}
258+
// The browser context is unknown.
259+
return 'default';
260+
}
261+
243262
/**
244263
* Sends BiDi message.
245264
*/

0 commit comments

Comments
 (0)