fix(chromium): fix a race in persistent context launch (#1702)
We should stop attaching to existing targets immediately after Target.setAutoAttach response arrives, otherwise we have a window for double attach.
This commit is contained in:
parent
685f14d8ba
commit
5b4d32d375
|
|
@ -50,25 +50,36 @@ export class CRBrowser extends BrowserBase {
|
||||||
const connection = new CRConnection(SlowMoTransport.wrap(transport, slowMo));
|
const connection = new CRConnection(SlowMoTransport.wrap(transport, slowMo));
|
||||||
const browser = new CRBrowser(connection);
|
const browser = new CRBrowser(connection);
|
||||||
const session = connection.rootSession;
|
const session = connection.rootSession;
|
||||||
const promises = [
|
if (!isPersistent) {
|
||||||
session.send('Target.setDiscoverTargets', { discover: true }),
|
await session.send('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true });
|
||||||
session.send('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }),
|
return browser;
|
||||||
session.send('Target.setDiscoverTargets', { discover: false }),
|
|
||||||
];
|
|
||||||
const existingPageAttachPromises: Promise<any>[] = [];
|
|
||||||
if (isPersistent) {
|
|
||||||
// First page and background pages in the persistent context are created automatically
|
|
||||||
// and may be initialized before we enable auto-attach.
|
|
||||||
function attachToExistingPage({targetInfo}: Protocol.Target.targetCreatedPayload) {
|
|
||||||
if (targetInfo.type !== 'page' && targetInfo.type !== 'background_page')
|
|
||||||
return;
|
|
||||||
existingPageAttachPromises.push(session.send('Target.attachToTarget', {targetId: targetInfo.targetId, flatten: true}));
|
|
||||||
}
|
|
||||||
session.on('Target.targetCreated', attachToExistingPage);
|
|
||||||
Promise.all(promises).then(() => session.off('Target.targetCreated', attachToExistingPage)).catch(debugError);
|
|
||||||
}
|
}
|
||||||
await Promise.all(promises);
|
|
||||||
await Promise.all(existingPageAttachPromises);
|
const existingTargetAttachPromises: Promise<any>[] = [];
|
||||||
|
// First page, background pages and their service workers in the persistent context
|
||||||
|
// are created automatically and may be initialized before we enable auto-attach.
|
||||||
|
function attachToExistingPage({targetInfo}: Protocol.Target.targetCreatedPayload) {
|
||||||
|
if (targetInfo.type !== 'page' && targetInfo.type !== 'background_page' && targetInfo.type !== 'service_worker')
|
||||||
|
return;
|
||||||
|
// TODO: should we handle the error during 'Target.attachToTarget'? Can the target disappear?
|
||||||
|
existingTargetAttachPromises.push(session.send('Target.attachToTarget', {targetId: targetInfo.targetId, flatten: true}));
|
||||||
|
}
|
||||||
|
session.on('Target.targetCreated', attachToExistingPage);
|
||||||
|
|
||||||
|
const startDiscover = session.send('Target.setDiscoverTargets', { discover: true });
|
||||||
|
const autoAttachAndStopDiscover = session.send('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }).then(() => {
|
||||||
|
// All targets collected before setAutoAttach response will not be auto-attached, the rest will be.
|
||||||
|
// TODO: We should fix this upstream and remove this tricky logic.
|
||||||
|
session.off('Target.targetCreated', attachToExistingPage);
|
||||||
|
return session.send('Target.setDiscoverTargets', { discover: false });
|
||||||
|
});
|
||||||
|
await Promise.all([
|
||||||
|
startDiscover,
|
||||||
|
autoAttachAndStopDiscover,
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Wait for initial targets to arrive.
|
||||||
|
await Promise.all(existingTargetAttachPromises);
|
||||||
return browser;
|
return browser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue