testcafe
Version:
Automated browser testing for the modern web development stack.
90 lines • 14.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const injectables_1 = require("../../assets/injectables");
const debug_loggers_1 = require("../../utils/debug-loggers");
const cdp_1 = require("../utils/cdp");
const constants_1 = require("./constants");
const http_status_codes_1 = require("http-status-codes");
const load_assets_1 = __importDefault(require("../../load-assets"));
const string_1 = require("../utils/string");
const safe_api_1 = require("./safe-api");
async function handleRequestPauseEvent(event, client, sessionId) {
if ((0, cdp_1.isRequest)(event))
await (0, safe_api_1.safeContinueRequest)(client, event, sessionId);
else
await (0, safe_api_1.safeContinueResponse)(client, event, sessionId);
}
const internalRequest = {
condition: (event) => !event.networkId && event.resourceType !== 'Document' && !event.request.url,
handler: async (event, client, isMainWindow, options, sessionId) => {
(0, debug_loggers_1.requestPipelineInternalRequestLogger)('%r', event);
await handleRequestPauseEvent(event, client, sessionId);
},
};
const serviceRequest = {
condition: (event, options, serviceRoutes) => {
const url = event.request.url;
// NOTE: the service 'Error page' should be proxied.
if (url === serviceRoutes.errorPage1
|| url === serviceRoutes.errorPage2)
return false;
return options.serviceDomains.some(domain => url.startsWith(domain));
},
handler: async (event, client, isMainWindow, options, sessionId) => {
(0, debug_loggers_1.requestPipelineServiceRequestLogger)('%r', event);
try {
await handleRequestPauseEvent(event, client, sessionId);
}
catch (err) {
if (isMainWindow) {
(0, debug_loggers_1.requestPipelineServiceRequestLogger)('Failed to process request in main window: %s', event.request.url);
throw err;
}
else {
// NOTE: Sometimes, a child window sends a heartbeat request and then immediately closes.
// In these situations, we need to catch errors because we can't handle this request correctly
// when the cdpClient has already closed.
(0, debug_loggers_1.requestPipelineServiceRequestLogger)('Failed to process request in child window: %s', event.request.url);
}
}
},
};
const defaultFaviconRequest = {
condition: (event) => {
const parsedUrl = new URL(event.request.url);
return parsedUrl.pathname === injectables_1.DEFAULT_FAVICON_PATH;
},
handler: async (event, client, isMainWindow, options, sessionId) => {
(0, debug_loggers_1.requestPipelineLogger)('%r', event);
if ((0, cdp_1.isRequest)(event))
await (0, safe_api_1.safeContinueRequest)(client, event, sessionId);
else {
if (event.responseStatusCode === http_status_codes_1.StatusCodes.NOT_FOUND) { // eslint-disable-line no-lonely-if
const { favIcon } = (0, load_assets_1.default)(options.developmentMode);
await (0, safe_api_1.safeFulfillRequest)(client, {
requestId: event.requestId,
responseCode: http_status_codes_1.StatusCodes.OK,
responseHeaders: [constants_1.FAVICON_CONTENT_TYPE_HEADER],
body: (0, string_1.toBase64String)(favIcon),
}, sessionId);
}
else
await (0, safe_api_1.safeContinueResponse)(client, event, sessionId);
}
},
};
const SPECIAL_REQUEST_HANDLERS = [
internalRequest,
serviceRequest,
defaultFaviconRequest,
];
function getSpecialRequestHandler(event, options, serviceRoutes) {
const specialRequestHandler = SPECIAL_REQUEST_HANDLERS.find(h => h.condition(event, options, serviceRoutes));
return specialRequestHandler ? specialRequestHandler.handler : null;
}
exports.default = getSpecialRequestHandler;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lhbC1oYW5kbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uYXRpdmUtYXV0b21hdGlvbi9yZXF1ZXN0LXBpcGVsaW5lL3NwZWNpYWwtaGFuZGxlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSwwREFBZ0U7QUFPaEUsNkRBSW1DO0FBRW5DLHNDQUF5QztBQUN6QywyQ0FBMEQ7QUFDMUQseURBQWdEO0FBQ2hELG9FQUEyQztBQUMzQyw0Q0FBaUQ7QUFDakQseUNBSW9CO0FBRXBCLEtBQUssVUFBVSx1QkFBdUIsQ0FBRSxLQUF5QixFQUFFLE1BQW1CLEVBQUUsU0FBb0I7SUFDeEcsSUFBSSxJQUFBLGVBQVMsRUFBQyxLQUFLLENBQUM7UUFDaEIsTUFBTSxJQUFBLDhCQUFtQixFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7O1FBRXBELE1BQU0sSUFBQSwrQkFBb0IsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFHRCxNQUFNLGVBQWUsR0FBRztJQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUF5QixFQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUc7SUFDOUgsT0FBTyxFQUFJLEtBQUssRUFBRSxLQUF5QixFQUFFLE1BQW1CLEVBQUUsWUFBcUIsRUFBRSxPQUFvQyxFQUFFLFNBQW9CLEVBQWlCLEVBQUU7UUFDbEssSUFBQSxvREFBb0MsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEQsTUFBTSx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDYyxDQUFDO0FBRXBCLE1BQU0sY0FBYyxHQUFHO0lBQ25CLFNBQVMsRUFBRSxD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QixHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRTdHLE9BQU8scUJBQXFCLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3hFLENBQUM7QUFKRCwyQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm90b2NvbCBmcm9tICdkZXZ0b29scy1wcm90b2NvbCc7XG5pbXBvcnQgUmVxdWVzdFBhdXNlZEV2ZW50ID0gUHJvdG9jb2wuRmV0Y2guUmVxdWVzdFBhdXNlZEV2ZW50O1xuaW1wb3J0IHsgREVGQVVMVF9GQVZJQ09OX1BBVEggfSBmcm9tICcuLi8uLi9hc3NldHMvaW5qZWN0YWJsZXMnO1xuaW1wb3J0IHtcbiAgICBSZXF1ZXN0SGFuZGxlcixcbiAgICBTZXNzaW9uSWQsXG4gICAgU3BlY2lhbFNlcnZpY2VSb3V0ZXMsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFByb3RvY29sQXBpIH0gZnJvbSAnY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgICByZXF1ZXN0UGlwZWxpbmVJbnRlcm5hbFJlcXVlc3RMb2dnZXIsXG4gICAgcmVxdWVzdFBpcGVsaW5lTG9nZ2VyLFxuICAgIHJlcXVlc3RQaXBlbGluZVNlcnZpY2VSZXF1ZXN0TG9nZ2VyLFxufSBmcm9tICcuLi8uLi91dGlscy9kZWJ1Zy1sb2dnZXJzJztcbmltcG9ydCB7IE5hdGl2ZUF1dG9tYXRpb25Jbml0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBpc1JlcXVlc3QgfSBmcm9tICcuLi91dGlscy9jZHAnO1xuaW1wb3J0IHsgRkFWSUNPTl9DT05URU5UX1RZUEVfSEVBREVSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU3RhdHVzQ29kZXMgfSBmcm9tICdodHRwLXN0YXR1cy1jb2Rlcyc7XG5pbXBvcnQgbG9hZEFzc2V0cyBmcm9tICcuLi8uLi9sb2FkLWFzc2V0cyc7XG5pbXBvcnQgeyB0b0Jhc2U2NFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQge1xuICAgIHNhZmVDb250aW51ZVJlcXVlc3QsXG4gICAgc2FmZUNvbnRpbnVlUmVzcG9uc2UsXG4gICAgc2FmZUZ1bGZpbGxSZXF1ZXN0LFxufSBmcm9tICcuL3NhZmUtYXBpJztcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVxdWVzdFBhdXNlRXZlbnQgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIGNsaWVudDogUHJvdG9jb2xBcGksIHNlc3Npb25JZDogU2Vzc2lvbklkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGlzUmVxdWVzdChldmVudCkpXG4gICAgICAgIGF3YWl0IHNhZmVDb250aW51ZVJlcXVlc3QoY2xpZW50LCBldmVudCwgc2Vzc2lvbklkKTtcbiAgICBlbHNlXG4gICAgICAgIGF3YWl0IHNhZmVDb250aW51ZVJlc3BvbnNlKGNsaWVudCwgZXZlbnQsIHNlc3Npb25JZCk7XG59XG5cblxuY29uc3QgaW50ZXJuYWxSZXF1ZXN0ID0ge1xuICAgIGNvbmRpdGlvbjogKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQpOiBib29sZWFuID0+ICFldmVudC5uZXR3b3JrSWQgJiYgZXZlbnQucmVzb3VyY2VUeXBlICE9PSAnRG9jdW1lbnQnICYmICFldmVudC5yZXF1ZXN0LnVybCxcbiAgICBoYW5kbGVyOiAgIGFzeW5jIChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBjbGllbnQ6IFByb3RvY29sQXBpLCBpc01haW5XaW5kb3c6IGJvb2xlYW4sIG9wdGlvbnM6IE5hdGl2ZUF1dG9tYXRpb25Jbml0T3B0aW9ucywgc2Vzc2lvbklkOiBTZXNzaW9uSWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgcmVxdWVzdFBpcGVsaW5lSW50ZXJuYWxSZXF1ZXN0TG9nZ2VyKCclcicsIGV2ZW50KTtcblxuICAgICAgICBhd2FpdCBoYW5kbGVSZXF1ZXN0UGF1c2VFdmVudChldmVudCwgY2xpZW50LCBzZXNzaW9uSWQpO1xuICAgIH0sXG59IGFzIFJlcXVlc3RIYW5kbGVyO1xuXG5jb25zdCBzZXJ2aWNlUmVxdWVzdCA9IHtcbiAgICBjb25kaXRpb246IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBvcHRpb25zOiBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnMsIHNlcnZpY2VSb3V0ZXM6IFNwZWNpYWxTZXJ2aWNlUm91dGVzKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGV2ZW50LnJlcXVlc3QudXJsO1xuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBzZXJ2aWNlICdFcnJvciBwYWdlJyBzaG91bGQgYmUgcHJveGllZC5cbiAgICAgICAgaWYgKHVybCA9PT0gc2VydmljZVJvdXRlcy5lcnJvclBhZ2UxXG4gICAgICAgICAgICB8fCB1cmwgPT09IHNlcnZpY2VSb3V0ZXMuZXJyb3JQYWdlMilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5zZXJ2aWNlRG9tYWlucy5zb21lKGRvbWFpbiA9PiB1cmwuc3RhcnRzV2l0aChkb21haW4pKTtcbiAgICB9LFxuICAgIGhhbmRsZXI6IGFzeW5jIChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBjbGllbnQ6IFByb3RvY29sQXBpLCBpc01haW5XaW5kb3c6IGJvb2xlYW4sIG9wdGlvbnM6IE5hdGl2ZUF1dG9tYXRpb25Jbml0T3B0aW9ucywgc2Vzc2lvbklkOiBTZXNzaW9uSWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgcmVxdWVzdFBpcGVsaW5lU2VydmljZVJlcXVlc3RMb2dnZXIoJyVyJywgZXZlbnQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVSZXF1ZXN0UGF1c2VFdmVudChldmVudCwgY2xpZW50LCBzZXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChpc01haW5XaW5kb3cpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdExvZ2dlcignRmFpbGVkIHRvIHByb2Nlc3MgcmVxdWVzdCBpbiBtYWluIHdpbmRvdzogJXMnLCBldmVudC5yZXF1ZXN0LnVybCk7XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBTb21ldGltZXMsIGEgY2hpbGQgd2luZG93IHNlbmRzIGEgaGVhcnRiZWF0IHJlcXVlc3QgYW5kIHRoZW4gaW1tZWRpYXRlbHkgY2xvc2VzLlxuICAgICAgICAgICAgICAgIC8vIEluIHRoZXNlIHNpdHVhdGlvbnMsIHdlIG5lZWQgdG8gY2F0Y2ggZXJyb3JzIGJlY2F1c2Ugd2UgY2FuJ3QgaGFuZGxlIHRoaXMgcmVxdWVzdCBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBjZHBDbGllbnQgaGFzIGFscmVhZHkgY2xvc2VkLlxuICAgICAgICAgICAgICAgIHJlcXVlc3RQaXBlbGluZVNlcnZpY2VSZXF1ZXN0TG9nZ2VyKCdGYWlsZWQgdG8gcHJvY2VzcyByZXF1ZXN0IGluIGNoaWxkIHdpbmRvdzogJXMnLCBldmVudC5yZXF1ZXN0LnVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxufSBhcyBSZXF1ZXN0SGFuZGxlcjtcblxuY29uc3QgZGVmYXVsdEZhdmljb25SZXF1ZXN0ID0ge1xuICAgIGNvbmRpdGlvbjogKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChldmVudC5yZXF1ZXN0LnVybCk7XG5cbiAgICAgICAgcmV0dXJuIHBhcnNlZFVybC5wYXRobmFtZSA9PT0gREVGQVVMVF9GQVZJQ09OX1BBVEg7XG4gICAgfSxcbiAgICBoYW5kbGVyOiBhc3luYyAoZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCwgY2xpZW50OiBQcm90b2NvbEFwaSwgaXNNYWluV2luZG93OiBib29sZWFuLCBvcHRpb25zOiBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnMsIHNlc3Npb25JZDogU2Vzc2lvbklkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHJlcXVlc3RQaXBlbGluZUxvZ2dlcignJXInLCBldmVudCk7XG5cbiAgICAgICAgaWYgKGlzUmVxdWVzdChldmVudCkpXG4gICAgICAgICAgICBhd2FpdCBzYWZlQ29udGludWVSZXF1ZXN0KGNsaWVudCwgZXZlbnQsIHNlc3Npb25JZCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnJlc3BvbnNlU3RhdHVzQ29kZSA9PT0gU3RhdHVzQ29kZXMuTk9UX0ZPVU5EKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbG9uZWx5LWlmXG4gICAgICAgICAgICAgICAgY29uc3QgeyBmYXZJY29uIH0gPSBsb2FkQXNzZXRzKG9wdGlvbnMuZGV2ZWxvcG1lbnRNb2RlKTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHNhZmVGdWxmaWxsUmVxdWVzdChjbGllbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiAgICAgICBldmVudC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29kZTogICAgU3RhdHVzQ29kZXMuT0ssXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogWyBGQVZJQ09OX0NPTlRFTlRfVFlQRV9IRUFERVIgXSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogICAgICAgICAgICB0b0Jhc2U2NFN0cmluZyhmYXZJY29uKSxcbiAgICAgICAgICAgICAgICB9LCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGF3YWl0IHNhZmVDb250aW51ZVJlc3BvbnNlKGNsaWVudCwgZXZlbnQsIHNlc3Npb25JZCk7XG4gICAgICAgIH1cbiAgICB9LFxufSBhcyBSZXF1ZXN0SGFuZGxlcjtcblxuY29uc3QgU1BFQ0lBTF9SRVFVRVNUX0hBTkRMRVJTID0gW1xuICAgIGludGVybmFsUmVxdWVzdCxcbiAgICBzZXJ2aWNlUmVxdWVzdCxcbiAgICBkZWZhdWx0RmF2aWNvblJlcXVlc3QsXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTcGVjaWFsUmVxdWVzdEhhbmRsZXIgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIG9wdGlvbnM/OiBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnMsIHNlcnZpY2VSb3V0ZXM/OiBTcGVjaWFsU2VydmljZVJvdXRlcyk6IFJlcXVlc3RIYW5kbGVyWydoYW5kbGVyJ10gfCBudWxsIHtcbiAgICBjb25zdCBzcGVjaWFsUmVxdWVzdEhhbmRsZXIgPSBTUEVDSUFMX1JFUVVFU1RfSEFORExFUlMuZmluZChoID0+IGguY29uZGl0aW9uKGV2ZW50LCBvcHRpb25zLCBzZXJ2aWNlUm91dGVzKSk7XG5cbiAgICByZXR1cm4gc3BlY2lhbFJlcXVlc3RIYW5kbGVyID8gc3BlY2lhbFJlcXVlc3RIYW5kbGVyLmhhbmRsZXIgOiBudWxsO1xufVxuXG4iXX0=