lighthouse 8.6.0 → 9.0.0
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/dist/report/bundle.esm.js +5994 -0
- package/dist/report/flow.js +30 -13
- package/dist/report/standalone.js +41 -35
- package/flow-report/.eslintrc.cjs +2 -0
- package/flow-report/assets/standalone-flow-template.html +3 -2
- package/flow-report/assets/styles.css +108 -31
- package/flow-report/src/app.tsx +18 -18
- package/flow-report/src/common.tsx +28 -15
- package/flow-report/src/header.tsx +12 -13
- package/flow-report/src/help-dialog.tsx +3 -4
- package/flow-report/src/i18n/i18n.tsx +57 -16
- package/flow-report/src/i18n/ui-strings.js +50 -0
- package/flow-report/src/icons.tsx +36 -8
- package/flow-report/src/sidebar/flow.tsx +3 -3
- package/flow-report/src/sidebar/sidebar.tsx +35 -14
- package/flow-report/src/summary/category.tsx +97 -24
- package/flow-report/src/summary/summary.tsx +21 -14
- package/flow-report/src/topbar.tsx +9 -5
- package/flow-report/src/util.ts +33 -26
- package/flow-report/src/wrappers/category-score.tsx +0 -3
- package/flow-report/src/wrappers/markdown.tsx +27 -0
- package/flow-report/src/wrappers/report-renderer.tsx +10 -3
- package/flow-report/src/wrappers/report.tsx +27 -6
- package/flow-report/standalone-flow.tsx +4 -3
- package/flow-report/test/common-test.tsx +32 -17
- package/flow-report/test/flow-report-pptr-test.ts +46 -0
- package/flow-report/test/header-test.tsx +6 -6
- package/flow-report/test/setup/env-setup.ts +1 -1
- package/flow-report/test/sidebar/sidebar-test.tsx +43 -1
- package/flow-report/test/summary/category-test.tsx +120 -24
- package/flow-report/test/summary/summary-test.tsx +1 -1
- package/flow-report/test/topbar-test.tsx +1 -0
- package/flow-report/test/util-test.tsx +32 -11
- package/flow-report/test/wrappers/category-score-test.tsx +87 -0
- package/flow-report/test/wrappers/markdown-test.tsx +29 -0
- package/flow-report/tsconfig.json +1 -0
- package/jest.config.js +4 -2
- package/lighthouse-cli/.eslintrc.cjs +2 -0
- package/lighthouse-cli/cli-flags.js +1 -1
- package/lighthouse-cli/run.js +1 -1
- package/lighthouse-cli/test/smokehouse/frontends/smokehouse-bin.js +0 -0
- package/lighthouse-cli/test/smokehouse/lighthouse-runners/bundle.js +4 -2
- package/lighthouse-cli/test/smokehouse/lighthouse-runners/cli.js +1 -1
- package/lighthouse-cli/test/smokehouse/smokehouse.js +1 -1
- package/lighthouse-core/audits/accessibility/axe-audit.js +7 -1
- package/lighthouse-core/audits/audit.js +1 -1
- package/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js +2 -0
- package/lighthouse-core/audits/byte-efficiency/modern-image-formats.js +4 -2
- package/lighthouse-core/audits/byte-efficiency/offscreen-images.js +11 -10
- package/lighthouse-core/audits/byte-efficiency/uses-optimized-images.js +5 -3
- package/lighthouse-core/audits/byte-efficiency/uses-responsive-images-snapshot.js +2 -1
- package/lighthouse-core/audits/byte-efficiency/uses-responsive-images.js +2 -1
- package/lighthouse-core/audits/deprecations.js +33 -11
- package/lighthouse-core/audits/dobetterweb/uses-http2.js +27 -11
- package/lighthouse-core/audits/errors-in-console.js +0 -2
- package/lighthouse-core/audits/image-aspect-ratio.js +5 -5
- package/lighthouse-core/audits/image-size-responsive.js +6 -6
- package/lighthouse-core/audits/installable-manifest.js +5 -3
- package/lighthouse-core/audits/preload-lcp-image.js +7 -5
- package/lighthouse-core/audits/script-treemap-data.js +1 -1
- package/lighthouse-core/audits/unsized-images.js +2 -3
- package/lighthouse-core/computed/image-records.js +4 -3
- package/lighthouse-core/computed/metrics/lantern-total-blocking-time.js +3 -4
- package/lighthouse-core/computed/metrics/tbt-utils.js +57 -0
- package/lighthouse-core/computed/metrics/total-blocking-time.js +3 -53
- package/lighthouse-core/computed/resource-summary.js +1 -1
- package/lighthouse-core/config/config-helpers.js +21 -10
- package/lighthouse-core/config/constants.js +3 -4
- package/lighthouse-core/config/default-config.js +61 -71
- package/lighthouse-core/fraggle-rock/config/config.js +1 -1
- package/lighthouse-core/fraggle-rock/config/default-config.js +4 -5
- package/lighthouse-core/fraggle-rock/gather/base-gatherer.js +6 -1
- package/lighthouse-core/fraggle-rock/gather/session.js +3 -4
- package/lighthouse-core/gather/connections/cri.js +1 -1
- package/lighthouse-core/gather/driver/storage.js +0 -1
- package/lighthouse-core/gather/driver.js +3 -7
- package/lighthouse-core/gather/fetcher.js +4 -7
- package/lighthouse-core/gather/gather-runner.js +29 -6
- package/lighthouse-core/gather/gatherers/accessibility.js +27 -0
- package/lighthouse-core/gather/gatherers/dobetterweb/response-compression.js +1 -0
- package/lighthouse-core/gather/gatherers/image-elements.js +0 -3
- package/lighthouse-core/gather/gatherers/inspector-issues.js +5 -0
- package/lighthouse-core/lib/asset-saver.js +7 -4
- package/lighthouse-core/lib/emulation.js +45 -1
- package/lighthouse-core/lib/i18n/i18n.js +19 -8
- package/lighthouse-core/lib/lh-env.js +2 -0
- package/lighthouse-core/lib/proto-preprocessor.js +14 -2
- package/lighthouse-core/lib/tappable-rects.js +8 -15
- package/lighthouse-core/lib/url-shim.js +1 -1
- package/lighthouse-core/runner.js +1 -1
- package/lighthouse-core/util-commonjs.js +65 -46
- package/package.json +27 -17
- package/readme.md +3 -3
- package/report/.eslintrc.cjs +2 -0
- package/report/README.md +1 -1
- package/report/assets/standalone-template.html +2 -3
- package/report/assets/styles.css +360 -254
- package/report/assets/templates.html +21 -76
- package/report/clients/bundle.js +1 -0
- package/report/clients/standalone.js +6 -15
- package/report/generator/README.md +1 -1
- package/report/renderer/api.js +32 -0
- package/report/renderer/category-renderer.js +59 -19
- package/report/renderer/components.js +59 -110
- package/report/renderer/crc-details-renderer.js +15 -12
- package/report/renderer/dom.js +16 -1
- package/report/renderer/drop-down-menu.js +2 -2
- package/report/renderer/element-screenshot-renderer.js +8 -8
- package/report/renderer/features-util.js +1 -1
- package/report/renderer/open-tab.js +9 -3
- package/report/renderer/performance-category-renderer.js +55 -34
- package/report/renderer/pwa-category-renderer.js +0 -10
- package/report/renderer/report-renderer.js +91 -44
- package/report/renderer/report-ui-features.js +36 -33
- package/report/renderer/swap-locale-feature.js +3 -3
- package/report/renderer/topbar-features.js +53 -48
- package/report/renderer/util.js +66 -46
- package/report/test/clients/bundle-test.js +70 -0
- package/report/test/renderer/category-renderer-test.js +48 -3
- package/report/test/renderer/i18n-test.js +0 -7
- package/report/test/renderer/performance-category-renderer-test.js +51 -14
- package/report/test/renderer/pwa-category-renderer-test.js +6 -6
- package/report/test/renderer/report-renderer-axe-test.js +10 -12
- package/report/test/renderer/report-renderer-test.js +23 -22
- package/report/test/renderer/report-ui-features-test.js +20 -10
- package/report/test/renderer/text-encoding-test.js +1 -1
- package/report/test/renderer/util-test.js +35 -31
- package/report/test-assets/faux-psi-template.html +3 -11
- package/report/test-assets/faux-psi.js +26 -22
- package/report/types/html-renderer.d.ts +2 -0
- package/report/types/report-renderer.d.ts +23 -0
- package/shared/localization/format.js +64 -30
- package/shared/localization/locales/ar-XB.json +72 -75
- package/shared/localization/locales/ar.json +72 -75
- package/shared/localization/locales/bg.json +72 -75
- package/shared/localization/locales/ca.json +72 -75
- package/shared/localization/locales/cs.json +89 -92
- package/shared/localization/locales/da.json +72 -75
- package/shared/localization/locales/de.json +89 -92
- package/shared/localization/locales/el.json +72 -75
- package/shared/localization/locales/en-GB.json +72 -75
- package/shared/localization/locales/en-US.json +75 -75
- package/shared/localization/locales/en-XA.json +72 -75
- package/shared/localization/locales/en-XL.json +75 -75
- package/shared/localization/locales/es-419.json +90 -93
- package/shared/localization/locales/es.json +90 -93
- package/shared/localization/locales/fi.json +72 -75
- package/shared/localization/locales/fil.json +72 -75
- package/shared/localization/locales/fr.json +89 -92
- package/shared/localization/locales/he.json +73 -76
- package/shared/localization/locales/hi.json +72 -75
- package/shared/localization/locales/hr.json +72 -75
- package/shared/localization/locales/hu.json +89 -92
- package/shared/localization/locales/id.json +89 -92
- package/shared/localization/locales/it.json +89 -92
- package/shared/localization/locales/ja.json +89 -92
- package/shared/localization/locales/ko.json +89 -92
- package/shared/localization/locales/lt.json +89 -92
- package/shared/localization/locales/lv.json +95 -98
- package/shared/localization/locales/nl.json +89 -92
- package/shared/localization/locales/no.json +72 -75
- package/shared/localization/locales/pl.json +72 -75
- package/shared/localization/locales/pt-PT.json +72 -75
- package/shared/localization/locales/pt.json +89 -92
- package/shared/localization/locales/ro.json +90 -93
- package/shared/localization/locales/ru.json +89 -92
- package/shared/localization/locales/sk.json +89 -92
- package/shared/localization/locales/sl.json +89 -92
- package/shared/localization/locales/sr-Latn.json +89 -92
- package/shared/localization/locales/sr.json +89 -92
- package/shared/localization/locales/sv.json +72 -75
- package/shared/localization/locales/ta.json +89 -92
- package/shared/localization/locales/te.json +89 -92
- package/shared/localization/locales/th.json +89 -92
- package/shared/localization/locales/tr.json +89 -92
- package/shared/localization/locales/uk.json +92 -95
- package/shared/localization/locales/vi.json +89 -92
- package/shared/localization/locales/zh-HK.json +89 -92
- package/shared/localization/locales/zh-TW.json +89 -92
- package/shared/localization/locales/zh.json +89 -92
- package/shared/localization/locales.js +6 -0
- package/shared/test/localization/format-test.js +45 -9
- package/shared/test/localization/swap-locale-test.js +0 -12
- package/third-party/chromium-synchronization/inspector-issueAdded-types-test.js +19 -11
- package/third-party/chromium-synchronization/installability-errors-test.js +2 -0
- package/third-party/download-content-shell/download-content-shell.js +2 -2
- package/third-party/download-content-shell/utils.js +0 -24
- package/tsconfig-all.json +2 -2
- package/tsconfig.json +0 -1
- package/types/artifacts.d.ts +7 -7
- package/types/enquirer.d.ts +3 -1
- package/types/lhr/audit-details.d.ts +6 -5
- package/types/lhr/flow.d.ts +3 -2
- package/types/lhr/lhr.d.ts +1 -1
- package/types/node.d.ts +5 -5
- package/types/rollup-plugin-postprocess.d.ts +10 -0
- package/changelog.md +0 -5490
- package/lighthouse-core/audits/dobetterweb/appcache-manifest.js +0 -67
- package/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js +0 -96
- package/lighthouse-core/audits/redirects-http.js +0 -59
- package/lighthouse-core/gather/gatherers/dobetterweb/appcache.js +0 -34
- package/lighthouse-core/gather/gatherers/http-redirect.js +0 -46
- package/lighthouse-core/lib/i18n/locales/en-US.ctc.json +0 -6699
- package/lighthouse-core/lib/i18n/locales/en-XL.ctc.json +0 -6672
- package/lighthouse-core/scripts/package.json +0 -4
- package/report/clients/psi.js +0 -158
- package/report/test/clients/psi-test.js +0 -143
- package/shared/localization/locales/en-US.ctc.json +0 -6877
- package/shared/localization/locales/en-XL.ctc.json +0 -6852
|
@@ -10,7 +10,7 @@ const NetworkRecords = require('./network-records.js');
|
|
|
10
10
|
const URL = require('../lib/url-shim.js');
|
|
11
11
|
const NetworkRequest = require('../lib/network-request.js');
|
|
12
12
|
const Budget = require('../config/budget.js');
|
|
13
|
-
const Util = require('../util-commonjs.js');
|
|
13
|
+
const {Util} = require('../util-commonjs.js');
|
|
14
14
|
|
|
15
15
|
/** @typedef {{count: number, resourceSize: number, transferSize: number}} ResourceEntry */
|
|
16
16
|
|
|
@@ -203,6 +203,18 @@ function expandAuditShorthand(audit) {
|
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
/** @type {Map<string, any>} */
|
|
207
|
+
const bundledModules = new Map(/* BUILD_REPLACE_BUNDLED_MODULES */);
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Wraps `require` with an entrypoint for bundled dynamic modules.
|
|
211
|
+
* See build-bundle.js
|
|
212
|
+
* @param {string} requirePath
|
|
213
|
+
*/
|
|
214
|
+
function requireWrapper(requirePath) {
|
|
215
|
+
return bundledModules.get(requirePath) || require(requirePath);
|
|
216
|
+
}
|
|
217
|
+
|
|
206
218
|
/**
|
|
207
219
|
* @param {string} gathererPath
|
|
208
220
|
* @param {Array<string>} coreGathererList
|
|
@@ -218,7 +230,7 @@ function requireGatherer(gathererPath, coreGathererList, configDir) {
|
|
|
218
230
|
requirePath = resolveModulePath(gathererPath, configDir, 'gatherer');
|
|
219
231
|
}
|
|
220
232
|
|
|
221
|
-
const GathererClass = /** @type {GathererConstructor} */ (
|
|
233
|
+
const GathererClass = /** @type {GathererConstructor} */ (requireWrapper(requirePath));
|
|
222
234
|
|
|
223
235
|
return {
|
|
224
236
|
instance: new GathererClass(),
|
|
@@ -228,14 +240,13 @@ function requireGatherer(gathererPath, coreGathererList, configDir) {
|
|
|
228
240
|
}
|
|
229
241
|
|
|
230
242
|
/**
|
|
231
|
-
*
|
|
232
243
|
* @param {string} auditPath
|
|
233
244
|
* @param {Array<string>} coreAuditList
|
|
234
245
|
* @param {string=} configDir
|
|
235
246
|
* @return {LH.Config.AuditDefn['implementation']}
|
|
236
247
|
*/
|
|
237
248
|
function requireAudit(auditPath, coreAuditList, configDir) {
|
|
238
|
-
// See if the audit is a Lighthouse core audit.
|
|
249
|
+
// See if the audit is a Lighthouse core audit.
|
|
239
250
|
const auditPathJs = `${auditPath}.js`;
|
|
240
251
|
const coreAudit = coreAuditList.find(a => a === auditPathJs);
|
|
241
252
|
let requirePath = `../audits/${auditPath}`;
|
|
@@ -244,14 +255,14 @@ function requireAudit(auditPath, coreAuditList, configDir) {
|
|
|
244
255
|
// This is for pubads bundling.
|
|
245
256
|
requirePath = auditPath;
|
|
246
257
|
} else {
|
|
247
|
-
|
|
258
|
+
// Otherwise, attempt to find it elsewhere. This throws if not found.
|
|
248
259
|
const absolutePath = resolveModulePath(auditPath, configDir, 'audit');
|
|
249
260
|
// Use a relative path so bundler can easily expose it.
|
|
250
261
|
requirePath = path.relative(__dirname, absolutePath);
|
|
251
262
|
}
|
|
252
263
|
}
|
|
253
264
|
|
|
254
|
-
return
|
|
265
|
+
return requireWrapper(requirePath);
|
|
255
266
|
}
|
|
256
267
|
|
|
257
268
|
/**
|
|
@@ -283,6 +294,7 @@ function resolveSettings(settingsJson = {}, overrides = undefined) {
|
|
|
283
294
|
// If a locale is requested in flags or settings, use it. A typical CLI run will not have one,
|
|
284
295
|
// however `lookupLocale` will always determine which of our supported locales to use (falling
|
|
285
296
|
// back if necessary).
|
|
297
|
+
// TODO: could do more work to sniff out the user's locale
|
|
286
298
|
const locale = i18n.lookupLocale((overrides && overrides.locale) || settingsJson.locale);
|
|
287
299
|
|
|
288
300
|
// Fill in missing settings with defaults
|
|
@@ -312,7 +324,6 @@ function resolveSettings(settingsJson = {}, overrides = undefined) {
|
|
|
312
324
|
return settingsWithFlags;
|
|
313
325
|
}
|
|
314
326
|
|
|
315
|
-
|
|
316
327
|
/**
|
|
317
328
|
* @param {LH.Config.Json} configJSON
|
|
318
329
|
* @param {string | undefined} configDir
|
|
@@ -331,7 +342,7 @@ function mergePlugins(configJSON, configDir, flags) {
|
|
|
331
342
|
const pluginPath = isBundledEnvironment() ?
|
|
332
343
|
pluginName :
|
|
333
344
|
resolveModulePath(pluginName, configDir, 'plugin');
|
|
334
|
-
const rawPluginJson =
|
|
345
|
+
const rawPluginJson = requireWrapper(pluginPath);
|
|
335
346
|
const pluginJson = ConfigPlugin.parsePlugin(rawPluginJson, pluginName);
|
|
336
347
|
|
|
337
348
|
configJSON = mergeConfigFragment(configJSON, pluginJson);
|
|
@@ -568,12 +579,12 @@ function deepCloneConfigJson(json) {
|
|
|
568
579
|
module.exports = {
|
|
569
580
|
deepClone,
|
|
570
581
|
deepCloneConfigJson,
|
|
571
|
-
mergeOptionsOfItems,
|
|
572
582
|
mergeConfigFragment,
|
|
573
583
|
mergeConfigFragmentArrayByKey,
|
|
584
|
+
mergeOptionsOfItems,
|
|
574
585
|
mergePlugins,
|
|
575
|
-
resolveSettings,
|
|
576
|
-
resolveGathererToDefn,
|
|
577
586
|
resolveAuditsToDefns,
|
|
587
|
+
resolveGathererToDefn,
|
|
578
588
|
resolveModulePath,
|
|
589
|
+
resolveSettings,
|
|
579
590
|
};
|
|
@@ -81,10 +81,9 @@ const screenEmulationMetrics = {
|
|
|
81
81
|
desktop: DESKTOP_EMULATION_METRICS,
|
|
82
82
|
};
|
|
83
83
|
|
|
84
|
-
|
|
85
|
-
const MOTOG4_USERAGENT = 'Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
|
|
86
|
-
// eslint-disable-
|
|
87
|
-
const DESKTOP_USERAGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4590.2 Safari/537.36 Chrome-Lighthouse';
|
|
84
|
+
|
|
85
|
+
const MOTOG4_USERAGENT = 'Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4695.0 Mobile Safari/537.36 Chrome-Lighthouse'; // eslint-disable-line max-len
|
|
86
|
+
const DESKTOP_USERAGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4695.0 Safari/537.36 Chrome-Lighthouse'; // eslint-disable-line max-len
|
|
88
87
|
|
|
89
88
|
const userAgents = {
|
|
90
89
|
mobile: MOTOG4_USERAGENT,
|
|
@@ -96,7 +96,7 @@ const UIStrings = {
|
|
|
96
96
|
/** Description of the navigation section within the Search Engine Optimization (SEO) category. Within this section are audits with descriptive titles that highlight ways to make a website accessible to search engine crawlers. */
|
|
97
97
|
seoCrawlingGroupDescription: 'To appear in search results, crawlers need access to your app.',
|
|
98
98
|
/** Title of the Progressive Web Application (PWA) category of audits. This is displayed at the top of a list of audits focused on topics related to whether or not a site is a progressive web app, e.g. responds offline, uses a service worker, is on https, etc. Also used as a label of a score gauge. */
|
|
99
|
-
pwaCategoryTitle: '
|
|
99
|
+
pwaCategoryTitle: 'PWA',
|
|
100
100
|
/** Description of the Progressive Web Application (PWA) category. This is displayed at the top of a list of audits focused on topics related to whether or not a site is a progressive web app, e.g. responds offline, uses a service worker, is on https, etc. No character length limits. 'Learn More' becomes link text to additional documentation. */
|
|
101
101
|
pwaCategoryDescription: 'These checks validate the aspects of a Progressive Web App. ' +
|
|
102
102
|
'[Learn more](https://developers.google.com/web/progressive-web-apps/checklist).',
|
|
@@ -147,7 +147,6 @@ const defaultConfig = {
|
|
|
147
147
|
'form-elements',
|
|
148
148
|
'main-document-content',
|
|
149
149
|
'global-listeners',
|
|
150
|
-
'dobetterweb/appcache',
|
|
151
150
|
'dobetterweb/doctype',
|
|
152
151
|
'dobetterweb/domstats',
|
|
153
152
|
'dobetterweb/optimized-images',
|
|
@@ -171,19 +170,9 @@ const defaultConfig = {
|
|
|
171
170
|
gatherers: [
|
|
172
171
|
'service-worker',
|
|
173
172
|
],
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
passName: 'redirectPass',
|
|
177
|
-
loadFailureMode: 'warn',
|
|
178
|
-
// Speed up the redirect pass by blocking stylesheets, fonts, and images
|
|
179
|
-
blockedUrlPatterns: ['*.css', '*.jpg', '*.jpeg', '*.png', '*.gif', '*.svg', '*.ttf', '*.woff', '*.woff2'],
|
|
180
|
-
gatherers: [
|
|
181
|
-
'http-redirect',
|
|
182
|
-
],
|
|
183
173
|
}],
|
|
184
174
|
audits: [
|
|
185
175
|
'is-on-https',
|
|
186
|
-
'redirects-http',
|
|
187
176
|
'service-worker',
|
|
188
177
|
'viewport',
|
|
189
178
|
'metrics/first-contentful-paint',
|
|
@@ -311,11 +300,9 @@ const defaultConfig = {
|
|
|
311
300
|
'byte-efficiency/efficient-animated-content',
|
|
312
301
|
'byte-efficiency/duplicated-javascript',
|
|
313
302
|
'byte-efficiency/legacy-javascript',
|
|
314
|
-
'dobetterweb/appcache-manifest',
|
|
315
303
|
'dobetterweb/doctype',
|
|
316
304
|
'dobetterweb/charset',
|
|
317
305
|
'dobetterweb/dom-size',
|
|
318
|
-
'dobetterweb/external-anchors-use-rel-noopener',
|
|
319
306
|
'dobetterweb/geolocation-on-start',
|
|
320
307
|
'dobetterweb/inspector-issues',
|
|
321
308
|
'dobetterweb/no-document-write',
|
|
@@ -417,6 +404,8 @@ const defaultConfig = {
|
|
|
417
404
|
'best-practices-general': {
|
|
418
405
|
title: str_(UIStrings.bestPracticesGeneralGroupTitle),
|
|
419
406
|
},
|
|
407
|
+
// Group for audits that should not be displayed.
|
|
408
|
+
'hidden': {title: ''},
|
|
420
409
|
},
|
|
421
410
|
categories: {
|
|
422
411
|
'performance': {
|
|
@@ -424,67 +413,71 @@ const defaultConfig = {
|
|
|
424
413
|
supportedModes: ['navigation', 'timespan', 'snapshot'],
|
|
425
414
|
auditRefs: [
|
|
426
415
|
{id: 'first-contentful-paint', weight: 10, group: 'metrics', acronym: 'FCP', relevantAudits: m2a.fcpRelevantAudits},
|
|
427
|
-
{id: 'speed-index', weight: 10, group: 'metrics', acronym: 'SI'},
|
|
428
|
-
{id: 'largest-contentful-paint', weight: 25, group: 'metrics', acronym: 'LCP', relevantAudits: m2a.lcpRelevantAudits},
|
|
429
416
|
{id: 'interactive', weight: 10, group: 'metrics', acronym: 'TTI'},
|
|
417
|
+
{id: 'speed-index', weight: 10, group: 'metrics', acronym: 'SI'},
|
|
430
418
|
{id: 'total-blocking-time', weight: 30, group: 'metrics', acronym: 'TBT', relevantAudits: m2a.tbtRelevantAudits},
|
|
419
|
+
{id: 'largest-contentful-paint', weight: 25, group: 'metrics', acronym: 'LCP', relevantAudits: m2a.lcpRelevantAudits},
|
|
431
420
|
{id: 'cumulative-layout-shift', weight: 15, group: 'metrics', acronym: 'CLS', relevantAudits: m2a.clsRelevantAudits},
|
|
432
421
|
|
|
433
|
-
// These are our "invisible" metrics. Not displayed, but still in the LHR
|
|
434
|
-
{id: 'max-potential-fid', weight: 0},
|
|
435
|
-
{id: 'first-meaningful-paint', weight: 0, acronym: 'FMP'},
|
|
422
|
+
// These are our "invisible" metrics. Not displayed, but still in the LHR.
|
|
423
|
+
{id: 'max-potential-fid', weight: 0, group: 'hidden'},
|
|
424
|
+
{id: 'first-meaningful-paint', weight: 0, acronym: 'FMP', group: 'hidden'},
|
|
436
425
|
|
|
437
|
-
|
|
438
|
-
{id: '
|
|
439
|
-
{id: '
|
|
440
|
-
{id: '
|
|
441
|
-
{id: 'unminified-
|
|
442
|
-
{id: '
|
|
443
|
-
{id: 'unused-
|
|
444
|
-
{id: '
|
|
445
|
-
{id: '
|
|
446
|
-
{id: '
|
|
447
|
-
{id: 'uses-
|
|
448
|
-
{id: '
|
|
449
|
-
{id: '
|
|
450
|
-
{id: '
|
|
451
|
-
{id: 'uses-
|
|
452
|
-
{id: '
|
|
453
|
-
{id: '
|
|
454
|
-
{id: '
|
|
455
|
-
{id: '
|
|
456
|
-
{id: '
|
|
457
|
-
{id: '
|
|
458
|
-
{id: '
|
|
459
|
-
{id: '
|
|
460
|
-
{id: '
|
|
461
|
-
{id: '
|
|
462
|
-
{id: '
|
|
463
|
-
{id: '
|
|
426
|
+
// These audits will be put in "load-opportunities" or "diagnostics" based on their details type.
|
|
427
|
+
{id: 'render-blocking-resources', weight: 0},
|
|
428
|
+
{id: 'uses-responsive-images', weight: 0},
|
|
429
|
+
{id: 'offscreen-images', weight: 0},
|
|
430
|
+
{id: 'unminified-css', weight: 0},
|
|
431
|
+
{id: 'unminified-javascript', weight: 0},
|
|
432
|
+
{id: 'unused-css-rules', weight: 0},
|
|
433
|
+
{id: 'unused-javascript', weight: 0},
|
|
434
|
+
{id: 'uses-optimized-images', weight: 0},
|
|
435
|
+
{id: 'modern-image-formats', weight: 0},
|
|
436
|
+
{id: 'uses-text-compression', weight: 0},
|
|
437
|
+
{id: 'uses-rel-preconnect', weight: 0},
|
|
438
|
+
{id: 'server-response-time', weight: 0},
|
|
439
|
+
{id: 'redirects', weight: 0},
|
|
440
|
+
{id: 'uses-rel-preload', weight: 0},
|
|
441
|
+
{id: 'uses-http2', weight: 0},
|
|
442
|
+
{id: 'efficient-animated-content', weight: 0},
|
|
443
|
+
{id: 'duplicated-javascript', weight: 0},
|
|
444
|
+
{id: 'legacy-javascript', weight: 0},
|
|
445
|
+
{id: 'preload-lcp-image', weight: 0},
|
|
446
|
+
{id: 'total-byte-weight', weight: 0},
|
|
447
|
+
{id: 'uses-long-cache-ttl', weight: 0},
|
|
448
|
+
{id: 'dom-size', weight: 0},
|
|
449
|
+
{id: 'critical-request-chains', weight: 0},
|
|
450
|
+
{id: 'user-timings', weight: 0},
|
|
451
|
+
{id: 'bootup-time', weight: 0},
|
|
452
|
+
{id: 'mainthread-work-breakdown', weight: 0},
|
|
453
|
+
{id: 'font-display', weight: 0},
|
|
454
|
+
{id: 'resource-summary', weight: 0},
|
|
455
|
+
{id: 'third-party-summary', weight: 0},
|
|
456
|
+
{id: 'third-party-facades', weight: 0},
|
|
457
|
+
{id: 'largest-contentful-paint-element', weight: 0},
|
|
458
|
+
{id: 'lcp-lazy-loaded', weight: 0},
|
|
459
|
+
{id: 'layout-shift-elements', weight: 0},
|
|
460
|
+
{id: 'uses-passive-event-listeners', weight: 0},
|
|
461
|
+
{id: 'no-document-write', weight: 0},
|
|
462
|
+
{id: 'long-tasks', weight: 0},
|
|
463
|
+
{id: 'non-composited-animations', weight: 0},
|
|
464
|
+
{id: 'unsized-images', weight: 0},
|
|
465
|
+
{id: 'viewport', weight: 0},
|
|
466
|
+
|
|
467
|
+
// Budget audits.
|
|
464
468
|
{id: 'performance-budget', weight: 0, group: 'budgets'},
|
|
465
469
|
{id: 'timing-budget', weight: 0, group: 'budgets'},
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
{id: '
|
|
469
|
-
{id: '
|
|
470
|
-
{id: '
|
|
471
|
-
{id: '
|
|
472
|
-
{id: '
|
|
473
|
-
{id: '
|
|
474
|
-
{id: '
|
|
475
|
-
{id: '
|
|
476
|
-
{id: '
|
|
477
|
-
{id: 'viewport', weight: 0, group: 'diagnostics'},
|
|
478
|
-
// Audits past this point don't belong to a group and will not be shown automatically
|
|
479
|
-
{id: 'network-requests', weight: 0},
|
|
480
|
-
{id: 'network-rtt', weight: 0},
|
|
481
|
-
{id: 'network-server-latency', weight: 0},
|
|
482
|
-
{id: 'main-thread-tasks', weight: 0},
|
|
483
|
-
{id: 'diagnostics', weight: 0},
|
|
484
|
-
{id: 'metrics', weight: 0},
|
|
485
|
-
{id: 'screenshot-thumbnails', weight: 0},
|
|
486
|
-
{id: 'final-screenshot', weight: 0},
|
|
487
|
-
{id: 'script-treemap-data', weight: 0},
|
|
470
|
+
|
|
471
|
+
// Audits past this point contain useful data but are not displayed with other audits.
|
|
472
|
+
{id: 'network-requests', weight: 0, group: 'hidden'},
|
|
473
|
+
{id: 'network-rtt', weight: 0, group: 'hidden'},
|
|
474
|
+
{id: 'network-server-latency', weight: 0, group: 'hidden'},
|
|
475
|
+
{id: 'main-thread-tasks', weight: 0, group: 'hidden'},
|
|
476
|
+
{id: 'diagnostics', weight: 0, group: 'hidden'},
|
|
477
|
+
{id: 'metrics', weight: 0, group: 'hidden'},
|
|
478
|
+
{id: 'screenshot-thumbnails', weight: 0, group: 'hidden'},
|
|
479
|
+
{id: 'final-screenshot', weight: 0, group: 'hidden'},
|
|
480
|
+
{id: 'script-treemap-data', weight: 0, group: 'hidden'},
|
|
488
481
|
],
|
|
489
482
|
},
|
|
490
483
|
'accessibility': {
|
|
@@ -560,7 +553,6 @@ const defaultConfig = {
|
|
|
560
553
|
auditRefs: [
|
|
561
554
|
// Trust & Safety
|
|
562
555
|
{id: 'is-on-https', weight: 1, group: 'best-practices-trust-safety'},
|
|
563
|
-
{id: 'external-anchors-use-rel-noopener', weight: 1, group: 'best-practices-trust-safety'},
|
|
564
556
|
{id: 'geolocation-on-start', weight: 1, group: 'best-practices-trust-safety'},
|
|
565
557
|
{id: 'notification-on-start', weight: 1, group: 'best-practices-trust-safety'},
|
|
566
558
|
{id: 'no-vulnerable-libraries', weight: 1, group: 'best-practices-trust-safety'},
|
|
@@ -575,7 +567,6 @@ const defaultConfig = {
|
|
|
575
567
|
{id: 'charset', weight: 1, group: 'best-practices-browser-compat'},
|
|
576
568
|
// General Group
|
|
577
569
|
{id: 'no-unload-listeners', weight: 1, group: 'best-practices-general'},
|
|
578
|
-
{id: 'appcache-manifest', weight: 1, group: 'best-practices-general'},
|
|
579
570
|
{id: 'js-libraries', weight: 0, group: 'best-practices-general'},
|
|
580
571
|
{id: 'deprecations', weight: 1, group: 'best-practices-general'},
|
|
581
572
|
{id: 'errors-in-console', weight: 1, group: 'best-practices-general'},
|
|
@@ -617,7 +608,6 @@ const defaultConfig = {
|
|
|
617
608
|
{id: 'installable-manifest', weight: 2, group: 'pwa-installable'},
|
|
618
609
|
// PWA Optimized
|
|
619
610
|
{id: 'service-worker', weight: 1, group: 'pwa-optimized'},
|
|
620
|
-
{id: 'redirects-http', weight: 2, group: 'pwa-optimized'},
|
|
621
611
|
{id: 'splash-screen', weight: 1, group: 'pwa-optimized'},
|
|
622
612
|
{id: 'themed-omnibox', weight: 1, group: 'pwa-optimized'},
|
|
623
613
|
{id: 'content-width', weight: 1, group: 'pwa-optimized'},
|
|
@@ -140,7 +140,7 @@ function resolveArtifactsToDefns(artifacts, configDir) {
|
|
|
140
140
|
|
|
141
141
|
const gatherer = resolveGathererToDefn(gathererJson, coreGathererList, configDir);
|
|
142
142
|
if (!isFRGathererDefn(gatherer)) {
|
|
143
|
-
throw new Error(`${gatherer.instance.name} gatherer does not
|
|
143
|
+
throw new Error(`${gatherer.instance.name} gatherer does not have a Fraggle Rock meta obj`);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
/** @type {LH.Config.AnyArtifactDefn} */
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
'use strict';
|
|
7
7
|
|
|
8
8
|
const legacyDefaultConfig = require('../../config/default-config.js');
|
|
9
|
+
const {deepClone} = require('../../config/config-helpers.js');
|
|
9
10
|
|
|
10
11
|
/** @type {LH.Config.AuditJson[]} */
|
|
11
12
|
const frAudits = [
|
|
@@ -15,14 +16,15 @@ const frAudits = [
|
|
|
15
16
|
/** @type {Record<string, LH.Config.AuditRefJson[]>} */
|
|
16
17
|
const frCategoryAuditRefExtensions = {
|
|
17
18
|
'performance': [
|
|
18
|
-
{id: 'uses-responsive-images-snapshot', weight: 0
|
|
19
|
+
{id: 'uses-responsive-images-snapshot', weight: 0},
|
|
19
20
|
],
|
|
20
21
|
};
|
|
21
22
|
|
|
22
23
|
/** @return {LH.Config.Json['categories']} */
|
|
23
24
|
function mergeCategories() {
|
|
24
25
|
if (!legacyDefaultConfig.categories) return {};
|
|
25
|
-
|
|
26
|
+
// Don't modify original default config.
|
|
27
|
+
const categories = deepClone(legacyDefaultConfig.categories);
|
|
26
28
|
for (const key of Object.keys(frCategoryAuditRefExtensions)) {
|
|
27
29
|
if (!categories[key]) continue;
|
|
28
30
|
categories[key].auditRefs.push(...frCategoryAuditRefExtensions[key]);
|
|
@@ -37,7 +39,6 @@ const artifacts = {
|
|
|
37
39
|
Trace: '',
|
|
38
40
|
Accessibility: '',
|
|
39
41
|
AnchorElements: '',
|
|
40
|
-
AppCacheManifest: '',
|
|
41
42
|
CacheContents: '',
|
|
42
43
|
ConsoleMessages: '',
|
|
43
44
|
CSSUsage: '',
|
|
@@ -88,7 +89,6 @@ const defaultConfig = {
|
|
|
88
89
|
/* eslint-disable max-len */
|
|
89
90
|
{id: artifacts.Accessibility, gatherer: 'accessibility'},
|
|
90
91
|
{id: artifacts.AnchorElements, gatherer: 'anchor-elements'},
|
|
91
|
-
{id: artifacts.AppCacheManifest, gatherer: 'dobetterweb/appcache'},
|
|
92
92
|
{id: artifacts.CacheContents, gatherer: 'cache-contents'},
|
|
93
93
|
{id: artifacts.ConsoleMessages, gatherer: 'console-messages'},
|
|
94
94
|
{id: artifacts.CSSUsage, gatherer: 'css-usage'},
|
|
@@ -141,7 +141,6 @@ const defaultConfig = {
|
|
|
141
141
|
|
|
142
142
|
artifacts.Accessibility,
|
|
143
143
|
artifacts.AnchorElements,
|
|
144
|
-
artifacts.AppCacheManifest,
|
|
145
144
|
artifacts.CacheContents,
|
|
146
145
|
artifacts.ConsoleMessages,
|
|
147
146
|
artifacts.CSSUsage,
|
|
@@ -62,8 +62,13 @@ class FRGatherer {
|
|
|
62
62
|
* @return {keyof LH.GathererArtifacts}
|
|
63
63
|
*/
|
|
64
64
|
get name() {
|
|
65
|
+
let name = this.constructor.name;
|
|
66
|
+
// Rollup will mangle class names in an known way–just trim until `$`.
|
|
67
|
+
if (name.includes('$')) {
|
|
68
|
+
name = name.substr(0, name.indexOf('$'));
|
|
69
|
+
}
|
|
65
70
|
// @ts-expect-error - assume that class name has been added to LH.GathererArtifacts.
|
|
66
|
-
return
|
|
71
|
+
return name;
|
|
67
72
|
}
|
|
68
73
|
|
|
69
74
|
/**
|
|
@@ -150,10 +150,9 @@ class ProtocolSession {
|
|
|
150
150
|
const timeoutPromise = new Promise((resolve, reject) => {
|
|
151
151
|
if (timeoutMs === Infinity) return;
|
|
152
152
|
|
|
153
|
-
timeout = setTimeout((
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}), timeoutMs);
|
|
153
|
+
timeout = setTimeout(reject, timeoutMs, new LHError(LHError.errors.PROTOCOL_TIMEOUT, {
|
|
154
|
+
protocolMethod: method,
|
|
155
|
+
}));
|
|
157
156
|
});
|
|
158
157
|
|
|
159
158
|
const resultPromise = this._session.send(method, ...params);
|
|
@@ -11,7 +11,7 @@ const http = require('http');
|
|
|
11
11
|
const log = require('lighthouse-logger');
|
|
12
12
|
const LighthouseError = require('../../lib/lh-error.js');
|
|
13
13
|
|
|
14
|
-
const DEFAULT_HOSTNAME = '
|
|
14
|
+
const DEFAULT_HOSTNAME = '127.0.0.1';
|
|
15
15
|
const CONNECT_TIMEOUT = 10000;
|
|
16
16
|
const DEFAULT_PORT = 9222;
|
|
17
17
|
|
|
@@ -43,7 +43,6 @@ async function clearDataForOrigin(session, url) {
|
|
|
43
43
|
// indexeddb, websql, and localstorage are not cleared to prevent loss of potentially important data.
|
|
44
44
|
// https://chromedevtools.github.io/debugger-protocol-viewer/tot/Storage/#type-StorageType
|
|
45
45
|
const typesToClear = [
|
|
46
|
-
'appcache',
|
|
47
46
|
// 'cookies',
|
|
48
47
|
'file_systems',
|
|
49
48
|
'shader_cache',
|
|
@@ -338,13 +338,9 @@ class Driver {
|
|
|
338
338
|
let asyncTimeout;
|
|
339
339
|
const timeoutPromise = new Promise((resolve, reject) => {
|
|
340
340
|
if (timeout === Infinity) return;
|
|
341
|
-
asyncTimeout = setTimeout((
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
{protocolMethod: method}
|
|
345
|
-
);
|
|
346
|
-
reject(err);
|
|
347
|
-
}), timeout);
|
|
341
|
+
asyncTimeout = setTimeout(reject, timeout, new LHError(LHError.errors.PROTOCOL_TIMEOUT, {
|
|
342
|
+
protocolMethod: method,
|
|
343
|
+
}));
|
|
348
344
|
});
|
|
349
345
|
|
|
350
346
|
return Promise.race([
|
|
@@ -195,9 +195,7 @@ class Fetcher {
|
|
|
195
195
|
/** @type {NodeJS.Timeout} */
|
|
196
196
|
let timeoutHandle;
|
|
197
197
|
const timeoutPromise = new Promise((_, reject) => {
|
|
198
|
-
timeoutHandle = setTimeout((
|
|
199
|
-
reject(new Error('Timed out fetching resource'));
|
|
200
|
-
}, options.timeout);
|
|
198
|
+
timeoutHandle = setTimeout(reject, options.timeout, new Error('Timed out fetching resource'));
|
|
201
199
|
});
|
|
202
200
|
|
|
203
201
|
const responsePromise = this._loadNetworkResource(url);
|
|
@@ -283,17 +281,16 @@ class Fetcher {
|
|
|
283
281
|
/* c8 ignore stop */
|
|
284
282
|
|
|
285
283
|
/** @type {NodeJS.Timeout} */
|
|
286
|
-
let
|
|
284
|
+
let asyncTimeout;
|
|
287
285
|
/** @type {Promise<never>} */
|
|
288
286
|
const timeoutPromise = new Promise((_, reject) => {
|
|
289
|
-
|
|
290
|
-
timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), options.timeout);
|
|
287
|
+
asyncTimeout = setTimeout(reject, options.timeout, new Error('Timed out fetching resource.'));
|
|
291
288
|
});
|
|
292
289
|
|
|
293
290
|
const racePromise = Promise.race([
|
|
294
291
|
timeoutPromise,
|
|
295
292
|
requestInterceptionPromise,
|
|
296
|
-
]).finally(() => clearTimeout(
|
|
293
|
+
]).finally(() => clearTimeout(asyncTimeout));
|
|
297
294
|
|
|
298
295
|
// Temporarily disable auto-attaching for this iframe.
|
|
299
296
|
await this.session.sendCommand('Target.setAutoAttach', {
|
|
@@ -422,21 +422,44 @@ class GatherRunner {
|
|
|
422
422
|
static async populateBaseArtifacts(passContext) {
|
|
423
423
|
const status = {msg: 'Populate base artifacts', id: 'lh:gather:populateBaseArtifacts'};
|
|
424
424
|
log.time(status);
|
|
425
|
+
|
|
425
426
|
const baseArtifacts = passContext.baseArtifacts;
|
|
426
427
|
|
|
427
428
|
// Copy redirected URL to artifact.
|
|
428
429
|
baseArtifacts.URL.finalUrl = passContext.url;
|
|
429
430
|
|
|
430
431
|
// Fetch the manifest, if it exists.
|
|
431
|
-
|
|
432
|
-
|
|
432
|
+
try {
|
|
433
|
+
baseArtifacts.WebAppManifest = await WebAppManifest.getWebAppManifest(
|
|
434
|
+
passContext.driver.defaultSession, passContext.url);
|
|
435
|
+
} catch (err) {
|
|
436
|
+
log.error('GatherRunner WebAppManifest', err);
|
|
437
|
+
baseArtifacts.WebAppManifest = null;
|
|
438
|
+
}
|
|
433
439
|
|
|
434
|
-
|
|
435
|
-
baseArtifacts.
|
|
436
|
-
|
|
440
|
+
try {
|
|
441
|
+
if (baseArtifacts.WebAppManifest) {
|
|
442
|
+
baseArtifacts.InstallabilityErrors = await InstallabilityErrors.getInstallabilityErrors(
|
|
443
|
+
passContext.driver.defaultSession);
|
|
444
|
+
}
|
|
445
|
+
} catch (err) {
|
|
446
|
+
log.error('GatherRunner InstallabilityErrors', err);
|
|
447
|
+
baseArtifacts.InstallabilityErrors = {
|
|
448
|
+
errors: [
|
|
449
|
+
{
|
|
450
|
+
errorId: 'protocol-timeout',
|
|
451
|
+
errorArguments: [],
|
|
452
|
+
},
|
|
453
|
+
],
|
|
454
|
+
};
|
|
437
455
|
}
|
|
438
456
|
|
|
439
|
-
|
|
457
|
+
try {
|
|
458
|
+
baseArtifacts.Stacks = await Stacks.collectStacks(passContext.driver.executionContext);
|
|
459
|
+
} catch (err) {
|
|
460
|
+
log.error('GatherRunner Stacks', err);
|
|
461
|
+
baseArtifacts.Stacks = [];
|
|
462
|
+
}
|
|
440
463
|
|
|
441
464
|
// Find the NetworkUserAgent actually used in the devtoolsLogs.
|
|
442
465
|
const devtoolsLog = baseArtifacts.devtoolsLogs[passContext.passConfig.passName];
|
|
@@ -87,10 +87,37 @@ function createAxeRuleResultArtifact(result) {
|
|
|
87
87
|
// @ts-expect-error - getNodeDetails put into scope via stringification
|
|
88
88
|
const nodeDetails = getNodeDetails(/** @type {HTMLElement} */ (element));
|
|
89
89
|
|
|
90
|
+
/** @type {Set<HTMLElement>} */
|
|
91
|
+
const relatedNodeElements = new Set();
|
|
92
|
+
/** @param {import('axe-core/axe').ImpactValue} impact */
|
|
93
|
+
const impactToNumber =
|
|
94
|
+
(impact) => [null, 'minor', 'moderate', 'serious', 'critical'].indexOf(impact);
|
|
95
|
+
const checkResults = [...node.any, ...node.all, ...node.none]
|
|
96
|
+
// @ts-expect-error CheckResult.impact is a string, even though ImpactValue is a thing.
|
|
97
|
+
.sort((a, b) => impactToNumber(b.impact) - impactToNumber(a.impact));
|
|
98
|
+
for (const checkResult of checkResults) {
|
|
99
|
+
for (const relatedNode of checkResult.relatedNodes || []) {
|
|
100
|
+
/** @type {HTMLElement} */
|
|
101
|
+
// @ts-expect-error - should always exist, just being cautious.
|
|
102
|
+
const relatedElement = relatedNode.element;
|
|
103
|
+
|
|
104
|
+
// Prevent overloading the report with way too many nodes.
|
|
105
|
+
if (relatedNodeElements.size >= 3) break;
|
|
106
|
+
// Should always exist, just being cautious.
|
|
107
|
+
if (!relatedElement) continue;
|
|
108
|
+
if (element === relatedElement) continue;
|
|
109
|
+
|
|
110
|
+
relatedNodeElements.add(relatedElement);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// @ts-expect-error - getNodeDetails put into scope via stringification
|
|
114
|
+
const relatedNodeDetails = [...relatedNodeElements].map(getNodeDetails);
|
|
115
|
+
|
|
90
116
|
return {
|
|
91
117
|
target,
|
|
92
118
|
failureSummary,
|
|
93
119
|
node: nodeDetails,
|
|
120
|
+
relatedNodes: relatedNodeDetails,
|
|
94
121
|
};
|
|
95
122
|
});
|
|
96
123
|
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
const log = require('lighthouse-logger');
|
|
13
13
|
const FRGatherer = require('../../fraggle-rock/gather/base-gatherer.js');
|
|
14
14
|
const pageFunctions = require('../../lib/page-functions.js');
|
|
15
|
-
const URL = require('../../lib/url-shim.js');
|
|
16
15
|
const FontSize = require('./seo/font-size.js');
|
|
17
16
|
|
|
18
17
|
/* global window, getElementsInDocument, Image, getNodeDetails, ShadowRoot */
|
|
@@ -310,8 +309,6 @@ class ImageElements extends FRGatherer {
|
|
|
310
309
|
let skippedCount = 0;
|
|
311
310
|
|
|
312
311
|
for (const element of elements) {
|
|
313
|
-
element.mimeType = URL.guessMimeType(element.src);
|
|
314
|
-
|
|
315
312
|
if (reachedGatheringBudget) {
|
|
316
313
|
skippedCount++;
|
|
317
314
|
continue;
|
|
@@ -69,6 +69,8 @@ class InspectorIssues extends FRGatherer {
|
|
|
69
69
|
heavyAds: [],
|
|
70
70
|
/** @type {Array<LH.Crdp.Audits.ContentSecurityPolicyIssueDetails>} */
|
|
71
71
|
contentSecurityPolicy: [],
|
|
72
|
+
/** @type {Array<LH.Crdp.Audits.DeprecationIssueDetails>} */
|
|
73
|
+
deprecations: [],
|
|
72
74
|
};
|
|
73
75
|
|
|
74
76
|
for (const issue of this._issues) {
|
|
@@ -105,6 +107,9 @@ class InspectorIssues extends FRGatherer {
|
|
|
105
107
|
if (issue.details.contentSecurityPolicyIssueDetails) {
|
|
106
108
|
artifact.contentSecurityPolicy.push(issue.details.contentSecurityPolicyIssueDetails);
|
|
107
109
|
}
|
|
110
|
+
if (issue.details.deprecationIssueDetails) {
|
|
111
|
+
artifact.deprecations.push(issue.details.deprecationIssueDetails);
|
|
112
|
+
}
|
|
108
113
|
}
|
|
109
114
|
|
|
110
115
|
return artifact;
|