testplane 8.42.2 → 8.42.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/package.json +1 -1
- package/build/src/base-testplane.d.ts +3 -1
- package/build/src/base-testplane.js +7 -2
- package/build/src/base-testplane.js.map +1 -1
- package/build/src/browser/cdp/domains/css.d.ts +14 -6
- package/build/src/browser/cdp/domains/css.js +4 -0
- package/build/src/browser/cdp/domains/css.js.map +1 -1
- package/build/src/browser/cdp/domains/debugger.d.ts +1 -1
- package/build/src/browser/cdp/domains/fetch.d.ts +157 -3
- package/build/src/browser/cdp/domains/fetch.js +40 -1
- package/build/src/browser/cdp/domains/fetch.js.map +1 -1
- package/build/src/browser/cdp/domains/network.d.ts +284 -18
- package/build/src/browser/cdp/domains/network.js +64 -1
- package/build/src/browser/cdp/domains/network.js.map +1 -1
- package/build/src/browser/cdp/domains/page.d.ts +378 -0
- package/build/src/browser/cdp/domains/page.js +114 -0
- package/build/src/browser/cdp/domains/page.js.map +1 -0
- package/build/src/browser/cdp/emitter.d.ts +2 -1
- package/build/src/browser/cdp/emitter.js +2 -2
- package/build/src/browser/cdp/emitter.js.map +1 -1
- package/build/src/browser/cdp/index.d.ts +2 -0
- package/build/src/browser/cdp/index.js +15 -10
- package/build/src/browser/cdp/index.js.map +1 -1
- package/build/src/browser/cdp/selectivity/css-selectivity.d.ts +4 -0
- package/build/src/browser/cdp/selectivity/css-selectivity.js +55 -47
- package/build/src/browser/cdp/selectivity/css-selectivity.js.map +1 -1
- package/build/src/browser/cdp/selectivity/index.js +47 -7
- package/build/src/browser/cdp/selectivity/index.js.map +1 -1
- package/build/src/browser/cdp/selectivity/js-selectivity.d.ts +4 -1
- package/build/src/browser/cdp/selectivity/js-selectivity.js +76 -68
- package/build/src/browser/cdp/selectivity/js-selectivity.js.map +1 -1
- package/build/src/browser/cdp/types.d.ts +214 -0
- package/build/src/testplane.d.ts +1 -1
- package/build/src/testplane.js +4 -4
- package/build/src/testplane.js.map +1 -1
- package/build/src/worker/testplane.js +1 -1
- package/build/src/worker/testplane.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,6 +10,7 @@ const dom_1 = require("./domains/dom");
|
|
|
10
10
|
const css_1 = require("./domains/css");
|
|
11
11
|
const network_1 = require("./domains/network");
|
|
12
12
|
const fetch_1 = require("./domains/fetch");
|
|
13
|
+
const page_1 = require("./domains/page");
|
|
13
14
|
class CDP {
|
|
14
15
|
static async create(browser) {
|
|
15
16
|
// "isChrome" is "true" when automationProtocol is "devtools"
|
|
@@ -28,8 +29,9 @@ class CDP {
|
|
|
28
29
|
this.runtime = new runtime_1.CDPRuntime(connection);
|
|
29
30
|
this.dom = new dom_1.CDPDom(connection);
|
|
30
31
|
this.css = new css_1.CDPCss(connection);
|
|
31
|
-
this.network = new network_1.CDPNetwork();
|
|
32
|
-
this.fetch = new fetch_1.CDFetch();
|
|
32
|
+
this.network = new network_1.CDPNetwork(connection);
|
|
33
|
+
this.fetch = new fetch_1.CDFetch(connection);
|
|
34
|
+
this.page = new page_1.CDPPage(connection);
|
|
33
35
|
this._connection.onEventMessage = this._onEventMessage.bind(this);
|
|
34
36
|
}
|
|
35
37
|
async request(method, params, cdpSessionId) {
|
|
@@ -45,28 +47,31 @@ class CDP {
|
|
|
45
47
|
const [domain, method] = cdpEventMessage.method.split(".", 2);
|
|
46
48
|
switch (domain) {
|
|
47
49
|
case "Target":
|
|
48
|
-
this.target.emit(method, cdpEventMessage.params);
|
|
50
|
+
this.target.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
49
51
|
break;
|
|
50
52
|
case "Profiler":
|
|
51
|
-
this.profiler.emit(method, cdpEventMessage.params);
|
|
53
|
+
this.profiler.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
52
54
|
break;
|
|
53
55
|
case "Debugger":
|
|
54
|
-
this.debugger.emit(method, cdpEventMessage.params);
|
|
56
|
+
this.debugger.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
55
57
|
break;
|
|
56
58
|
case "Runtime":
|
|
57
|
-
this.runtime.emit(method, cdpEventMessage.params);
|
|
59
|
+
this.runtime.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
58
60
|
break;
|
|
59
61
|
case "DOM":
|
|
60
|
-
this.dom.emit(method, cdpEventMessage.params);
|
|
62
|
+
this.dom.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
61
63
|
break;
|
|
62
64
|
case "CSS":
|
|
63
|
-
this.css.emit(method, cdpEventMessage.params);
|
|
65
|
+
this.css.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
64
66
|
break;
|
|
65
67
|
case "Network":
|
|
66
|
-
this.network.emit(method, cdpEventMessage.params);
|
|
68
|
+
this.network.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
67
69
|
break;
|
|
68
70
|
case "Fetch":
|
|
69
|
-
this.fetch.emit(method, cdpEventMessage.params);
|
|
71
|
+
this.fetch.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
72
|
+
break;
|
|
73
|
+
case "Page":
|
|
74
|
+
this.page.emit(method, cdpEventMessage.params, cdpEventMessage.sessionId);
|
|
70
75
|
break;
|
|
71
76
|
}
|
|
72
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/browser/cdp/index.ts"],"names":[],"mappings":";;;AAEA,6CAA6C;AAC7C,6CAA6C;AAC7C,iDAAiD;AACjD,iDAAiD;AACjD,+CAA+C;AAC/C,uCAAuC;AACvC,uCAAuC;AACvC,+CAA+C;AAC/C,2CAA0C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/browser/cdp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,13 @@ export declare class CSSSelectivity {
|
|
|
7
7
|
private _cssOnStyleSheetAddedFn;
|
|
8
8
|
private _stylesSourceMap;
|
|
9
9
|
private _styleSheetIdToSourceMapUrl;
|
|
10
|
+
private _coverageResult;
|
|
10
11
|
constructor(cdp: CDP, sessionId: CDPSessionId, sourceRoot?: string);
|
|
11
12
|
private _processStyle;
|
|
13
|
+
private _ensureStylesAreLoading;
|
|
14
|
+
private _waitForLoadingStyles;
|
|
12
15
|
start(): Promise<void>;
|
|
16
|
+
takeCoverageSnapshot(): Promise<void>;
|
|
13
17
|
/** @param drop only performs cleanup without providing actual deps. Should be "true" if test is failed */
|
|
14
18
|
stop(drop?: boolean): Promise<Set<string> | null>;
|
|
15
19
|
}
|
|
@@ -16,12 +16,13 @@ class CSSSelectivity {
|
|
|
16
16
|
this._cssOnStyleSheetAddedFn = null;
|
|
17
17
|
this._stylesSourceMap = {};
|
|
18
18
|
this._styleSheetIdToSourceMapUrl = {};
|
|
19
|
+
this._coverageResult = [];
|
|
19
20
|
this._cdp = cdp;
|
|
20
21
|
this._sessionId = sessionId;
|
|
21
22
|
this._sourceRoot = sourceRoot;
|
|
22
23
|
}
|
|
23
|
-
_processStyle({ header: { styleSheetId, sourceURL, sourceMapURL } }) {
|
|
24
|
-
if (!this._sessionId) {
|
|
24
|
+
_processStyle({ header: { styleSheetId, sourceURL, sourceMapURL } }, cdpSessionId) {
|
|
25
|
+
if (!this._sessionId || cdpSessionId !== this._sessionId) {
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
27
28
|
if (!sourceURL || !sourceMapURL) {
|
|
@@ -53,16 +54,57 @@ class CSSSelectivity {
|
|
|
53
54
|
});
|
|
54
55
|
}
|
|
55
56
|
}
|
|
57
|
+
// If we haven't got "styleSheetAdded" event for the script, pull up styles + source map manually
|
|
58
|
+
_ensureStylesAreLoading(ruleUsage) {
|
|
59
|
+
ruleUsage.forEach(({ styleSheetId }) => {
|
|
60
|
+
if (Object.hasOwn(this._stylesSourceMap, styleSheetId)) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const scriptSourcePromise = this._cdp.css
|
|
64
|
+
.getStyleSheetText(this._sessionId, styleSheetId)
|
|
65
|
+
.then(res => res.text)
|
|
66
|
+
.catch((err) => err);
|
|
67
|
+
this._stylesSourceMap[styleSheetId] ||= scriptSourcePromise.then(sourceCode => {
|
|
68
|
+
if (sourceCode instanceof Error) {
|
|
69
|
+
return sourceCode;
|
|
70
|
+
}
|
|
71
|
+
const sourceMapsStartIndex = sourceCode.lastIndexOf(constants_1.CSS_SOURCE_MAP_URL_COMMENT);
|
|
72
|
+
const sourceMapsEndIndex = sourceCode.indexOf("*/", sourceMapsStartIndex);
|
|
73
|
+
// Source maps are not generated for this source file
|
|
74
|
+
if (sourceMapsStartIndex === -1) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const sourceMapURL = sourceMapsEndIndex === -1
|
|
78
|
+
? sourceCode.slice(sourceMapsStartIndex + constants_1.CSS_SOURCE_MAP_URL_COMMENT.length)
|
|
79
|
+
: sourceCode.slice(sourceMapsStartIndex + constants_1.CSS_SOURCE_MAP_URL_COMMENT.length, sourceMapsEndIndex);
|
|
80
|
+
// If we encounter css stylesheet, that was not reported by "styleSheetAdded"
|
|
81
|
+
// We can only get sourcemaps if they are inlined
|
|
82
|
+
// Otherwise, we can't resolve actual sourcemaps url because we dont know css styles url itself.
|
|
83
|
+
if (!(0, utils_1.isDataProtocol)(sourceMapURL)) {
|
|
84
|
+
return new Error([
|
|
85
|
+
`Missed stylesheet url for stylesheet id ${styleSheetId}.`,
|
|
86
|
+
"Looks like Chrome Devtools 'styleSheetAdded' event was lost",
|
|
87
|
+
"It could happen due to network instability",
|
|
88
|
+
"Switching to inline sourcemaps for CSS will help at the cost of increased RAM usage",
|
|
89
|
+
].join("\n"));
|
|
90
|
+
}
|
|
91
|
+
return (0, utils_1.fetchTextWithBrowserFallback)(sourceMapURL, this._cdp.runtime, this._sessionId).catch((err) => err);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async _waitForLoadingStyles() {
|
|
96
|
+
await Promise.allSettled(Object.values(this._stylesSourceMap));
|
|
97
|
+
}
|
|
56
98
|
async start() {
|
|
57
99
|
const cssOnStyleSheetAdded = (this._cssOnStyleSheetAddedFn = this._processStyle.bind(this));
|
|
58
100
|
this._cdp.css.on("styleSheetAdded", cssOnStyleSheetAdded);
|
|
59
|
-
await
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
101
|
+
await this._cdp.css.startRuleUsageTracking(this._sessionId);
|
|
102
|
+
}
|
|
103
|
+
async takeCoverageSnapshot() {
|
|
104
|
+
const coveragePart = await this._cdp.css.takeCoverageDelta(this._sessionId);
|
|
105
|
+
this._ensureStylesAreLoading(coveragePart.coverage);
|
|
106
|
+
await this._waitForLoadingStyles();
|
|
107
|
+
this._coverageResult.push(...coveragePart.coverage);
|
|
66
108
|
}
|
|
67
109
|
/** @param drop only performs cleanup without providing actual deps. Should be "true" if test is failed */
|
|
68
110
|
async stop(drop) {
|
|
@@ -70,45 +112,11 @@ class CSSSelectivity {
|
|
|
70
112
|
if (drop) {
|
|
71
113
|
return null;
|
|
72
114
|
}
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (Object.hasOwn(this._stylesSourceMap, styleSheetId)) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
const scriptSourcePromise = this._cdp.css
|
|
80
|
-
.getStyleSheetText(this._sessionId, styleSheetId)
|
|
81
|
-
.then(res => res.text)
|
|
82
|
-
.catch((err) => err);
|
|
83
|
-
this._stylesSourceMap[styleSheetId] ||= scriptSourcePromise.then(sourceCode => {
|
|
84
|
-
if (sourceCode instanceof Error) {
|
|
85
|
-
return sourceCode;
|
|
86
|
-
}
|
|
87
|
-
const sourceMapsStartIndex = sourceCode.lastIndexOf(constants_1.CSS_SOURCE_MAP_URL_COMMENT);
|
|
88
|
-
const sourceMapsEndIndex = sourceCode.indexOf("*/", sourceMapsStartIndex);
|
|
89
|
-
// Source maps are not generated for this source file
|
|
90
|
-
if (sourceMapsStartIndex === -1) {
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
const sourceMapURL = sourceMapsEndIndex === -1
|
|
94
|
-
? sourceCode.slice(sourceMapsStartIndex + constants_1.CSS_SOURCE_MAP_URL_COMMENT.length)
|
|
95
|
-
: sourceCode.slice(sourceMapsStartIndex + constants_1.CSS_SOURCE_MAP_URL_COMMENT.length, sourceMapsEndIndex);
|
|
96
|
-
// If we encounter css stylesheet, that was not reported by "styleSheetAdded"
|
|
97
|
-
// We can only get sourcemaps if they are inlined
|
|
98
|
-
// Otherwise, we can't resolve actual sourcemaps url because we dont know css styles url itself.
|
|
99
|
-
if (!(0, utils_1.isDataProtocol)(sourceMapURL)) {
|
|
100
|
-
return new Error([
|
|
101
|
-
`Missed stylesheet url for stylesheet id ${styleSheetId}.`,
|
|
102
|
-
"Looks like Chrome Devtools 'styleSheetAdded' event was lost",
|
|
103
|
-
"It could happen due to network instability",
|
|
104
|
-
"Switching to inline sourcemaps for CSS will help at the cost of increased RAM usage",
|
|
105
|
-
].join("\n"));
|
|
106
|
-
}
|
|
107
|
-
return (0, utils_1.fetchTextWithBrowserFallback)(sourceMapURL, this._cdp.runtime, this._sessionId).catch((err) => err);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
115
|
+
const coverageLastPart = await this._cdp.css.stopRuleUsageTracking(this._sessionId);
|
|
116
|
+
const coverageStyles = [...this._coverageResult, ...coverageLastPart.ruleUsage];
|
|
117
|
+
this._ensureStylesAreLoading(coverageLastPart.ruleUsage);
|
|
110
118
|
const totalDependingSourceFiles = new Set();
|
|
111
|
-
const grouppedByStyleSheetCoverage = (0, lodash_1.groupBy)(
|
|
119
|
+
const grouppedByStyleSheetCoverage = (0, lodash_1.groupBy)(coverageStyles, "styleSheetId");
|
|
112
120
|
const styleSheetIds = Object.keys(grouppedByStyleSheetCoverage);
|
|
113
121
|
await Promise.all(styleSheetIds.map(async (styleSheetId) => {
|
|
114
122
|
const sourceMap = await this._stylesSourceMap[styleSheetId];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css-selectivity.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/css-selectivity.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAiC;AACjC,0DAA6B;AAC7B,uCAAiD;AACjD,iEAA+E;AAC/E,mCAMiB;AACjB,yCAAqH;AACrH,mCAA2C;AAM3C,MAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"css-selectivity.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/css-selectivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -105,6 +105,8 @@ const clearUnusedSelectivityDumps = async (config) => {
|
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
107
|
exports.clearUnusedSelectivityDumps = clearUnusedSelectivityDumps;
|
|
108
|
+
const testplaneCoverageBreakScriptName = "__testplane_cdp_coverage_snapshot_pause";
|
|
109
|
+
const scriptToEvaluateOnNewDocument = `window.addEventListener("beforeunload", function ${testplaneCoverageBreakScriptName}() {debugger;});`;
|
|
108
110
|
const startSelectivity = async (browser) => {
|
|
109
111
|
const { enabled, compression, sourceRoot, testDependenciesPath, mapDependencyRelativePath } = browser.config.selectivity;
|
|
110
112
|
if (!(0, modes_1.selectivityShouldWrite)(enabled) || !browser.publicAPI.isChromium) {
|
|
@@ -116,9 +118,9 @@ const startSelectivity = async (browser) => {
|
|
|
116
118
|
if (!browser.cdp) {
|
|
117
119
|
throw new Error("Selectivity: Devtools connection is not established, couldn't record selectivity without it");
|
|
118
120
|
}
|
|
119
|
-
const
|
|
121
|
+
const cdp = browser.cdp;
|
|
120
122
|
const handle = await browser.publicAPI.getWindowHandle();
|
|
121
|
-
const { targetInfos } = await
|
|
123
|
+
const { targetInfos } = await cdp.target.getTargets();
|
|
122
124
|
const cdpTargetId = targetInfos.find(t => handle.includes(t.targetId))?.targetId;
|
|
123
125
|
if (!cdpTargetId) {
|
|
124
126
|
throw new Error([
|
|
@@ -127,9 +129,16 @@ const startSelectivity = async (browser) => {
|
|
|
127
129
|
`\n\t- cdp targets: ${targetInfos.map(t => `"${t.targetId}"`).join(", ")}`,
|
|
128
130
|
].join(""));
|
|
129
131
|
}
|
|
130
|
-
const sessionId = await
|
|
131
|
-
const cssSelectivity = new css_selectivity_1.CSSSelectivity(
|
|
132
|
-
const jsSelectivity = new js_selectivity_1.JSSelectivity(
|
|
132
|
+
const sessionId = await cdp.target.attachToTarget(cdpTargetId).then(r => r.sessionId);
|
|
133
|
+
const cssSelectivity = new css_selectivity_1.CSSSelectivity(cdp, sessionId, sourceRoot);
|
|
134
|
+
const jsSelectivity = new js_selectivity_1.JSSelectivity(cdp, sessionId, sourceRoot);
|
|
135
|
+
await Promise.all([
|
|
136
|
+
cdp.dom.enable(sessionId).then(() => cdp.css.enable(sessionId)),
|
|
137
|
+
cdp.target.setAutoAttach(sessionId, { autoAttach: true, waitForDebuggerOnStart: false }),
|
|
138
|
+
cdp.debugger.enable(sessionId),
|
|
139
|
+
cdp.page.enable(sessionId),
|
|
140
|
+
cdp.profiler.enable(sessionId),
|
|
141
|
+
]);
|
|
133
142
|
await Promise.allSettled([cssSelectivity.start(), jsSelectivity.start()]).then(async ([css, js]) => {
|
|
134
143
|
if (css.status === "rejected" || js.status === "rejected") {
|
|
135
144
|
await Promise.all([cssSelectivity.stop(true), jsSelectivity.stop(true)]);
|
|
@@ -137,13 +146,44 @@ const startSelectivity = async (browser) => {
|
|
|
137
146
|
throw new Error("Selectivity: Couldn't start selectivity", { cause: originalError });
|
|
138
147
|
}
|
|
139
148
|
});
|
|
149
|
+
let pageSwitchPromise = Promise.resolve();
|
|
150
|
+
let isSelectivityStopped = false;
|
|
151
|
+
const debuggerPausedFn = ({ callFrames }, eventCdpSessionId) => {
|
|
152
|
+
if (eventCdpSessionId !== sessionId) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (callFrames[0]?.functionName !== testplaneCoverageBreakScriptName || isSelectivityStopped) {
|
|
156
|
+
cdp.debugger.resume(sessionId).catch(() => { });
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
pageSwitchPromise = pageSwitchPromise.finally(() => Promise.all([cssSelectivity.takeCoverageSnapshot(), jsSelectivity.takeCoverageSnapshot()])
|
|
160
|
+
.catch(err => {
|
|
161
|
+
console.error("Selectivity: couldn't take snapshot while navigating:", err);
|
|
162
|
+
})
|
|
163
|
+
.then(() => {
|
|
164
|
+
cdp.debugger.resume(sessionId).catch(() => { });
|
|
165
|
+
}));
|
|
166
|
+
};
|
|
167
|
+
cdp.debugger.on("paused", debuggerPausedFn);
|
|
168
|
+
await cdp.page.addScriptToEvaluateOnNewDocument(sessionId, { source: scriptToEvaluateOnNewDocument });
|
|
140
169
|
/** @param drop only performs cleanup without writing anything. Should be "true" if test is failed */
|
|
141
170
|
return async function stopSelectivity(test, drop) {
|
|
142
|
-
|
|
171
|
+
isSelectivityStopped = true;
|
|
172
|
+
await pageSwitchPromise;
|
|
173
|
+
const [cssDependenciesPromise, jsDependenciesPromise] = await Promise.allSettled([
|
|
143
174
|
cssSelectivity.stop(drop),
|
|
144
175
|
jsSelectivity.stop(drop),
|
|
145
176
|
]);
|
|
146
|
-
|
|
177
|
+
cdp.debugger.off("paused", debuggerPausedFn);
|
|
178
|
+
cdp.target.detachFromTarget(sessionId).catch(() => { });
|
|
179
|
+
if (jsDependenciesPromise.status === "rejected") {
|
|
180
|
+
throw jsDependenciesPromise.reason;
|
|
181
|
+
}
|
|
182
|
+
if (cssDependenciesPromise.status === "rejected") {
|
|
183
|
+
throw cssDependenciesPromise.reason;
|
|
184
|
+
}
|
|
185
|
+
const cssDependencies = cssDependenciesPromise.value;
|
|
186
|
+
const jsDependencies = jsDependenciesPromise.value;
|
|
147
187
|
if (drop || (!cssDependencies?.size && !jsDependencies?.size)) {
|
|
148
188
|
return;
|
|
149
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/index.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA6B;AAC7B,wDAA0B;AAC1B,uDAAmD;AACnD,qDAAiD;AAEjD,yEAAuE;AAEvE,mCAAwG;AACxG,+CAA8C;AAC9C,mCAAsC;AACtC,mEAA4E;AAC5E,+CAA8C;AAE9C,4CAA+C;AAC/C,mCAAwE;AACxE,mCAA2C;AAC3C,6DAA2D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,15 +4,18 @@ export declare class JSSelectivity {
|
|
|
4
4
|
private readonly _cdp;
|
|
5
5
|
private readonly _sessionId;
|
|
6
6
|
private readonly _sourceRoot;
|
|
7
|
-
private _debuggerOnPausedFn;
|
|
8
7
|
private _debuggerOnScriptParsedFn;
|
|
9
8
|
private _scriptsSource;
|
|
10
9
|
private _scriptsSourceMap;
|
|
11
10
|
private _scriptIdToSourceUrl;
|
|
12
11
|
private _scriptIdToSourceMapUrl;
|
|
12
|
+
private _coverageResult;
|
|
13
13
|
constructor(cdp: CDP, sessionId: CDPSessionId, sourceRoot?: string);
|
|
14
14
|
private _processScript;
|
|
15
|
+
private _ensureScriptsAreLoading;
|
|
16
|
+
private _waitForLoadingScripts;
|
|
15
17
|
start(): Promise<void>;
|
|
18
|
+
takeCoverageSnapshot(): Promise<void>;
|
|
16
19
|
/** @param drop only performs cleanup without providing actual deps. Should be "true" if test is failed */
|
|
17
20
|
stop(drop?: boolean): Promise<Set<string> | null>;
|
|
18
21
|
}
|
|
@@ -13,18 +13,18 @@ const isSourceCodeFile = (sourceFileName) => {
|
|
|
13
13
|
};
|
|
14
14
|
class JSSelectivity {
|
|
15
15
|
constructor(cdp, sessionId, sourceRoot = "") {
|
|
16
|
-
this._debuggerOnPausedFn = null;
|
|
17
16
|
this._debuggerOnScriptParsedFn = null;
|
|
18
17
|
this._scriptsSource = {};
|
|
19
18
|
this._scriptsSourceMap = {};
|
|
20
19
|
this._scriptIdToSourceUrl = {};
|
|
21
20
|
this._scriptIdToSourceMapUrl = {};
|
|
21
|
+
this._coverageResult = [];
|
|
22
22
|
this._cdp = cdp;
|
|
23
23
|
this._sessionId = sessionId;
|
|
24
24
|
this._sourceRoot = sourceRoot;
|
|
25
25
|
}
|
|
26
|
-
_processScript({ scriptId, url, sourceMapURL }) {
|
|
27
|
-
if (!this._sessionId) {
|
|
26
|
+
_processScript({ scriptId, url, sourceMapURL }, cdpSessionId) {
|
|
27
|
+
if (!this._sessionId || cdpSessionId !== this._sessionId) {
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
this._scriptIdToSourceUrl[scriptId] ||= url;
|
|
@@ -72,23 +72,79 @@ class JSSelectivity {
|
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
// If we haven't got "scriptParsed" event for the script, pull up source code + source map manually
|
|
76
|
+
_ensureScriptsAreLoading(coverage) {
|
|
77
|
+
coverage.forEach(({ scriptId, url }) => {
|
|
78
|
+
const fixedUrl = url || this._scriptIdToSourceUrl[scriptId];
|
|
79
|
+
// Was processed with "this._processScript" or anonymous
|
|
80
|
+
if ((Object.hasOwn(this._scriptsSource, scriptId) && Object.hasOwn(this._scriptsSourceMap, scriptId)) ||
|
|
81
|
+
!fixedUrl) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Not dropping sources to fs the end of test (when "stop" is called) because we use it immediately
|
|
85
|
+
const scriptSourcePromise = this._cdp.debugger
|
|
86
|
+
.getScriptSource(this._sessionId, scriptId)
|
|
87
|
+
.then(({ scriptSource }) => {
|
|
88
|
+
(0, fs_cache_1.setCachedSelectivityFile)(fs_cache_1.CacheType.Asset, fixedUrl, scriptSource).catch(() => { });
|
|
89
|
+
return scriptSource;
|
|
90
|
+
})
|
|
91
|
+
.catch((err) => err);
|
|
92
|
+
this._scriptIdToSourceUrl[scriptId] ||= url;
|
|
93
|
+
this._scriptsSource[scriptId] ||= scriptSourcePromise;
|
|
94
|
+
this._scriptsSourceMap[scriptId] ||= scriptSourcePromise.then(async (sourceCode) => {
|
|
95
|
+
if (sourceCode instanceof Error) {
|
|
96
|
+
return sourceCode;
|
|
97
|
+
}
|
|
98
|
+
const sourceMapsStartIndex = sourceCode.lastIndexOf(constants_1.JS_SOURCE_MAP_URL_COMMENT);
|
|
99
|
+
const sourceMapsEndIndex = sourceCode.indexOf("\n", sourceMapsStartIndex);
|
|
100
|
+
// Source maps are not generated for this source file
|
|
101
|
+
if (sourceMapsStartIndex === -1) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const sourceMapURL = sourceMapsEndIndex === -1
|
|
105
|
+
? sourceCode.slice(sourceMapsStartIndex + constants_1.JS_SOURCE_MAP_URL_COMMENT.length)
|
|
106
|
+
: sourceCode.slice(sourceMapsStartIndex + constants_1.JS_SOURCE_MAP_URL_COMMENT.length, sourceMapsEndIndex);
|
|
107
|
+
if ((0, utils_1.isDataProtocol)(sourceMapURL)) {
|
|
108
|
+
return (0, utils_1.fetchTextWithBrowserFallback)(sourceMapURL, this._cdp.runtime, this._sessionId).catch((err) => err);
|
|
109
|
+
}
|
|
110
|
+
const resolvedSourceMapUrl = (0, node_url_1.resolve)(fixedUrl, sourceMapURL);
|
|
111
|
+
this._scriptIdToSourceMapUrl[scriptId] ||= resolvedSourceMapUrl;
|
|
112
|
+
try {
|
|
113
|
+
const cachedSourceMaps = await (0, fs_cache_1.getCachedSelectivityFile)(fs_cache_1.CacheType.Asset, resolvedSourceMapUrl);
|
|
114
|
+
if (cachedSourceMaps) {
|
|
115
|
+
return cachedSourceMaps;
|
|
116
|
+
}
|
|
117
|
+
const sourceMap = await (0, utils_1.fetchTextWithBrowserFallback)(resolvedSourceMapUrl, this._cdp.runtime, this._sessionId);
|
|
118
|
+
(0, fs_cache_1.setCachedSelectivityFile)(fs_cache_1.CacheType.Asset, resolvedSourceMapUrl, sourceMap).catch(() => { });
|
|
119
|
+
return sourceMap;
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
return err;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
78
125
|
});
|
|
126
|
+
}
|
|
127
|
+
async _waitForLoadingScripts() {
|
|
128
|
+
await Promise.all([
|
|
129
|
+
Promise.allSettled(Object.values(this._scriptsSource)),
|
|
130
|
+
Promise.allSettled(Object.values(this._scriptsSourceMap)),
|
|
131
|
+
]);
|
|
132
|
+
}
|
|
133
|
+
async start() {
|
|
79
134
|
const debuggerOnScriptParsedFn = (this._debuggerOnScriptParsedFn = this._processScript.bind(this));
|
|
80
135
|
const sessionId = this._sessionId;
|
|
81
|
-
this._cdp.debugger.on("paused", debuggerOnPaused);
|
|
82
136
|
this._cdp.debugger.on("scriptParsed", debuggerOnScriptParsedFn);
|
|
83
|
-
await
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
137
|
+
await this._cdp.profiler.startPreciseCoverage(sessionId, {
|
|
138
|
+
callCount: false,
|
|
139
|
+
detailed: false,
|
|
140
|
+
allowTriggeredUpdates: false,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async takeCoverageSnapshot() {
|
|
144
|
+
const coveragePart = await this._cdp.profiler.takePreciseCoverage(this._sessionId);
|
|
145
|
+
this._ensureScriptsAreLoading(coveragePart.result);
|
|
146
|
+
await this._waitForLoadingScripts();
|
|
147
|
+
this._coverageResult.push(...coveragePart.result);
|
|
92
148
|
}
|
|
93
149
|
/** @param drop only performs cleanup without providing actual deps. Should be "true" if test is failed */
|
|
94
150
|
async stop(drop) {
|
|
@@ -96,58 +152,11 @@ class JSSelectivity {
|
|
|
96
152
|
if (drop) {
|
|
97
153
|
return null;
|
|
98
154
|
}
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const fixedUrl = url || this._scriptIdToSourceUrl[scriptId];
|
|
103
|
-
// Was processed with "this._processScript" or anonymous
|
|
104
|
-
if ((this._scriptsSource[scriptId] && this._scriptsSourceMap[scriptId]) || !fixedUrl) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
// Not dropping sources to fs the end of test (when "stop" is called) because we use it immediately
|
|
108
|
-
const scriptSourcePromise = this._cdp.debugger
|
|
109
|
-
.getScriptSource(this._sessionId, scriptId)
|
|
110
|
-
.then(({ scriptSource }) => {
|
|
111
|
-
(0, fs_cache_1.setCachedSelectivityFile)(fs_cache_1.CacheType.Asset, fixedUrl, scriptSource).catch(() => { });
|
|
112
|
-
return scriptSource;
|
|
113
|
-
})
|
|
114
|
-
.catch((err) => err);
|
|
115
|
-
this._scriptIdToSourceUrl[scriptId] ||= url;
|
|
116
|
-
this._scriptsSource[scriptId] ||= scriptSourcePromise;
|
|
117
|
-
this._scriptsSourceMap[scriptId] ||= scriptSourcePromise.then(async (sourceCode) => {
|
|
118
|
-
if (sourceCode instanceof Error) {
|
|
119
|
-
return sourceCode;
|
|
120
|
-
}
|
|
121
|
-
const sourceMapsStartIndex = sourceCode.lastIndexOf(constants_1.JS_SOURCE_MAP_URL_COMMENT);
|
|
122
|
-
const sourceMapsEndIndex = sourceCode.indexOf("\n", sourceMapsStartIndex);
|
|
123
|
-
// Source maps are not generated for this source file
|
|
124
|
-
if (sourceMapsStartIndex === -1) {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
const sourceMapURL = sourceMapsEndIndex === -1
|
|
128
|
-
? sourceCode.slice(sourceMapsStartIndex + constants_1.JS_SOURCE_MAP_URL_COMMENT.length)
|
|
129
|
-
: sourceCode.slice(sourceMapsStartIndex + constants_1.JS_SOURCE_MAP_URL_COMMENT.length, sourceMapsEndIndex);
|
|
130
|
-
if ((0, utils_1.isDataProtocol)(sourceMapURL)) {
|
|
131
|
-
return (0, utils_1.fetchTextWithBrowserFallback)(sourceMapURL, this._cdp.runtime, this._sessionId).catch((err) => err);
|
|
132
|
-
}
|
|
133
|
-
const resolvedSourceMapUrl = (0, node_url_1.resolve)(fixedUrl, sourceMapURL);
|
|
134
|
-
this._scriptIdToSourceMapUrl[scriptId] ||= resolvedSourceMapUrl;
|
|
135
|
-
try {
|
|
136
|
-
const cachedSourceMaps = await (0, fs_cache_1.getCachedSelectivityFile)(fs_cache_1.CacheType.Asset, resolvedSourceMapUrl);
|
|
137
|
-
if (cachedSourceMaps) {
|
|
138
|
-
return cachedSourceMaps;
|
|
139
|
-
}
|
|
140
|
-
const sourceMap = await (0, utils_1.fetchTextWithBrowserFallback)(resolvedSourceMapUrl, this._cdp.runtime, this._sessionId);
|
|
141
|
-
(0, fs_cache_1.setCachedSelectivityFile)(fs_cache_1.CacheType.Asset, resolvedSourceMapUrl, sourceMap).catch(() => { });
|
|
142
|
-
return sourceMap;
|
|
143
|
-
}
|
|
144
|
-
catch (err) {
|
|
145
|
-
return err;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
});
|
|
155
|
+
const coverageLastPart = await this._cdp.profiler.takePreciseCoverage(this._sessionId);
|
|
156
|
+
const coverageScripts = [...this._coverageResult, ...coverageLastPart.result];
|
|
157
|
+
this._ensureScriptsAreLoading(coverageLastPart.result);
|
|
149
158
|
const totalDependingSourceFiles = new Set();
|
|
150
|
-
const grouppedByScriptCoverage = (0, lodash_1.groupBy)(
|
|
159
|
+
const grouppedByScriptCoverage = (0, lodash_1.groupBy)(coverageScripts, "scriptId");
|
|
151
160
|
const scriptIds = Object.keys(grouppedByScriptCoverage);
|
|
152
161
|
await Promise.all(scriptIds.map(async (scriptId) => {
|
|
153
162
|
const [source, sourceMaps] = await Promise.all([
|
|
@@ -192,7 +201,6 @@ class JSSelectivity {
|
|
|
192
201
|
return totalDependingSourceFiles;
|
|
193
202
|
}
|
|
194
203
|
finally {
|
|
195
|
-
this._debuggerOnPausedFn && this._cdp.debugger.off("paused", this._debuggerOnPausedFn);
|
|
196
204
|
this._debuggerOnScriptParsedFn && this._cdp.debugger.off("scriptParsed", this._debuggerOnScriptParsedFn);
|
|
197
205
|
}
|
|
198
206
|
}
|