mirror of
https://github.com/puppeteer/puppeteer
synced 2024-06-14 14:02:48 +00:00
fix: handle missing detach events for restored bfcache targets (#10967)
This commit is contained in:
parent
0b7f0216e9
commit
7bcdfcb7e9
@ -24,6 +24,7 @@ import {debugError} from '../common/util.js';
|
|||||||
import {assert} from '../util/assert.js';
|
import {assert} from '../util/assert.js';
|
||||||
import {Deferred} from '../util/Deferred.js';
|
import {Deferred} from '../util/Deferred.js';
|
||||||
|
|
||||||
|
import {type CdpCDPSession} from './CDPSession.js';
|
||||||
import {type Connection} from './Connection.js';
|
import {type Connection} from './Connection.js';
|
||||||
import {CdpTarget, InitializationStatus} from './Target.js';
|
import {CdpTarget, InitializationStatus} from './Target.js';
|
||||||
import {
|
import {
|
||||||
@ -358,10 +359,7 @@ export class ChromeTargetManager
|
|||||||
// `this.#connection.isAutoAttached(targetInfo.targetId)`. In the future, we
|
// `this.#connection.isAutoAttached(targetInfo.targetId)`. In the future, we
|
||||||
// should determine if a target is auto-attached or not with the help of
|
// should determine if a target is auto-attached or not with the help of
|
||||||
// CDP.
|
// CDP.
|
||||||
if (
|
if (targetInfo.type === 'service_worker') {
|
||||||
targetInfo.type === 'service_worker' &&
|
|
||||||
this.#connection.isAutoAttached(targetInfo.targetId)
|
|
||||||
) {
|
|
||||||
this.#finishInitializationIfReady(targetInfo.targetId);
|
this.#finishInitializationIfReady(targetInfo.targetId);
|
||||||
await silentDetach();
|
await silentDetach();
|
||||||
if (this.#attachedTargetsByTargetId.has(targetInfo.targetId)) {
|
if (this.#attachedTargetsByTargetId.has(targetInfo.targetId)) {
|
||||||
@ -393,18 +391,16 @@ export class ChromeTargetManager
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isExistingTarget) {
|
|
||||||
target._initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.#setupAttachmentListeners(session);
|
this.#setupAttachmentListeners(session);
|
||||||
|
|
||||||
if (isExistingTarget) {
|
if (isExistingTarget) {
|
||||||
|
(session as CdpCDPSession)._setTarget(target);
|
||||||
this.#attachedTargetsBySessionId.set(
|
this.#attachedTargetsBySessionId.set(
|
||||||
session.id(),
|
session.id(),
|
||||||
this.#attachedTargetsByTargetId.get(targetInfo.targetId)!
|
this.#attachedTargetsByTargetId.get(targetInfo.targetId)!
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
target._initialize();
|
||||||
this.#attachedTargetsByTargetId.set(targetInfo.targetId, target);
|
this.#attachedTargetsByTargetId.set(targetInfo.targetId, target);
|
||||||
this.#attachedTargetsBySessionId.set(session.id(), target);
|
this.#attachedTargetsBySessionId.set(session.id(), target);
|
||||||
}
|
}
|
||||||
|
@ -1397,6 +1397,12 @@
|
|||||||
"parameters": ["chrome", "webDriverBiDi"],
|
"parameters": ["chrome", "webDriverBiDi"],
|
||||||
"expectations": ["PASS"]
|
"expectations": ["PASS"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"testIdPattern": "[bfcache.spec] BFCache can navigate to a BFCached page containing an OOPIF and a worker",
|
||||||
|
"platforms": ["darwin", "linux", "win32"],
|
||||||
|
"parameters": ["cdp", "firefox"],
|
||||||
|
"expectations": ["SKIP"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"testIdPattern": "[browser.spec] Browser specs Browser.isConnected should set the browser connected state",
|
"testIdPattern": "[browser.spec] Browser specs Browser.isConnected should set the browser connected state",
|
||||||
"platforms": ["darwin", "linux", "win32"],
|
"platforms": ["darwin", "linux", "win32"],
|
||||||
|
11
test/assets/cached/bfcache/worker-iframe-container.html
Normal file
11
test/assets/cached/bfcache/worker-iframe-container.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<body>BFCached<a href="target.html">next</a></body>
|
||||||
|
<script>
|
||||||
|
window.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const iframe = document.createElement('iframe');
|
||||||
|
const url = new URL(location.href);
|
||||||
|
url.hostname = url.hostname === 'localhost' ? '127.0.0.1' : 'localhost';
|
||||||
|
url.pathname = '/cached/bfcache/worker-iframe.html';
|
||||||
|
iframe.src = url.toString();
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
}, false);
|
||||||
|
</script>
|
3
test/assets/cached/bfcache/worker-iframe.html
Normal file
3
test/assets/cached/bfcache/worker-iframe.html
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<script>
|
||||||
|
const worker = new Worker('worker.mjs', {type: 'module'})
|
||||||
|
</script>
|
1
test/assets/cached/bfcache/worker.mjs
Normal file
1
test/assets/cached/bfcache/worker.mjs
Normal file
@ -0,0 +1 @@
|
|||||||
|
console.log('HELLO');
|
@ -15,8 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import expect from 'expect';
|
import expect from 'expect';
|
||||||
|
import {PageEvent} from 'puppeteer-core';
|
||||||
|
|
||||||
import {launch} from './mocha-utils.js';
|
import {launch} from './mocha-utils.js';
|
||||||
|
import {waitEvent} from './utils.js';
|
||||||
|
|
||||||
describe('BFCache', function () {
|
describe('BFCache', function () {
|
||||||
it('can navigate to a BFCached page', async () => {
|
it('can navigate to a BFCached page', async () => {
|
||||||
@ -25,7 +27,7 @@ describe('BFCache', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
page.setDefaultTimeout(2000);
|
page.setDefaultTimeout(3000);
|
||||||
|
|
||||||
await page.goto(httpsServer.PREFIX + '/cached/bfcache/index.html');
|
await page.goto(httpsServer.PREFIX + '/cached/bfcache/index.html');
|
||||||
|
|
||||||
@ -44,4 +46,30 @@ describe('BFCache', function () {
|
|||||||
await close();
|
await close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('can navigate to a BFCached page containing an OOPIF and a worker', async () => {
|
||||||
|
const {httpsServer, page, close} = await launch({
|
||||||
|
ignoreHTTPSErrors: true,
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
page.setDefaultTimeout(3000);
|
||||||
|
const [worker1] = await Promise.all([
|
||||||
|
waitEvent(page, PageEvent.WorkerCreated),
|
||||||
|
page.goto(
|
||||||
|
httpsServer.PREFIX + '/cached/bfcache/worker-iframe-container.html'
|
||||||
|
),
|
||||||
|
]);
|
||||||
|
expect(await worker1.evaluate('1 + 1')).toBe(2);
|
||||||
|
await Promise.all([page.waitForNavigation(), page.locator('a').click()]);
|
||||||
|
|
||||||
|
const [worker2] = await Promise.all([
|
||||||
|
waitEvent(page, PageEvent.WorkerCreated),
|
||||||
|
page.waitForNavigation(),
|
||||||
|
page.goBack(),
|
||||||
|
]);
|
||||||
|
expect(await worker2.evaluate('1 + 1')).toBe(2);
|
||||||
|
} finally {
|
||||||
|
await close();
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user