UNPKG

chrome-devtools-frontend

Version:
157 lines (132 loc) • 4.98 kB
// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import * as Coverage from '../../panels/coverage/coverage.js'; import * as UI from '../../ui/legacy/legacy.js'; import {SourcesTestRunner} from '../sources_test_runner/sources_test_runner.js'; import {TestRunner} from '../test_runner/test_runner.js'; /** * @fileoverview using private properties isn't a Closure violation in tests. */ export const CoverageTestRunner = {}; /** * @param jsCoveragePerBlock - Collect per Block coverage if `true`, per function coverage otherwise. * @return {!Promise} */ CoverageTestRunner.startCoverage = async function(jsCoveragePerBlock) { UI.ViewManager.ViewManager.instance().showView('coverage'); const coverageView = Coverage.CoverageView.CoverageView.instance(); await coverageView.startRecording({reload: false, jsCoveragePerBlock}); }; /** * @return {!Promise} */ CoverageTestRunner.stopCoverage = function() { const coverageView = Coverage.CoverageView.CoverageView.instance(); return coverageView.stopRecording(); }; /** * @return {!Promise} */ CoverageTestRunner.suspendCoverageModel = async function() { const coverageView = Coverage.CoverageView.CoverageView.instance(); await coverageView.model.preSuspendModel(); await coverageView.model.suspendModel(); }; /** * @return {!Promise} */ CoverageTestRunner.resumeCoverageModel = async function() { const coverageView = Coverage.CoverageView.CoverageView.instance(); await coverageView.model.resumeModel(); await coverageView.model.postResumeModel(); }; /** * @return {!Promise} */ CoverageTestRunner.pollCoverage = async function() { const coverageView = Coverage.CoverageView.CoverageView.instance(); // Make sure not to have two instances of _pollAndCallback running at the same time. await coverageView.model.currentPollPromise; return coverageView.model.pollAndCallback(); }; /** * @return {!Promise<Coverage.CoverageModel.CoverageModel>} */ CoverageTestRunner.getCoverageModel = function() { const coverageView = Coverage.CoverageView.CoverageView.instance(); return coverageView.model; }; /** * @return {!Promise<string>} */ CoverageTestRunner.exportReport = async function() { const coverageView = Coverage.CoverageView.CoverageView.instance(); let data; await coverageView.model.exportReport({ write: d => { data = d; }, close: _ => 0 }); return data; }; /** * @return {!Promise<!SourceFrame.SourceFrame>} */ CoverageTestRunner.sourceDecorated = async function(source) { await UI.InspectorView.InspectorView.instance().showPanel('sources'); const decoratePromise = TestRunner.addSnifferPromise(Coverage.CoverageView.LineDecorator.prototype, 'innerDecorate'); const sourceFrame = await SourcesTestRunner.showScriptSourcePromise(source); await decoratePromise; return sourceFrame; }; CoverageTestRunner.dumpDecorations = async function(source) { const sourceFrame = await CoverageTestRunner.sourceDecorated(source); CoverageTestRunner.dumpDecorationsInSourceFrame(sourceFrame); }; /** * @return {?DataGrid.DataGridNode} */ CoverageTestRunner.findCoverageNodeForURL = function(url) { const coverageListView = Coverage.CoverageView.CoverageView.instance().listView; const rootNode = coverageListView.dataGrid.rootNode(); for (const child of rootNode.children) { if (child.coverageInfo.url().endsWith(url)) { return child; } } return null; }; CoverageTestRunner.dumpDecorationsInSourceFrame = function(sourceFrame) { const markerMap = new Map([['used', '+'], ['unused', '-']]); const codeMirror = sourceFrame.textEditor.codeMirror(); for (let line = 0; line < codeMirror.lineCount(); ++line) { const text = codeMirror.getLine(line); let markerType = ' '; const lineInfo = codeMirror.lineInfo(line); if (!lineInfo) { continue; } const gutterElement = lineInfo.gutterMarkers && lineInfo.gutterMarkers['CodeMirror-gutter-coverage']; if (gutterElement) { const markerClass = /^text-editor-coverage-(\w*)-marker$/.exec(gutterElement.classList)[1]; markerType = markerMap.get(markerClass) || gutterElement.classList; } TestRunner.addResult(`${line}: ${markerType} ${text}`); } }; CoverageTestRunner.dumpCoverageListView = function() { const coverageListView = Coverage.CoverageView.CoverageView.instance().listView; const dataGrid = coverageListView.dataGrid; dataGrid.updateInstantly(); for (const child of dataGrid.rootNode().children) { const data = child.coverageInfo; const url = TestRunner.formatters.formatAsURL(data.url()); if (url.startsWith('test://')) { continue; } const type = Coverage.CoverageListView.coverageTypeToString(data.type()); TestRunner.addResult(`${url} ${type} used: ${data.usedSize()} unused: ${data.unusedSize()} total: ${data.size()}`); } };