Path: blob/master/lib/rammerhead/src/util/patchAsyncResourceProcessor.js
6530 views
// https://github.com/DevExpress/testcafe-hammerhead/blob/7f80940225bc1c615517455dc7d30452b0365243/src/processing/resources/index.ts12const url = require('url');3const pageProcessor = require('testcafe-hammerhead/lib/processing/resources/page');4const manifestProcessor = require('testcafe-hammerhead/lib/processing/resources/manifest');5const scriptProcessor = require('testcafe-hammerhead/lib/processing/resources/script');6const stylesheetProcessor = require('testcafe-hammerhead/lib/processing/resources/stylesheet');7const urlUtil = require('testcafe-hammerhead/lib/utils/url');8const { encodeContent, decodeContent } = require('testcafe-hammerhead/lib/processing/encoding');9const { platform } = require('os');1011const IS_WIN = platform() === 'win32';12const DISK_RE = /^[A-Za-z]:/;13const RESOURCE_PROCESSORS = [pageProcessor, manifestProcessor, scriptProcessor, stylesheetProcessor];1415function getResourceUrlReplacer(ctx) {16return function (resourceUrl, resourceType, charsetAttrValue, baseUrl, isCrossDomain) {17if (!urlUtil.isSupportedProtocol(resourceUrl) && !urlUtil.isSpecialPage(resourceUrl)) return resourceUrl;1819if (IS_WIN && ctx.dest.protocol === 'file:' && DISK_RE.test(resourceUrl)) resourceUrl = '/' + resourceUrl;2021// NOTE: Resolves base URLs without a protocol ('//google.com/path' for example).22baseUrl = baseUrl ? url.resolve(ctx.dest.url, baseUrl) : '';23resourceUrl = urlUtil.processSpecialChars(resourceUrl);2425let resolvedUrl = url.resolve(baseUrl || ctx.dest.url, resourceUrl);2627if (!urlUtil.isValidUrl(resolvedUrl)) return resourceUrl;2829// NOTE: Script or <link rel='preload' as='script'>30const isScriptLike = urlUtil.parseResourceType(resourceType).isScript;31const charsetStr = charsetAttrValue || (isScriptLike && ctx.contentInfo.charset.get());3233resolvedUrl = urlUtil.ensureTrailingSlash(resourceUrl, resolvedUrl);3435if (!urlUtil.isValidUrl(resolvedUrl)) return resolvedUrl;3637return ctx.toProxyUrl(resolvedUrl, isCrossDomain, resourceType, charsetStr);38};39}4041require('testcafe-hammerhead/lib/processing/resources/index').process = async function process(ctx) {42const { destResBody, contentInfo } = ctx;43const { encoding, charset } = contentInfo;4445for (const processor of RESOURCE_PROCESSORS) {46if (!processor.shouldProcessResource(ctx)) continue;4748const urlReplacer = getResourceUrlReplacer(ctx);4950if (pageProcessor === processor) await ctx.prepareInjectableUserScripts();5152const decoded = await decodeContent(destResBody, encoding, charset);5354// @ts-ignore: Cannot invoke an expression whose type lacks a call signature55const processed = await processor.processResource(decoded, ctx, charset, urlReplacer); // <-- add async support5657if (processed === pageProcessor.RESTART_PROCESSING) return await process(ctx);5859return await encodeContent(processed, encoding, charset);60}6162return destResBody;63};646566