Skip to content

Commit ca0e7c8

Browse files
authored
fix(chromium): insert oopifs into the frame hierarchy when connecting over CDP (#37359)
1 parent d196477 commit ca0e7c8

2 files changed

Lines changed: 13 additions & 4 deletions

File tree

packages/playwright-core/src/server/chromium/crPage.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,13 +432,13 @@ class FrameSession {
432432
eventsHelper.addEventListener(this._client, 'Runtime.executionContextCreated', event => this._onExecutionContextCreated(event.context)),
433433
eventsHelper.addEventListener(this._client, 'Runtime.executionContextDestroyed', event => this._onExecutionContextDestroyed(event.executionContextId)),
434434
eventsHelper.addEventListener(this._client, 'Runtime.executionContextsCleared', event => this._onExecutionContextsCleared()),
435-
eventsHelper.addEventListener(this._client, 'Target.attachedToTarget', event => this._onAttachedToTarget(event)),
436-
eventsHelper.addEventListener(this._client, 'Target.detachedFromTarget', event => this._onDetachedFromTarget(event)),
437435
]);
438436
}
439437

440438
private _addBrowserListeners() {
441439
this._eventListeners.push(...[
440+
eventsHelper.addEventListener(this._client, 'Target.attachedToTarget', event => this._onAttachedToTarget(event)),
441+
eventsHelper.addEventListener(this._client, 'Target.detachedFromTarget', event => this._onDetachedFromTarget(event)),
442442
eventsHelper.addEventListener(this._client, 'Inspector.targetCrashed', event => this._onTargetCrashed()),
443443
eventsHelper.addEventListener(this._client, 'Page.screencastFrame', event => this._onScreencastFrame(event)),
444444
eventsHelper.addEventListener(this._client, 'Page.windowOpen', event => this._onWindowOpen(event)),
@@ -713,7 +713,12 @@ class FrameSession {
713713
if (event.targetInfo.type === 'iframe') {
714714
// Frame id equals target id.
715715
const targetId = event.targetInfo.targetId;
716-
const frame = this._page.frameManager.frame(targetId);
716+
let frame = this._page.frameManager.frame(targetId);
717+
if (!frame && event.targetInfo.parentFrameId) {
718+
// When connecting to an existing page with an iframe, there is an "iframe" target,
719+
// but no local frame is reported in getFrameTree. We can create a remote frame here.
720+
frame = this._page.frameManager.frameAttached(targetId, event.targetInfo.parentFrameId);
721+
}
717722
if (!frame)
718723
return; // Subtree may be already gone due to renderer/browser race.
719724
this._page.frameManager.removeChildFramesRecursively(frame);

tests/library/chromium/oopif.spec.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,10 @@ it('should intercept response body from oopif', async function({ page, browser,
371371
expect(await response.text()).toBeTruthy();
372372
});
373373

374-
it.fail('should allow to re-connect to OOPIFs with CDP when iframes were there already', async ({ browserType, server }) => {
374+
it('should allow to re-connect to OOPIFs with CDP when iframes were there already', async ({ browserType, server, browserMajorVersion }) => {
375375
it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/36095' });
376+
it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/17656' });
377+
it.skip(browserMajorVersion < 141, 'old chromium does not have TargetInfo.parentFrameId');
376378

377379
const cdpPort = 10123 + it.info().parallelIndex * 4;
378380
const hostBrowser = await browserType.launch({ cdpPort } as any);
@@ -386,6 +388,8 @@ it.fail('should allow to re-connect to OOPIFs with CDP when iframes were there a
386388
expect(page.frames().length).toBe(2);
387389
await assertOOPIFCount(browser, 1);
388390
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
391+
await browser.close();
392+
await hostBrowser.close();
389393
});
390394

391395
async function assertOOPIFCount(browser: Browser, count: number) {

0 commit comments

Comments
 (0)