Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
QuiteAFancyEmerald
GitHub Repository: QuiteAFancyEmerald/Holy-Unblocker
Path: blob/master/lib/rammerhead/src/util/patchAsyncResourceProcessor.js
6530 views
1
// https://github.com/DevExpress/testcafe-hammerhead/blob/7f80940225bc1c615517455dc7d30452b0365243/src/processing/resources/index.ts
2
3
const url = require('url');
4
const pageProcessor = require('testcafe-hammerhead/lib/processing/resources/page');
5
const manifestProcessor = require('testcafe-hammerhead/lib/processing/resources/manifest');
6
const scriptProcessor = require('testcafe-hammerhead/lib/processing/resources/script');
7
const stylesheetProcessor = require('testcafe-hammerhead/lib/processing/resources/stylesheet');
8
const urlUtil = require('testcafe-hammerhead/lib/utils/url');
9
const { encodeContent, decodeContent } = require('testcafe-hammerhead/lib/processing/encoding');
10
const { platform } = require('os');
11
12
const IS_WIN = platform() === 'win32';
13
const DISK_RE = /^[A-Za-z]:/;
14
const RESOURCE_PROCESSORS = [pageProcessor, manifestProcessor, scriptProcessor, stylesheetProcessor];
15
16
function getResourceUrlReplacer(ctx) {
17
return function (resourceUrl, resourceType, charsetAttrValue, baseUrl, isCrossDomain) {
18
if (!urlUtil.isSupportedProtocol(resourceUrl) && !urlUtil.isSpecialPage(resourceUrl)) return resourceUrl;
19
20
if (IS_WIN && ctx.dest.protocol === 'file:' && DISK_RE.test(resourceUrl)) resourceUrl = '/' + resourceUrl;
21
22
// NOTE: Resolves base URLs without a protocol ('//google.com/path' for example).
23
baseUrl = baseUrl ? url.resolve(ctx.dest.url, baseUrl) : '';
24
resourceUrl = urlUtil.processSpecialChars(resourceUrl);
25
26
let resolvedUrl = url.resolve(baseUrl || ctx.dest.url, resourceUrl);
27
28
if (!urlUtil.isValidUrl(resolvedUrl)) return resourceUrl;
29
30
// NOTE: Script or <link rel='preload' as='script'>
31
const isScriptLike = urlUtil.parseResourceType(resourceType).isScript;
32
const charsetStr = charsetAttrValue || (isScriptLike && ctx.contentInfo.charset.get());
33
34
resolvedUrl = urlUtil.ensureTrailingSlash(resourceUrl, resolvedUrl);
35
36
if (!urlUtil.isValidUrl(resolvedUrl)) return resolvedUrl;
37
38
return ctx.toProxyUrl(resolvedUrl, isCrossDomain, resourceType, charsetStr);
39
};
40
}
41
42
require('testcafe-hammerhead/lib/processing/resources/index').process = async function process(ctx) {
43
const { destResBody, contentInfo } = ctx;
44
const { encoding, charset } = contentInfo;
45
46
for (const processor of RESOURCE_PROCESSORS) {
47
if (!processor.shouldProcessResource(ctx)) continue;
48
49
const urlReplacer = getResourceUrlReplacer(ctx);
50
51
if (pageProcessor === processor) await ctx.prepareInjectableUserScripts();
52
53
const decoded = await decodeContent(destResBody, encoding, charset);
54
55
// @ts-ignore: Cannot invoke an expression whose type lacks a call signature
56
const processed = await processor.processResource(decoded, ctx, charset, urlReplacer); // <-- add async support
57
58
if (processed === pageProcessor.RESTART_PROCESSING) return await process(ctx);
59
60
return await encodeContent(processed, encoding, charset);
61
}
62
63
return destResBody;
64
};
65
66