blob: cc237afdfd940b5297bde06d098f282062e858e3 [file] [log] [blame]
(async function(testRunner) {
var {page, session, dp} = await testRunner.startBlank('Tests that interception works with multiple clients.');
const dp2 = (await page.createSession()).protocol;
await dp.Network.clearBrowserCache();
await dp.Network.clearBrowserCookies();
await dp.Network.setCacheDisabled({cacheDisabled: true});
await dp.Network.enable();
await dp.Runtime.enable();
await dp2.Network.enable();
testRunner.log('-- request stage for client 1 and client 2');
await dp2.Network.setRequestInterception({patterns: [{}]});
await dp.Network.setRequestInterception({patterns: [{}]});
function continueInterceptedRequest(protocol, clientName, event) {
const params = event.params;
const url = params.request.url;
const is_response = !!params.responseHeaders;
if (is_response) {
testRunner.log(`${clientName}: intercepted response ${params.responseStatusCode} from ${url}`);
} else {
testRunner.log(`${clientName}: intercepted request to ${url}`);
}
protocol.Network.continueInterceptedRequest({interceptionId : params.interceptionId});
}
const listener1 = continueInterceptedRequest.bind(this, dp, "client 1");
dp.Network.onRequestIntercepted(listener1);
dp2.Network.onRequestIntercepted(continueInterceptedRequest.bind(this, dp2, "client 2"));
await session.evaluateAsync(`fetch("/devtools/network/resources/resource.php").then(r => r.text())`);
testRunner.log('-- request stage for client 1, both stages for client 2');
await dp2.Network.setRequestInterception({patterns: [
{urlPattern: '*', interceptionStage: 'Request'},
{urlPattern: '*', interceptionStage: 'HeadersReceived'}
]});
await session.evaluateAsync(`fetch("/devtools/network/resources/resource.php").then(r => r.text())`);
testRunner.log('-- both stages for client 1 and client 2');
await dp.Network.setRequestInterception({patterns: [
{urlPattern: '*', interceptionStage: 'Request'},
{urlPattern: '*', interceptionStage: 'HeadersReceived'}
]});
await session.evaluateAsync(`fetch("/devtools/network/resources/resource.php").then(r => r.text())`);
testRunner.log('-- mock response from client 1');
dp.Network.offRequestIntercepted(listener1);
dp.Network.onRequestIntercepted(event => {
const params = event.params;
testRunner.log(`client 1: rejecting request to ${params.request.url}`);
dp.Network.continueInterceptedRequest({interceptionId: params.interceptionId, rawResponse: btoa("HTTP/1.1 418 I'm a teapot\r\n\r\n")});
});
await session.evaluateAsync(`fetch("/devtools/network/resources/resource.php").then(r => r.text())`);
testRunner.log('-- mock response from client 3');
const dp3 = (await page.createSession()).protocol;
await dp3.Network.setRequestInterception({patterns: [{}]});
dp3.Network.onceRequestIntercepted().then(event => {
const params = event.params;
testRunner.log(`client 3: resolving response to ${params.request.url}`);
dp3.Network.continueInterceptedRequest({interceptionId: params.interceptionId, rawResponse: btoa("HTTP/1.1 200\r\n\r\nHello, world!")});
});
const body = await session.evaluateAsync(`fetch("/devtools/network/resources/resource.php").then(r => r.text())`);
testRunner.log(`response: ${body}`);
testRunner.log('-- url rewrite from client 3');
dp3.Network.onceRequestIntercepted().then(event => {
const params = event.params;
const newURL = `${params.request.url}?jscontent=1`;
testRunner.log(`client 3: overriding URL from ${params.request.url} to ${newURL}`);
dp3.Network.continueInterceptedRequest({interceptionId: params.interceptionId, url: newURL});
});
await session.evaluateAsync(`fetch("/devtools/network/resources/resource.php").then(r => r.text())`);
testRunner.log('-- failing request from client 3');
dp3.Network.onceRequestIntercepted().then(event => {
const params = event.params;
testRunner.log(`client 3: failing request from ${params.request.url}`);
dp3.Network.continueInterceptedRequest({interceptionId: params.interceptionId, errorReason: "Aborted"});
});
await session.evaluateAsync(`fetch("/devtools/network/resources/resource.php").then(r => r.text())`);
testRunner.completeTest();
})