blob: 9ce62139a4f1a1683d13c32eced5be750756d47e [file] [log] [blame]
(async function(testRunner) {
var {page, session, dp} = await testRunner.startBlank(
`Tests that service worker requests are intercepted when DevTools attached after start.`);
const FetchHelper = await testRunner.loadScript('resources/fetch-test.js');
let serviceWorkerSession;
await dp.Target.setAutoAttach(
{autoAttach: true, waitForDebuggerOnStart: false, flatten: true});
dp.Target.onAttachedToTarget(async event => {
serviceWorkerSession = session.createChild(event.params.sessionId);
});
await dp.ServiceWorker.enable();
await session.navigate("resources/service-worker.html");
session.evaluateAsync(`
navigator.serviceWorker.register('service-worker.js?defer-install')`);
async function waitForServiceWorkerPhase(phase) {
let versions;
do {
const result = await dp.ServiceWorker.onceWorkerVersionUpdated();
versions = result.params.versions;
} while (!versions.length || versions[0].status !== phase);
}
await waitForServiceWorkerPhase("installing");
const url = 'fetch-data.txt';
let content = await session.evaluateAsync(`fetch("${url}").then(r => r.text())`);
testRunner.log(`Response before interception enabled: ${content}`);
const swFetcher = new FetchHelper(testRunner, serviceWorkerSession.protocol);
swFetcher.setLogPrefix("[renderer] ");
await swFetcher.enable();
swFetcher.onRequest().fulfill({
responseCode: 200,
responseHeaders: [],
body: btoa("overriden response body")
});
swFetcher.onceRequest(/service-worker-import\.js/).fulfill({
responseCode: 200,
responseHeaders: [
{name: "content-type", value: "application/x-javascript"}],
body: btoa(`self.imported_token = "overriden imported script!"`)
});
content = await serviceWorkerSession.evaluate(`
importScripts("service-worker-import.js");
self.imported_token
`);
testRunner.log(`Imported script after interception enabled: ${content}`);
serviceWorkerSession.evaluate(`self.installCallback()`);
await waitForServiceWorkerPhase("activated");
await swFetcher.enable();
dp.Page.reload();
await dp.Page.onceLifecycleEvent(event => event.params.name === 'load');
content = await session.evaluateAsync(`fetch("${url}").then(r => r.text())`);
testRunner.log(`Response after interception enabled: ${content}`);
testRunner.completeTest();
})