phantomas
Version:
Headless Chromium-based web performance metrics collector and monitoring tool
1,689 lines • 57.2 kB
JSON
{
"events": {
"milestone": {
"file": "/core/modules/navigationTiming/scope.js",
"desc": "Page loading milestone has been reached: domInteractive, domReady and domComplete",
"arguments": "eventName"
},
"send": {
"file": "/core/modules/requestsMonitor/requestsMonitor.js",
"desc": "request has been sent",
"arguments": "request"
},
"base64recv": {
"file": "/core/modules/requestsMonitor/requestsMonitor.js",
"desc": "base64-encoded \"response\" has been received",
"arguments": "entry, resp"
},
"recv": {
"file": "/core/modules/requestsMonitor/requestsMonitor.js",
"desc": "response has been received",
"arguments": "entry, resp"
},
"responseEnd": {
"file": "/core/modules/timeToFirstByte/timeToFirstByte.js",
"desc": "The first response (that was not a redirect) fully received",
"arguments": "entry, res"
},
"domQuery": {
"file": "/modules/domQueries/scope.js",
"desc": "DOM query has been made",
"arguments": "type, query, fnName, context, hasNoResults"
},
"consoleLog": {
"file": "/lib/browser.js",
"desc": "`console.log` has been called in page's scope",
"arguments": "msg"
},
"jserror": {
"file": "/lib/browser.js",
"desc": "Emitted when an uncaught exception happens within the page",
"arguments": "message, trace"
},
"request": {
"file": "/lib/browser.js",
"desc": "Emitted when page is about to send HTTP request",
"arguments": "request"
},
"response": {
"file": "/lib/browser.js",
"desc": "Emitted when page received a HTTP response",
"arguments": "response"
},
"loaded": {
"file": "/lib/browser.js",
"desc": "Emitted when the page has been fully loaded",
"arguments": "this.page"
},
"metrics": {
"file": "/lib/browser.js",
"desc": "Emitted when Chromuim's page.metrics() has been called",
"arguments": "metrics"
},
"init": {
"file": "/lib/index.js",
"desc": "Browser's scope and modules are set up, the page is about to be loaded",
"arguments": "page, browser.getPuppeteerBrowser("
},
"beforeClose": {
"file": "/lib/index.js",
"desc": "Called before the Chromium (and all of its pages) is closed",
"arguments": "page"
}
},
"extensions": {
"cookies": {
"file": "/extensions/cookies/cookies.js",
"desc": "Support for cookies",
"options": []
},
"devices": {
"file": "/extensions/devices/devices.js",
"desc": "Provides --phone, --phone-landscape, --tablet and --table-landscape options to force given device viewport and user agent.",
"options": []
},
"filmStrip": {
"file": "/extensions/filmStrip/filmStrip.js",
"desc": "Renders a serie of screenshots of page being loaded",
"options": []
},
"har": {
"file": "/extensions/har/har.js",
"desc": "Log requests for build HAR output\nDepends on windowPerformance module!",
"options": []
},
"httpAuth": {
"file": "/extensions/httpAuth/httpAuth.js",
"desc": "Support for HTTP authentication",
"options": []
},
"pageSource": {
"file": "/extensions/pageSource/pageSource.js",
"desc": "Saves the source of page being loaded to a file\nPlease note that saving each file takes a few ms.\nConsider increasing default timeout.\nRun phantomas with --page-source option to use this module.",
"options": []
},
"pageStorage": {
"file": "/extensions/pageStorage/pageStorage.js",
"desc": "",
"options": []
},
"postLoadDelay": {
"file": "/extensions/postLoadDelay/postLoadDelay.js",
"desc": "Delays report generation for a given time",
"options": []
},
"screenshot": {
"file": "/extensions/screenshot/screenshot.js",
"desc": "Renders a screenshot of the full page when it's fully loaded",
"options": []
},
"scroll": {
"file": "/extensions/scroll/scroll.js",
"desc": "Allow page to be scrolled after it is loaded\nPass --scroll as an option in CLI mode",
"options": []
},
"userAgent": {
"file": "/extensions/userAgent/userAgent.js",
"desc": "Sets a user agent according to --user-agent or --phone or --tablet options",
"options": []
},
"viewport": {
"file": "/extensions/viewport/viewport.js",
"desc": "Provides the --viewport option to set any device resolution and pixel density ratio.\nIf the user sets a viewport size as well as a device option (--phone, --tablet, ...),\nwe assume that he or she wants to overwrite the device values.\nTwo syntaxes are supported:\n - 1200x800 will set a 1x pixel density ratio\n - 1200x800x2 will set the given ratio (float values such as 1.5 are accepted)",
"options": []
},
"waitForEvent": {
"file": "/extensions/waitForEvent/waitForEvent.js",
"desc": "Delays report generation until given phantomas event is emitted (issue #453)",
"options": []
},
"waitForSelector": {
"file": "/extensions/waitForSelector/waitForSelector.js",
"desc": "Delays report generation until given CSS selector can be resolved (i.e. given element exists)",
"options": []
}
},
"modules": {
"navigationTiming": {
"file": "/core/modules/navigationTiming/navigationTiming.js",
"desc": "Emits \"milestone\" event on Navigation Timing related events:\n- domContentLoaded\n- domInteractive\n- domComplete\nCode taken from windowPerformance module",
"events": [],
"metrics": []
},
"requestsMonitor": {
"file": "/core/modules/requestsMonitor/requestsMonitor.js",
"desc": "Simple HTTP requests monitor and analyzer",
"events": [
"send",
"base64recv",
"recv"
],
"metrics": [
"requests",
"gzipRequests",
"postRequests",
"httpsRequests",
"notFound",
"bodySize",
"contentLength",
"httpTrafficCompleted"
]
},
"timeToFirstByte": {
"file": "/core/modules/timeToFirstByte/timeToFirstByte.js",
"desc": "Takes a look at \"time to first (last) byte\" metrics",
"events": [
"responseEnd"
],
"metrics": [
"timeToFirstByte",
"timeToLastByte"
]
},
"ajaxRequests": {
"file": "/modules/ajaxRequests/ajaxRequests.js",
"desc": "Analyzes AJAX requests",
"events": [],
"metrics": [
"ajaxRequests",
"synchronousXHR"
]
},
"alerts": {
"file": "/modules/alerts/alerts.js",
"desc": "Meters number of invocations of window.alert, window.confirm, and\nwindow.prompt.",
"events": [],
"metrics": [
"windowAlerts",
"windowConfirms",
"windowPrompts"
]
},
"analyzeCss": {
"file": "/modules/analyzeCss/analyzeCss.js",
"desc": "Adds CSS complexity metrics using analyze-css npm module.\nRun phantomas with --analyze-css option to use this module",
"events": [],
"metrics": [
"cssBase64Length",
"cssRedundantBodySelectors",
"redundantChildNodesSelectors",
"cssColors",
"cssComments",
"cssCommentsLength",
"cssComplexSelectorsByAttribute",
"cssDuplicatedSelectors",
"cssDuplicatedProperties",
"cssEmptyRules",
"cssExpressions",
"cssOldIEFixes",
"cssImports",
"cssImportants",
"cssMediaQueries",
"cssMultiClassesSelectors",
"cssOldPropertyPrefixes",
"cssQualifiedSelectors",
"cssSpecificityIdAvg",
"cssSpecificityIdTotal",
"cssSpecificityClassAvg",
"cssSpecificityClassTotal",
"cssSpecificityTagAvg",
"cssSpecificityTagTotal",
"cssSelectorsByAttribute",
"cssSelectorsByClass",
"cssSelectorsById",
"cssSelectorsByPseudo",
"cssSelectorsByTag",
"cssLength",
"cssRules",
"cssSelectors",
"cssDeclarations",
"cssNotMinified",
"cssSelectorLengthAvg",
"cssParsingErrors",
"cssInlineStyles"
]
},
"analyzeImages": {
"file": "/modules/analyzeImages/analyzeImages.js",
"desc": "Adds Responsive Images metrics using analyze-images npm module.\nRun phantomas with --analyze-images option to use this module",
"events": [],
"metrics": [
"imagesWithoutDimensions",
"imagesNotOptimized",
"imagesScaledDown",
"imagesOldFormat",
"imagesExcessiveDensity",
"imagesWithIncorrectSizesParam"
]
},
"assetsTypes": {
"file": "/modules/assetsTypes/assetsTypes.js",
"desc": "Analyzes number of requests and sizes of different types of assets",
"events": [],
"metrics": [
"htmlCount",
"htmlSize",
"cssCount",
"cssSize",
"jsCount",
"jsSize",
"jsonCount",
"jsonSize",
"imageCount",
"imageSize",
"webfontCount",
"webfontSize",
"videoCount",
"videoSize",
"base64Count",
"base64Size",
"otherCount",
"otherSize"
]
},
"blockDomains": {
"file": "/modules/blockDomains/blockDomains.js",
"desc": "Aborts requests to external resources or given domains\nDoes not emit any metrics",
"events": [],
"metrics": [
"blockedRequests"
]
},
"cacheHits": {
"file": "/modules/cacheHits/cacheHits.js",
"desc": "Analyzes Age and X-Cache headers from caching servers like Squid or Varnish",
"events": [],
"metrics": [
"cacheHits",
"cacheMisses",
"cachePasses"
]
},
"caching": {
"file": "/modules/caching/caching.js",
"desc": "Analyzes HTTP caching headers",
"events": [],
"metrics": [
"oldCachingHeaders",
"cachingNotSpecified",
"cachingTooShort",
"cachingDisabled",
"cachingUseImmutable"
]
},
"console": {
"file": "/modules/console/console.js",
"desc": "Meters number of console logs",
"events": [],
"metrics": [
"consoleMessages"
]
},
"cookies": {
"file": "/modules/cookies/cookies.js",
"desc": "cookies metrics",
"events": [],
"metrics": [
"cookiesSent",
"cookiesRecv",
"domainsWithCookies",
"documentCookiesLength",
"documentCookiesCount"
]
},
"cpuTasks": {
"file": "/modules/cpuTasks/cpuTasks.js",
"desc": "",
"events": [],
"metrics": [
"layoutCount",
"layoutDuration",
"recalcStyleCount",
"recalcStyleDuration",
"scriptDuration",
"taskDuration"
]
},
"documentHeight": {
"file": "/modules/documentHeight/documentHeight.js",
"desc": "Measure document height",
"events": [],
"metrics": [
"documentHeight"
]
},
"domains": {
"file": "/modules/domains/domains.js",
"desc": "Domains monitor",
"events": [],
"metrics": [
"domains",
"maxRequestsPerDomain",
"medianRequestsPerDomain"
]
},
"domComplexity": {
"file": "/modules/domComplexity/domComplexity.js",
"desc": "Analyzes DOM complexity",
"events": [],
"metrics": [
"bodyHTMLSize",
"commentsSize",
"whiteSpacesSize",
"DOMelementsCount",
"DOMelementMaxDepth",
"nodesWithInlineCSS",
"iframesCount",
"DOMidDuplicated"
]
},
"domHiddenContent": {
"file": "/modules/domHiddenContent/domHiddenContent.js",
"desc": "Analyzes DOM hidden content",
"events": [],
"metrics": [
"hiddenContentSize",
"hiddenImages"
]
},
"domMutations": {
"file": "/modules/domMutations/domMutations.js",
"desc": "Analyzes DOM changes via MutationObserver API",
"events": [],
"metrics": [
"DOMmutationsInserts",
"DOMmutationsRemoves",
"DOMmutationsAttributes"
]
},
"domQueries": {
"file": "/modules/domQueries/domQueries.js",
"desc": "Analyzes DOM queries done via native DOM methods",
"events": [],
"metrics": [
"DOMqueries",
"DOMqueriesWithoutResults",
"DOMqueriesById",
"DOMqueriesByClassName",
"DOMqueriesByTagName",
"DOMqueriesByQuerySelectorAll",
"DOMinserts",
"DOMqueriesDuplicated",
"DOMqueriesAvoidable"
]
},
"events": {
"file": "/modules/events/events.js",
"desc": "Analyzes events bound to DOM elements",
"events": [],
"metrics": [
"eventsBound",
"eventsDispatched",
"eventsScrollBound"
]
},
"globalVariables": {
"file": "/modules/globalVariables/globalVariables.js",
"desc": "Counts global JavaScript variables",
"events": [],
"metrics": [
"globalVariables",
"globalVariablesFalsy"
]
},
"headers": {
"file": "/modules/headers/headers.js",
"desc": "Analyzes HTTP headers in both requests and responses",
"events": [],
"metrics": [
"headersCount",
"headersSentCount",
"headersRecvCount",
"headersSize",
"headersSentSize",
"headersRecvSize",
"headersBiggerThanContent"
]
},
"javaScriptBottlenecks": {
"file": "/modules/javaScriptBottlenecks/javaScriptBottlenecks.js",
"desc": "Reports the use of functions known to be serious performance bottlenecks in JS\nRun phantomas with --spy-eval to count eval() calls (see issue #467)",
"events": [],
"metrics": [
"documentWriteCalls",
"evalCalls"
]
},
"jQuery": {
"file": "/modules/jQuery/jQuery.js",
"desc": "Analyzes jQuery activity",
"events": [],
"metrics": [
"jQueryVersion",
"jQueryVersionsLoaded",
"jQueryOnDOMReadyFunctions",
"jQueryWindowOnLoadFunctions",
"jQuerySizzleCalls",
"jQueryEventTriggers",
"jQueryDOMReads",
"jQueryDOMWrites",
"jQueryDOMWriteReadSwitches"
]
},
"jserrors": {
"file": "/modules/jserrors/jserrors.js",
"desc": "Meters the number of page errors, and provides traces as offenders for \"jsErrors\" metric",
"events": [],
"metrics": [
"jsErrors"
]
},
"keepAlive": {
"file": "/modules/keepAlive/keepAlive.js",
"desc": "Analyzes if HTTP responses keep the connections alive.",
"events": [],
"metrics": [
"closedConnections"
]
},
"lazyLoadableImages": {
"file": "/modules/lazyLoadableImages/lazyLoadableImages.js",
"desc": "Analyzes images and detects which one can be lazy-loaded (are below the fold)",
"events": [],
"metrics": [
"lazyLoadableImagesBelowTheFold"
]
},
"localStorage": {
"file": "/modules/localStorage/localStorage.js",
"desc": "localStorage metrics",
"events": [],
"metrics": [
"localStorageEntries"
]
},
"mainRequest": {
"file": "/modules/mainRequest/mainRequest.js",
"desc": "Analyzes bits of data pertaining to the main request only",
"events": [],
"metrics": [
"statusCodesTrail"
]
},
"protocols": {
"file": "/modules/protocols/protocols.js",
"desc": "Checks versions of HTTP and TLS protocols",
"events": [],
"metrics": [
"mainDomainHttpProtocol",
"oldHttpProtocol",
"mainDomainTlsProtocol",
"oldTlsProtocol"
]
},
"redirects": {
"file": "/modules/redirects/redirects.js",
"desc": "Analyzes HTTP redirects",
"events": [],
"metrics": [
"redirects",
"redirectsTime"
]
},
"requestsStats": {
"file": "/modules/requestsStats/requestsStats.js",
"desc": "Analyzes HTTP requests and generates stats metrics",
"events": [],
"metrics": [
"smallestResponse",
"biggestResponse",
"fastestResponse",
"slowestResponse",
"smallestLatency",
"biggestLatency",
"medianResponse",
"medianLatency"
]
},
"requestsTo": {
"file": "/modules/requestsTo/requestsTo.js",
"desc": "Number of requests it took to make the page enter DomContentLoaded and DomComplete states accordingly",
"events": [],
"metrics": [
"requestsToFirstPaint",
"domainsToFirstPaint",
"requestsToDomContentLoaded",
"domainsToDomContentLoaded",
"requestsToDomComplete",
"domainsToDomComplete"
]
},
"staticAssets": {
"file": "/modules/staticAssets/staticAssets.js",
"desc": "Analyzes static assets (CSS, JS and images)",
"events": [],
"metrics": [
"assetsNotGzipped",
"assetsWithQueryString",
"assetsWithCookies",
"smallImages",
"smallCssFiles",
"smallJsFiles",
"multipleRequests"
]
},
"timeToFirst": {
"file": "/modules/timeToFirst/timeToFirst.js",
"desc": "Provides metrics for time to first image, CSS and JS file",
"events": [],
"metrics": [
"timeToFirstCss",
"timeToFirstJs",
"timeToFirstImage"
]
},
"windowPerformance": {
"file": "/modules/windowPerformance/windowPerformance.js",
"desc": "Measure when the page reaches certain states",
"events": [],
"metrics": [
"domInteractive",
"domContentLoaded",
"domContentLoadedEnd",
"domComplete",
"performanceTimingConnect",
"performanceTimingDNS",
"performanceTimingPageLoad",
"performanceTimingTTFB",
"timeBackend",
"timeFrontend"
]
}
},
"metrics": {
"requests": {
"desc": "total number of HTTP requests made",
"offenders": true,
"unit": "number",
"module": "requestsMonitor",
"testsCovered": true
},
"gzipRequests": {
"desc": "number of gzipped HTTP responses",
"unreliable": true,
"offenders": true,
"unit": "number",
"module": "requestsMonitor",
"testsCovered": true
},
"postRequests": {
"desc": "number of POST requests",
"offenders": true,
"unit": "number",
"module": "requestsMonitor",
"testsCovered": true
},
"httpsRequests": {
"desc": "number of HTTPS requests",
"offenders": true,
"unit": "number",
"module": "requestsMonitor",
"testsCovered": true
},
"notFound": {
"desc": "number of HTTP 404 responses",
"offenders": true,
"unit": "number",
"module": "requestsMonitor",
"testsCovered": true
},
"bodySize": {
"desc": "size of the uncompressed content of all responses",
"unit": "bytes",
"module": "requestsMonitor",
"testsCovered": true
},
"contentLength": {
"desc": "size of the compressed content of all responses, i.e. what was transfered in packets",
"unit": "bytes",
"module": "requestsMonitor",
"testsCovered": true
},
"httpTrafficCompleted": {
"desc": "time it took to receive the last byte of the last HTTP response",
"unit": "ms",
"module": "requestsMonitor",
"testsCovered": false
},
"timeToFirstByte": {
"desc": "time it took to receive the first byte of the first response (that was not a redirect)",
"unit": "ms",
"module": "timeToFirstByte",
"testsCovered": false
},
"timeToLastByte": {
"desc": "time it took to receive the last byte of the first response (that was not a redirect)",
"unit": "ms",
"module": "timeToFirstByte",
"testsCovered": false
},
"ajaxRequests": {
"desc": "number of AJAX requests",
"offenders": true,
"unit": "number",
"module": "ajaxRequests",
"testsCovered": true
},
"synchronousXHR": {
"desc": "number of synchronous XMLHttpRequest",
"offenders": true,
"unit": "number",
"module": "ajaxRequests",
"testsCovered": true
},
"windowAlerts": {
"desc": "number of calls to window.alert",
"offenders": true,
"unit": "number",
"module": "alerts",
"testsCovered": true
},
"windowConfirms": {
"desc": "number of calls to window.confirm",
"offenders": true,
"unit": "number",
"module": "alerts",
"testsCovered": true
},
"windowPrompts": {
"desc": "number of calls to window.prompt",
"offenders": true,
"unit": "number",
"module": "alerts",
"testsCovered": true
},
"cssBase64Length": {
"desc": "total length of base64-encoded data in CSS source (will warn about base64-encoded data bigger than 4 kB)",
"optional": true,
"offenders": true,
"unit": "bytes",
"module": "analyzeCss",
"testsCovered": false
},
"cssRedundantBodySelectors": {
"desc": "number of redundant body selectors (e.g. body .foo, section body h2, but not body > h1)",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"redundantChildNodesSelectors": {
"desc": "number of redundant child nodes selectors",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssColors": {
"desc": "number of unique colors used in CSS",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssComments": {
"desc": "number of comments in CSS source",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssCommentsLength": {
"desc": "length of comments content in CSS source",
"optional": true,
"unit": "bytes",
"module": "analyzeCss",
"testsCovered": false
},
"cssComplexSelectorsByAttribute": {
"desc": "number of selectors with complex matching by attribute (e.g. [class$=\"foo\"])",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssDuplicatedSelectors": {
"desc": "number of CSS selectors defined more than once in CSS source",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": true
},
"cssDuplicatedProperties": {
"desc": "number of CSS property definitions duplicated within a selector",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssEmptyRules": {
"desc": "number of rules with no properties (e.g. .foo { })",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssExpressions": {
"desc": "number of rules with CSS expressions (e.g. expression( document.body.clientWidth > 600 ? \"600px\" : \"auto\" ))",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssOldIEFixes": {
"desc": "number of fixes for old versions of Internet Explorer (e.g. * html .foo {} and .foo { *zoom: 1 })",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssImports": {
"desc": "number of @import rules",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssImportants": {
"desc": "number of properties with value forced by !important",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": true
},
"cssMediaQueries": {
"desc": "number of media queries (e.g. @media screen and (min-width: 1370px))",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssMultiClassesSelectors": {
"desc": "number of selectors with multiple classes (e.g. span.foo.bar)",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssOldPropertyPrefixes": {
"desc": "number of properties with no longer needed vendor prefix, powered by data provided by autoprefixer (e.g. --moz-border-radius)",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssQualifiedSelectors": {
"desc": "number of qualified selectors (e.g. header#nav, .foo#bar, h1.title)",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSpecificityIdAvg": {
"desc": "average specificity for ID",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSpecificityIdTotal": {
"desc": "total specificity for ID",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSpecificityClassAvg": {
"desc": "average specificity for class, pseudo-class or attribute",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSpecificityClassTotal": {
"desc": "total specificity for class, pseudo-class or attribute",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSpecificityTagAvg": {
"desc": "average specificity for element",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSpecificityTagTotal": {
"desc": "total specificity for element",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSelectorsByAttribute": {
"desc": "number of selectors by attribute (e.g. .foo[value=bar])",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSelectorsByClass": {
"desc": "number of selectors by class",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSelectorsById": {
"desc": "number of selectors by ID",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSelectorsByPseudo": {
"desc": "number of pseudo-selectors (e,g. :hover)",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSelectorsByTag": {
"desc": "number of selectors by tag name",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssLength": {
"desc": "length of CSS source (in bytes)",
"optional": true,
"offenders": true,
"unit": "bytes",
"module": "analyzeCss",
"testsCovered": true
},
"cssRules": {
"desc": "number of rules (e.g. .foo, .bar { color: red } is counted as one rule)",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": true
},
"cssSelectors": {
"desc": "number of selectors (e.g. .foo, .bar { color: red } is counted as two selectors - .foo and .bar)",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssDeclarations": {
"desc": "number of declarations (e.g. .foo, .bar { color: red } is counted as one declaration - color: red)",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssNotMinified": {
"desc": "set to 1 if the provided CSS is not minified",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssSelectorLengthAvg": {
"desc": "average length of selector (e.g. for ``.foo .bar, #test div > span { color: red }`` will be set as 2.5)",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": false
},
"cssParsingErrors": {
"desc": "number of CSS files (or embeded CSS) that failed to be parse by analyze-css",
"optional": true,
"offenders": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": true
},
"cssInlineStyles": {
"desc": "number of inline styles",
"optional": true,
"unit": "number",
"module": "analyzeCss",
"testsCovered": true
},
"imagesWithoutDimensions": {
"desc": "number of <img> nodes without both width and height attribute",
"offenders": true,
"unit": "number",
"module": "analyzeImages",
"testsCovered": true
},
"imagesNotOptimized": {
"desc": "number of loaded images that could be lighter it optimized",
"offenders": true,
"unit": "number",
"module": "analyzeImages",
"testsCovered": true
},
"imagesScaledDown": {
"desc": "number of loaded images scaled down when displayed",
"offenders": true,
"unit": "number",
"module": "analyzeImages",
"testsCovered": true
},
"imagesOldFormat": {
"desc": "number of loaded images that could benefit from new generation formats (WebP or AVIF)",
"offenders": true,
"unit": "number",
"module": "analyzeImages",
"testsCovered": true
},
"imagesExcessiveDensity": {
"desc": "number of images that could be served smaller as the human eye can hardly see the difference",
"offenders": true,
"unit": "number",
"module": "analyzeImages",
"testsCovered": false
},
"imagesWithIncorrectSizesParam": {
"desc": "number of responsive images with an improperly set sizes parameter",
"offenders": true,
"unit": "number",
"module": "analyzeImages",
"testsCovered": true
},
"htmlCount": {
"desc": "number of HTML responses",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": true
},
"htmlSize": {
"desc": "size of HTML responses (with compression)",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": true
},
"cssCount": {
"desc": "number of CSS responses",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": true
},
"cssSize": {
"desc": "size of CSS responses (with compression)",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": true
},
"jsCount": {
"desc": "number of JS responses",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": true
},
"jsSize": {
"desc": "size of JS responses (with compression)",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": true
},
"jsonCount": {
"desc": "number of JSON responses",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": true
},
"jsonSize": {
"desc": "size of JSON responses (with compression)",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": true
},
"imageCount": {
"desc": "number of image responses",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": true
},
"imageSize": {
"desc": "size of image responses (with compression)",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": true
},
"webfontCount": {
"desc": "number of web font responses",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": true
},
"webfontSize": {
"desc": "size of web font responses (with compression)",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": false
},
"videoCount": {
"desc": "number of video responses",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": true
},
"videoSize": {
"desc": "size of video responses (with compression)",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": true
},
"base64Count": {
"desc": "number of base64 encoded \"responses\" (no HTTP request was actually made)",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": true
},
"base64Size": {
"desc": "size of base64 encoded responses",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": true
},
"otherCount": {
"desc": "number of other responses",
"offenders": true,
"unit": "number",
"module": "assetsTypes",
"testsCovered": false
},
"otherSize": {
"desc": "size of other responses (with compression)",
"unit": "bytes",
"module": "assetsTypes",
"testsCovered": false
},
"blockedRequests": {
"desc": "number of requests blocked due to domain filtering",
"optional": true,
"offenders": true,
"unit": "number",
"module": "blockDomains",
"testsCovered": true
},
"cacheHits": {
"desc": "number of cache hits",
"offenders": true,
"unit": "number",
"module": "cacheHits",
"testsCovered": false
},
"cacheMisses": {
"desc": "number of cache misses",
"offenders": true,
"unit": "number",
"module": "cacheHits",
"testsCovered": false
},
"cachePasses": {
"desc": "number of cache passes",
"offenders": true,
"unit": "number",
"module": "cacheHits",
"testsCovered": false
},
"oldCachingHeaders": {
"desc": "number of responses with old, HTTP 1.0 caching headers (Expires and Pragma)",
"offenders": true,
"unit": "number",
"module": "caching",
"testsCovered": false
},
"cachingNotSpecified": {
"desc": "number of responses with no caching header sent (no Cache-Control header)",
"offenders": true,
"unit": "number",
"module": "caching",
"testsCovered": false
},
"cachingTooShort": {
"desc": "number of responses with too short (less than a week) caching time",
"offenders": true,
"unit": "number",
"module": "caching",
"testsCovered": true
},
"cachingDisabled": {
"desc": "number of responses with caching disabled (max-age=0)",
"offenders": true,
"unit": "number",
"module": "caching",
"testsCovered": false
},
"cachingUseImmutable": {
"desc": "number of responses with a long TTL that can benefit from Cache-Control: immutable",
"offenders": true,
"unit": "number",
"module": "caching",
"testsCovered": false
},
"consoleMessages": {
"desc": "number of calls to console.* functions",
"offenders": true,
"unit": "number",
"module": "console",
"testsCovered": true
},
"cookiesSent": {
"desc": "length of cookies sent in HTTP requests",
"unreliable": true,
"unit": "bytes",
"module": "cookies",
"testsCovered": false
},
"cookiesRecv": {
"desc": "length of cookies received in HTTP responses",
"unit": "bytes",
"module": "cookies",
"testsCovered": false
},
"domainsWithCookies": {
"desc": "number of domains with cookies set",
"offenders": true,
"unit": "number",
"module": "cookies",
"testsCovered": false
},
"documentCookiesLength": {
"desc": "length of document.cookie",
"unit": "bytes",
"module": "cookies",
"testsCovered": false
},
"documentCookiesCount": {
"desc": "number of cookies in document.cookie",
"unit": "number",
"module": "cookies",
"testsCovered": false
},
"layoutCount": {
"desc": "total number of full or partial page layout",
"unit": "number",
"module": "cpuTasks",
"testsCovered": false
},
"layoutDuration": {
"desc": "combined durations of all page layouts",
"unit": "ms",
"module": "cpuTasks",
"testsCovered": false
},
"recalcStyleCount": {
"desc": "total number of page style recalculations",
"unit": "number",
"module": "cpuTasks",
"testsCovered": false
},
"recalcStyleDuration": {
"desc": "combined duration of style recalculations",
"unit": "ms",
"module": "cpuTasks",
"testsCovered": false
},
"scriptDuration": {
"desc": "combined duration of JavaScript execution",
"unit": "ms",
"module": "cpuTasks",
"testsCovered": false
},
"taskDuration": {
"desc": "combined duration of all tasks performed by the browser",
"unit": "ms",
"module": "cpuTasks",
"testsCovered": false
},
"documentHeight": {
"desc": "the page height",
"unit": "px",
"module": "documentHeight",
"testsCovered": true
},
"domains": {
"desc": "number of domains used to fetch the page",
"offenders": true,
"unit": "number",
"module": "domains",
"testsCovered": true
},
"maxRequestsPerDomain": {
"desc": "maximum number of requests fetched from a single domain",
"unit": "number",
"module": "domains",
"testsCovered": true
},
"medianRequestsPerDomain": {
"desc": "median of number of requests fetched from each domain",
"unit": "number",
"module": "domains",
"testsCovered": false
},
"bodyHTMLSize": {
"desc": "the size of body tag content (document.body.innerHTML.length)",
"unit": "bytes",
"module": "domComplexity",
"testsCovered": true
},
"commentsSize": {
"desc": "the size of HTML comments on the page",
"offenders": true,
"unit": "bytes",
"module": "domComplexity",
"testsCovered": true
},
"whiteSpacesSize": {
"desc": "the size of text nodes with whitespaces only",
"unit": "bytes",
"module": "domComplexity",
"testsCovered": true
},
"DOMelementsCount": {
"desc": "total number of HTML element nodes",
"unit": "number",
"module": "domComplexity",
"testsCovered": true
},
"DOMelementMaxDepth": {
"desc": "maximum level on nesting of HTML element node",
"offenders": true,
"unit": "number",
"module": "domComplexity",
"testsCovered": true
},
"nodesWithInlineCSS": {
"desc": "number of nodes with inline CSS styling (with style attribute)",
"offenders": true,
"unit": "number",
"module": "domComplexity",
"testsCovered": true
},
"iframesCount": {
"desc": "number of iframe nodes",
"offenders": true,
"unit": "number",
"module": "domComplexity",
"testsCovered": true
},
"DOMidDuplicated": {
"desc": "number of duplicated IDs found in DOM",
"offenders": true,
"unit": "number",
"module": "domComplexity",
"testsCovered": true
},
"hiddenContentSize": {
"desc": "the size of content of hidden elements on the page (with CSS display: none)",
"offenders": true,
"unit": "bytes",
"module": "domHiddenContent",
"testsCovered": true
},
"hiddenImages": {
"desc": "number of hidden images that can be lazy-loaded",
"offenders": true,
"unit": "number",
"module": "domHiddenContent",
"testsCovered": true
},
"DOMmutationsInserts": {
"desc": "number of <body> node inserts",
"offenders": true,
"unit": "number",
"module": "domMutations",
"testsCovered": true
},
"DOMmutationsRemoves": {
"desc": "number of <body> node removes",
"offenders": true,
"unit": "number",
"module": "domMutations",
"testsCovered": true
},
"DOMmutationsAttributes": {
"desc": "number of DOM nodes attributes changes",
"offenders": true,
"unit": "number",
"module": "domMutations",
"testsCovered": true
},
"DOMqueries": {
"desc": "number of all DOM queries",
"offenders": true,
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"DOMqueriesWithoutResults": {
"desc": "number of DOM queries that returned nothing",
"offenders": true,
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"DOMqueriesById": {
"desc": "number of document.getElementById calls",
"offenders": true,
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"DOMqueriesByClassName": {
"desc": "number of document.getElementsByClassName calls",
"offenders": true,
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"DOMqueriesByTagName": {
"desc": "number of document.getElementsByTagName calls",
"offenders": true,
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"DOMqueriesByQuerySelectorAll": {
"desc": "number of document.querySelector(All) calls",
"offenders": true,
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"DOMinserts": {
"desc": "number of DOM nodes inserts",
"offenders": true,
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"DOMqueriesDuplicated": {
"desc": "number of DOM queries called more than once",
"offenders": true,
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"DOMqueriesAvoidable": {
"desc": "number of repeated uses of a duplicated query",
"unit": "number",
"module": "domQueries",
"testsCovered": true
},
"eventsBound": {
"desc": "number of EventTarget.addEventListener calls",
"offenders": true,
"unit": "number",
"module": "events",
"testsCovered": true
},
"eventsDispatched": {
"desc": "number of EventTarget.dispatchEvent calls",
"offenders": true,
"unit": "number",
"module": "events",
"testsCovered": true
},
"eventsScrollBound": {
"desc": "number of scroll event bounds",
"offenders": true,
"unit": "number",
"module": "events",
"testsCovered": true
},
"globalVariables": {
"desc": "number of JS globals variables",
"offenders": true,
"unit": "number",
"module": "globalVariables",
"testsCovered": true
},
"globalVariablesFalsy": {
"desc": "number of JS globals variables with falsy value",
"offenders": true,
"unit": "number",
"module": "globalVariables",
"testsCovered": true
},
"headersCount": {
"desc": "number of requests and responses headers",
"unit": "number",
"module": "headers",
"testsCovered": true
},
"headersSentCount": {
"desc": "number of headers sent in requests",
"unit": "number",
"module": "headers",
"testsCovered": true
},
"headersRecvCount": {
"desc": "number of headers received in responses",
"unit": "number",
"module": "headers",
"testsCovered": true
},
"headersSize": {
"desc": "size of all headers",
"unit": "bytes",
"module": "headers",
"testsCovered": false
},
"headersSentSize": {
"desc": "size of sent headers",
"unit": "bytes",
"module": "headers",
"testsCovered": false
},
"headersRecvSize": {
"desc": "size of received headers",
"unit": "bytes",
"module": "headers",
"testsCovered": true
},
"headersBiggerThanContent": {
"desc": "number of responses with headers part bigger than the response body",
"offenders": true,
"unit": "number",
"module": "headers",
"testsCovered": false
},
"documentWriteCalls": {
"desc": "number of calls to either document.write or document.writeln",
"offenders": true,
"unit": "number",
"module": "javaScriptBottlenecks",
"testsCovered": true
},
"evalCalls": {
"desc": "number of calls to eval (either direct or via setTimeout / setInterval)",
"offenders": true,
"unit": "number",
"module": "javaScriptBottlenecks",
"testsCovered": true
},
"jQueryVersion": {
"desc": "version of jQuery framework (if loaded)",
"unit": "string",
"module": "jQuery",
"testsCovered": true
},
"jQueryVersionsLoaded": {
"desc": "number of loaded jQuery \"instances\" (even in the same version)",
"offenders": true,
"unit": "number",
"module": "jQuery",
"testsCovered": true
},
"jQueryOnDOMReadyFunctions": {
"desc": "number of functions bound to onDOMReady event",
"offenders": true,
"unit": "number",
"module": "jQuery",
"testsCovered": true
},
"jQueryWindowOnLoadFunctions": {
"desc": "number of functions bound to windowOnLoad event",
"offenders": true,
"unit": "number",
"module": "jQuery",
"testsCovered": true
},
"jQuerySizzleCalls": {
"desc": "number of calls to Sizzle (including those that will be resolved using querySelectorAll)",
"offenders": true,
"unit": "number",
"module": "jQuery",
"testsCovered": true
},
"jQueryEventTriggers": {
"desc": "number of jQuery event triggers",
"offenders": true,
"unit": "number",
"module": "jQuery",
"testsCovered": true
},
"jQueryDOMReads": {
"desc": "number of DOM read operations",
"offenders": true,
"unit": "number",
"module": "jQuery",
"testsCovered": true
},
"jQueryDOMWrites": {
"desc": "number of DOM write operations",
"offenders": true,
"unit": "number",
"module": "jQuery",
"testsCovered": true
},
"jQueryDOMWriteReadSwitches": {
"desc": "number of read operations that follow a series of write operations (will cause repaint and can cause reflow)",
"offenders": true,
"unit": "number",
"module": "jQuery",
"testsCovered": true
},
"jsErrors": {
"desc": "number of JavaScript errors",
"offenders": true,
"unit": "number",
"module": "jserrors",
"testsCovered": true
},
"closedConnections": {
"desc": "number of requests not keeping the connection alive and slowing down the next request",
"offenders": true,
"unit": "number",
"module": "keepAlive",
"testsCovered": false
},
"lazyLoadableImagesBelowTheFold": {
"desc": "number of images displayed below the fold that can be lazy-loaded",
"offenders": true,
"unit": "number",
"module": "lazyLoadableImages",
"testsCovered": true
},
"localStorageEntries": {
"desc": "number of entries in local storage",
"offenders": true,
"unit": "number",
"module": "localStorage",
"testsCovered": true
},
"statusCodesTrail": {
"desc": "comma-separated list of HTTP status codes that main request followed through (could contain a single element if the main request is a terminal one)",
"unit": "string",
"module": "mainRequest",
"testsCovered": false
},
"mainDomainHttpProtocol": {
"desc": "HTTP protocol used by the main domain",
"unit": "string",
"module": "protocols",
"testsCovered": true
},
"oldHttpProtocol": {
"desc": "number of domains using HTTP/1.0 or 1.1",
"offenders": true,
"unit": "number",
"module": "protocols",
"testsCovered": true
},
"mainDomainTlsProtocol": {
"desc": "TLS protocol used by the main domain",
"unit": "string",
"module": "protocols",
"testsCovered": true
},
"oldTlsProtocol": {
"desc": "number of domains using TLS 1.2",
"offenders": true,
"unit": "number",
"module": "protocols",
"testsCovered": true
},
"redirects": {
"desc": "number of HTTP redirects (either 301, 302 or 303)",
"offenders": true,
"unit": "number",
"module": "redirects",
"testsCovered": false
},
"redirectsTime": {
"desc": "time it took to send and receive redirects",
"unit": "ms",
"module": "redirects",
"testsCovered