UNPKG

phantomas

Version:

Headless Chromium-based web performance metrics collector and monitoring tool

1,689 lines 57.2 kB
{ "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