blob: 450765ef57676a5533ce62f21dab019a15e1897f [file] [log] [blame]
(async function(testRunner) {
const {page, session, dp} = await testRunner.startBlank(
`Tests that we intercept errors reported instead of response when intercepting responses.`);
function isResponse(params) {
return "responseErrorReason" in params || "responseStatusCode" in params;
}
async function requestAndDump(expectResponse) {
const url = '/devtools/network/resources/resource-deny.php';
const responsePromise = session.evaluateAsync(`
fetch("${url}").then(r => r.text()).
catch(error => 'Error: ' + JSON.stringify(error))
`).then(response => testRunner.log(`Fetched responsed with: ${response}`));
const requestParams = (await dp.Fetch.onceRequestPaused()).params;
if (!requestParams.request.url.endsWith(url)) {
testRunner.fail(`Paused at wrong request, got ${requestParams.request.url}, expected ${url}`);
return;
}
if (isResponse(requestParams)) {
testRunner.fail(`Paused at wrong phase, expected request, got response`);
return;
}
dp.Fetch.continueRequest({requestId: requestParams.requestId});
if (expectResponse) {
const responseParams = (await dp.Fetch.onceRequestPaused()).params;
const phase = isResponse(responseParams) ? "response" : "request";
const message = `Intercepted ${responseParams.request.method} ${responseParams.request.url} at ${phase}`;
const maybeError = responseParams.responseErrorReason ? `, error: ${responseParams.responseErrorReason}` : '';
testRunner.log(message + maybeError);
}
return {requestId: requestParams.requestId, responsePromise};
}
// This browser-level FetchHelper is only for mocking error responses to the
// Fetch handler under test, which is on the renderer target (and gets
// inserted on top of the browser one).
const FetchHelper = await testRunner.loadScript('resources/fetch-test.js');
const helper = new FetchHelper(testRunner, testRunner.browserP());
await helper.enable();
helper.onceRequest().continueRequest();
helper.setLogPrefix("[mock fetcher] ");
dp.Page.enable();
dp.Page.reload();
await dp.Page.onceLoadEventFired();
helper.onRequest(/resource-deny/).fail({
errorReason: 'AccessDenied'
});
await dp.Fetch.enable({patterns: [{requestStage: 'Request'}, {requestStage: 'Response'}]});
{
testRunner.log(`Testing continuing failed request...`);
const {requestId, responsePromise} = await requestAndDump(true);
dp.Fetch.continueRequest({requestId});
await responsePromise;
}
{
testRunner.log(`Testing failing failed request...`);
const {requestId, responsePromise} = await requestAndDump(true);
dp.Fetch.failRequest({requestId, errorReason: 'Aborted'});
await responsePromise;
}
{
testRunner.log(`Testing fulfilling failed request...`);
const {requestId, responsePromise} = await requestAndDump(true);
dp.Fetch.fulfillRequest({
requestId,
responseCode: 200,
responseHeaders: [],
body: btoa("overriden response body")
});
await responsePromise;
}
{
testRunner.log(`Testing we're not pausing on errors when only intercepting requests...`);
await dp.Fetch.enable({patterns: [{requestStage: 'Request'}]});
dp.Fetch.onRequestPaused(event => {
if (isResponse(event.params))
testRunner.fail(`Unexpected Fetch.requestPaused event for error response`);
});
const {responsePromise} = await requestAndDump(false);
await responsePromise;
}
testRunner.completeTest();
})