Skip to content

Commit

Permalink
feat(coverage): option for raw V8 script coverage (#6454)
Browse files Browse the repository at this point in the history
  • Loading branch information
Quramy committed Sep 15, 2021
1 parent caa2b73 commit cb4470a
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 6 deletions.
37 changes: 31 additions & 6 deletions src/common/Coverage.ts
Expand Up @@ -45,6 +45,17 @@ export interface CoverageEntry {
ranges: Array<{ start: number; end: number }>;
}

/**
* The CoverageEntry class for JavaScript
* @public
*/
export interface JSCoverageEntry extends CoverageEntry {
/**
* Raw V8 script coverage entry.
*/
rawScriptCoverage?: Protocol.Profiler.ScriptCoverage;
}

/**
* Set of configurable options for JS coverage.
* @public
Expand All @@ -58,6 +69,10 @@ export interface JSCoverageOptions {
* Whether anonymous scripts generated by the page should be reported.
*/
reportAnonymousScripts?: boolean;
/**
* Whether the result includes raw V8 script coverage entries.
*/
includeRawScriptCoverage?: boolean;
}

/**
Expand Down Expand Up @@ -145,7 +160,7 @@ export class Coverage {
* JavaScript Coverage doesn't include anonymous scripts by default.
* However, scripts with sourceURLs are reported.
*/
async stopJSCoverage(): Promise<CoverageEntry[]> {
async stopJSCoverage(): Promise<JSCoverageEntry[]> {
return await this._jsCoverage.stop();
}

Expand Down Expand Up @@ -181,6 +196,7 @@ export class JSCoverage {
_eventListeners: PuppeteerEventListener[] = [];
_resetOnNavigation = false;
_reportAnonymousScripts = false;
_includeRawScriptCoverage = false;

constructor(client: CDPSession) {
this._client = client;
Expand All @@ -190,13 +206,18 @@ export class JSCoverage {
options: {
resetOnNavigation?: boolean;
reportAnonymousScripts?: boolean;
includeRawScriptCoverage?: boolean;
} = {}
): Promise<void> {
assert(!this._enabled, 'JSCoverage is already enabled');
const { resetOnNavigation = true, reportAnonymousScripts = false } =
options;
const {
resetOnNavigation = true,
reportAnonymousScripts = false,
includeRawScriptCoverage = false,
} = options;
this._resetOnNavigation = resetOnNavigation;
this._reportAnonymousScripts = reportAnonymousScripts;
this._includeRawScriptCoverage = includeRawScriptCoverage;
this._enabled = true;
this._scriptURLs.clear();
this._scriptSources.clear();
Expand All @@ -215,7 +236,7 @@ export class JSCoverage {
await Promise.all([
this._client.send('Profiler.enable'),
this._client.send('Profiler.startPreciseCoverage', {
callCount: false,
callCount: this._includeRawScriptCoverage,
detailed: true,
}),
this._client.send('Debugger.enable'),
Expand Down Expand Up @@ -248,7 +269,7 @@ export class JSCoverage {
}
}

async stop(): Promise<CoverageEntry[]> {
async stop(): Promise<JSCoverageEntry[]> {
assert(this._enabled, 'JSCoverage is not enabled');
this._enabled = false;

Expand Down Expand Up @@ -278,7 +299,11 @@ export class JSCoverage {
const flattenRanges = [];
for (const func of entry.functions) flattenRanges.push(...func.ranges);
const ranges = convertToDisjointRanges(flattenRanges);
coverage.push({ url, ranges, text });
if (!this._includeRawScriptCoverage) {
coverage.push({ url, ranges, text });
} else {
coverage.push({ url, ranges, text, rawScriptCoverage: entry });
}
}
return coverage;
}
Expand Down
35 changes: 35 additions & 0 deletions test/coverage.spec.ts
Expand Up @@ -157,6 +157,41 @@ describe('Coverage specs', function () {
expect(coverage.length).toBe(0);
});
});
describe('includeRawScriptCoverage', function () {
it('should not include rawScriptCoverage field when disabled', async () => {
const { page, server } = getTestState();
await page.coverage.startJSCoverage();
await page.goto(server.PREFIX + '/jscoverage/simple.html', {
waitUntil: 'networkidle0',
});
const coverage = await page.coverage.stopJSCoverage();
expect(coverage.length).toBe(1);
expect(coverage[0].rawScriptCoverage).toBeUndefined();
});
it('should include rawScriptCoverage field when enabled', async () => {
const { page, server } = getTestState();
await page.coverage.startJSCoverage({
includeRawScriptCoverage: true,
});
await page.goto(server.PREFIX + '/jscoverage/simple.html', {
waitUntil: 'networkidle0',
});
const coverage = await page.coverage.stopJSCoverage();
expect(coverage.length).toBe(1);
expect(coverage[0].rawScriptCoverage).toBeTruthy();
});
});
// @see https://crbug.com/990945
xit('should not hang when there is a debugger statement', async () => {
const { page, server } = getTestState();

await page.coverage.startJSCoverage();
await page.goto(server.EMPTY_PAGE);
await page.evaluate(() => {
debugger; // eslint-disable-line no-debugger
});
await page.coverage.stopJSCoverage();
});
});

describeChromeOnly('CSSCoverage', function () {
Expand Down

0 comments on commit cb4470a

Please sign in to comment.