lighthouse 11.7.0 → 12.0.0-dev.20240422
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/CONTRIBUTING.md +2 -2
- package/cli/bin.js +0 -7
- package/cli/cli-flags.d.ts +1 -5
- package/cli/cli-flags.js +4 -8
- package/cli/test/smokehouse/__snapshots__/report-assert-test.js.snap +14 -14
- package/cli/test/smokehouse/config/exclusions.js +3 -0
- package/cli/test/smokehouse/core-tests.js +6 -20
- package/cli/test/smokehouse/frontends/smokehouse-bin.js +2 -2
- package/core/audits/accessibility/accesskeys.js +1 -1
- package/core/audits/accessibility/aria-allowed-attr.js +1 -1
- package/core/audits/accessibility/aria-allowed-role.js +1 -1
- package/core/audits/accessibility/aria-command-name.js +1 -1
- package/core/audits/accessibility/aria-conditional-attr.d.ts +10 -0
- package/core/audits/accessibility/aria-conditional-attr.js +43 -0
- package/core/audits/accessibility/{duplicate-id-active.d.ts → aria-deprecated-role.d.ts} +3 -3
- package/core/audits/accessibility/aria-deprecated-role.js +43 -0
- package/core/audits/accessibility/aria-dialog-name.js +1 -1
- package/core/audits/accessibility/aria-hidden-body.js +1 -1
- package/core/audits/accessibility/aria-hidden-focus.js +1 -1
- package/core/audits/accessibility/aria-input-field-name.js +1 -1
- package/core/audits/accessibility/aria-meter-name.js +1 -1
- package/core/audits/accessibility/aria-progressbar-name.js +1 -1
- package/core/audits/accessibility/aria-prohibited-attr.d.ts +10 -0
- package/core/audits/accessibility/aria-prohibited-attr.js +44 -0
- package/core/audits/accessibility/aria-required-attr.js +1 -1
- package/core/audits/accessibility/aria-required-children.js +1 -1
- package/core/audits/accessibility/aria-required-parent.js +1 -1
- package/core/audits/accessibility/aria-roles.js +1 -1
- package/core/audits/accessibility/aria-text.js +1 -1
- package/core/audits/accessibility/aria-toggle-field-name.js +1 -1
- package/core/audits/accessibility/aria-tooltip-name.js +1 -1
- package/core/audits/accessibility/aria-treeitem-name.js +1 -1
- package/core/audits/accessibility/aria-valid-attr-value.js +1 -1
- package/core/audits/accessibility/aria-valid-attr.js +1 -1
- package/core/audits/accessibility/button-name.js +1 -1
- package/core/audits/accessibility/bypass.js +1 -1
- package/core/audits/accessibility/color-contrast.js +1 -1
- package/core/audits/accessibility/definition-list.js +1 -1
- package/core/audits/accessibility/dlitem.js +1 -1
- package/core/audits/accessibility/document-title.js +1 -1
- package/core/audits/accessibility/duplicate-id-aria.js +1 -1
- package/core/audits/accessibility/empty-heading.js +1 -1
- package/core/audits/accessibility/form-field-multiple-labels.js +1 -1
- package/core/audits/accessibility/frame-title.js +1 -1
- package/core/audits/accessibility/heading-order.js +1 -1
- package/core/audits/accessibility/html-has-lang.js +1 -1
- package/core/audits/accessibility/html-lang-valid.js +1 -1
- package/core/audits/accessibility/html-xml-lang-mismatch.js +1 -1
- package/core/audits/accessibility/identical-links-same-purpose.js +1 -1
- package/core/audits/accessibility/image-alt.js +1 -1
- package/core/audits/accessibility/image-redundant-alt.js +1 -1
- package/core/audits/accessibility/input-button-name.js +1 -1
- package/core/audits/accessibility/input-image-alt.js +1 -1
- package/core/audits/accessibility/label-content-name-mismatch.js +1 -1
- package/core/audits/accessibility/label.js +1 -1
- package/core/audits/accessibility/landmark-one-main.js +1 -1
- package/core/audits/accessibility/link-in-text-block.js +1 -1
- package/core/audits/accessibility/link-name.js +1 -1
- package/core/audits/accessibility/list.js +1 -1
- package/core/audits/accessibility/listitem.js +1 -1
- package/core/audits/accessibility/meta-refresh.js +1 -1
- package/core/audits/accessibility/meta-viewport.js +1 -1
- package/core/audits/accessibility/object-alt.js +1 -1
- package/core/audits/accessibility/select-name.js +1 -1
- package/core/audits/accessibility/skip-link.js +1 -1
- package/core/audits/accessibility/tabindex.js +1 -1
- package/core/audits/accessibility/table-duplicate-name.js +1 -1
- package/core/audits/accessibility/table-fake-caption.js +1 -1
- package/core/audits/accessibility/target-size.js +1 -2
- package/core/audits/accessibility/td-has-header.js +1 -1
- package/core/audits/accessibility/td-headers-attr.js +1 -1
- package/core/audits/accessibility/th-has-data-cells.js +1 -1
- package/core/audits/accessibility/valid-lang.js +1 -1
- package/core/audits/accessibility/video-caption.js +1 -1
- package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +0 -16
- package/core/audits/byte-efficiency/byte-efficiency-audit.js +1 -38
- package/core/audits/byte-efficiency/offscreen-images.d.ts +0 -11
- package/core/audits/byte-efficiency/offscreen-images.js +0 -15
- package/core/audits/byte-efficiency/render-blocking-resources.js +27 -26
- package/core/audits/byte-efficiency/unminified-css.js +2 -2
- package/core/audits/byte-efficiency/unused-css-rules.js +3 -1
- package/core/audits/dobetterweb/uses-http2.d.ts +0 -13
- package/core/audits/dobetterweb/uses-http2.js +4 -38
- package/core/audits/font-display.js +2 -2
- package/core/audits/layout-shifts.js +2 -2
- package/core/audits/preload-fonts.d.ts +1 -5
- package/core/audits/preload-fonts.js +1 -10
- package/core/audits/prioritize-lcp-image.js +2 -2
- package/core/audits/redirects-http.d.ts +19 -0
- package/core/audits/redirects-http.js +75 -0
- package/core/audits/resource-summary.d.ts +2 -0
- package/core/audits/resource-summary.js +5 -4
- package/core/audits/seo/is-crawlable.d.ts +2 -1
- package/core/audits/seo/link-text.js +12 -0
- package/core/audits/uses-rel-preload.d.ts +1 -5
- package/core/audits/uses-rel-preload.js +5 -15
- package/core/audits/work-during-interaction.d.ts +2 -2
- package/core/audits/work-during-interaction.js +2 -2
- package/core/computed/js-bundles.d.ts +1 -1
- package/core/computed/metrics/cumulative-layout-shift.js +2 -2
- package/core/computed/metrics/lantern-first-contentful-paint.d.ts +13 -82
- package/core/computed/metrics/lantern-first-contentful-paint.js +16 -178
- package/core/computed/metrics/lantern-first-meaningful-paint.d.ts +13 -12
- package/core/computed/metrics/lantern-first-meaningful-paint.js +11 -49
- package/core/computed/metrics/lantern-interactive.d.ts +13 -21
- package/core/computed/metrics/lantern-interactive.js +12 -84
- package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +13 -25
- package/core/computed/metrics/lantern-largest-contentful-paint.js +13 -80
- package/core/computed/metrics/lantern-max-potential-fid.d.ts +13 -24
- package/core/computed/metrics/lantern-max-potential-fid.js +12 -64
- package/core/computed/metrics/lantern-metric.d.ts +14 -18
- package/core/computed/metrics/lantern-metric.js +34 -30
- package/core/computed/metrics/lantern-speed-index.d.ts +13 -32
- package/core/computed/metrics/lantern-speed-index.js +13 -116
- package/core/computed/metrics/lantern-total-blocking-time.d.ts +13 -25
- package/core/computed/metrics/lantern-total-blocking-time.js +10 -94
- package/core/computed/metrics/metric.js +1 -3
- package/core/computed/module-duplication.d.ts +1 -1
- package/core/computed/navigation-insights.d.ts +36 -0
- package/core/computed/navigation-insights.js +35 -0
- package/core/computed/page-dependency-graph.js +3 -7
- package/core/computed/resource-summary.d.ts +10 -12
- package/core/computed/resource-summary.js +12 -19
- package/core/computed/trace-engine-result.d.ts +16 -3
- package/core/computed/trace-engine-result.js +19 -14
- package/core/computed/unused-css.d.ts +3 -1
- package/core/computed/unused-css.js +6 -5
- package/core/config/config-helpers.js +0 -4
- package/core/config/constants.js +0 -1
- package/core/config/default-config.js +63 -142
- package/core/config/experimental-config.js +11 -0
- package/core/config/filters.js +0 -1
- package/core/gather/driver/navigation.js +4 -1
- package/core/gather/driver/prepare.js +1 -1
- package/core/gather/driver/target-manager.js +4 -3
- package/core/gather/driver/wait-for-condition.js +2 -3
- package/core/gather/driver.d.ts +12 -0
- package/core/gather/driver.js +27 -0
- package/core/gather/gatherers/accessibility.js +4 -6
- package/core/gather/gatherers/css-usage.d.ts +0 -21
- package/core/gather/gatherers/css-usage.js +9 -119
- package/core/gather/gatherers/root-causes.d.ts +2 -2
- package/core/gather/gatherers/root-causes.js +6 -5
- package/core/gather/gatherers/stylesheets.d.ts +26 -0
- package/core/gather/gatherers/stylesheets.js +138 -0
- package/core/gather/gatherers/trace-elements.d.ts +4 -13
- package/core/gather/gatherers/trace-elements.js +42 -31
- package/core/gather/navigation-runner.js +3 -1
- package/core/gather/session.d.ts +8 -0
- package/core/gather/session.js +14 -1
- package/core/lib/emulation.js +2 -2
- package/core/lib/i18n/i18n.d.ts +0 -1
- package/core/lib/i18n/i18n.js +0 -2
- package/core/lib/lantern/cpu-node.d.ts +7 -1
- package/core/lib/lantern/cpu-node.js +12 -2
- package/core/lib/lantern/lantern-error.d.ts +8 -0
- package/core/lib/lantern/lantern-error.js +9 -0
- package/core/lib/lantern/metric.js +2 -6
- package/core/lib/lantern/metrics/first-contentful-paint.d.ts +79 -0
- package/core/lib/lantern/metrics/first-contentful-paint.js +200 -0
- package/core/lib/lantern/metrics/first-meaningful-paint.d.ts +6 -0
- package/core/lib/lantern/metrics/first-meaningful-paint.js +64 -0
- package/core/lib/lantern/metrics/interactive.d.ts +26 -0
- package/core/lib/lantern/metrics/interactive.js +112 -0
- package/core/lib/lantern/metrics/largest-contentful-paint.d.ts +19 -0
- package/core/lib/lantern/metrics/largest-contentful-paint.js +108 -0
- package/core/lib/lantern/metrics/max-potential-fid.d.ts +30 -0
- package/core/lib/lantern/metrics/max-potential-fid.js +92 -0
- package/core/lib/lantern/metrics/speed-index.d.ts +38 -0
- package/core/lib/lantern/metrics/speed-index.js +144 -0
- package/core/lib/lantern/metrics/total-blocking-time.d.ts +31 -0
- package/core/lib/lantern/metrics/total-blocking-time.js +128 -0
- package/core/lib/lantern/network-node.js +28 -4
- package/core/lib/lantern/page-dependency-graph.d.ts +4 -4
- package/core/lib/lantern/page-dependency-graph.js +19 -7
- package/core/lib/lantern/simulator/connection-pool.d.ts +2 -12
- package/core/lib/lantern/simulator/connection-pool.js +3 -22
- package/core/lib/lantern/simulator/network-analyzer.js +1 -12
- package/core/lib/lantern/simulator/simulator.d.ts +2 -4
- package/core/lib/lantern/simulator/simulator.js +7 -14
- package/core/lib/lantern/types/lantern.d.ts +5 -3
- package/core/lib/lantern-trace-saver.js +0 -1
- package/core/lib/lh-error.d.ts +9 -0
- package/core/lib/lh-error.js +13 -3
- package/core/lib/lighthouse-compatibility.js +53 -10
- package/core/lib/navigation-error.js +3 -0
- package/core/lib/network-request.d.ts +1 -0
- package/core/lib/network-request.js +29 -1
- package/core/lib/proto-preprocessor.js +24 -8
- package/core/lib/tracehouse/trace-processor.js +15 -2
- package/core/runner.js +18 -25
- package/dist/report/bundle.esm.js +11 -112
- package/dist/report/flow.js +16 -117
- package/dist/report/standalone.js +12 -113
- package/flow-report/src/help-dialog.tsx +0 -1
- package/flow-report/src/i18n/i18n.d.ts +0 -4
- package/flow-report/src/i18n/ui-strings.d.ts +0 -1
- package/flow-report/src/i18n/ui-strings.js +0 -2
- package/flow-report/src/summary/category.tsx +10 -12
- package/package.json +7 -7
- package/readme.md +4 -4
- package/report/assets/styles.css +1 -60
- package/report/assets/templates.html +0 -95
- package/report/renderer/category-renderer.js +1 -1
- package/report/renderer/components.d.ts +2 -2
- package/report/renderer/components.js +2 -103
- package/report/renderer/dom.d.ts +1 -1
- package/report/renderer/dom.js +1 -1
- package/report/renderer/performance-category-renderer.d.ts +0 -7
- package/report/renderer/performance-category-renderer.js +1 -32
- package/report/renderer/report-renderer.js +3 -13
- package/report/renderer/report-ui-features.js +1 -1
- package/report/renderer/report-utils.d.ts +0 -1
- package/report/renderer/report-utils.js +13 -13
- package/shared/localization/locales/ar-XB.json +62 -329
- package/shared/localization/locales/ar.json +62 -329
- package/shared/localization/locales/bg.json +62 -329
- package/shared/localization/locales/ca.json +62 -329
- package/shared/localization/locales/cs.json +62 -329
- package/shared/localization/locales/da.json +62 -329
- package/shared/localization/locales/de.json +62 -329
- package/shared/localization/locales/el.json +62 -329
- package/shared/localization/locales/en-GB.json +62 -329
- package/shared/localization/locales/en-US.json +101 -332
- package/shared/localization/locales/en-XA.json +62 -329
- package/shared/localization/locales/en-XL.json +101 -332
- package/shared/localization/locales/es-419.json +62 -329
- package/shared/localization/locales/es.json +62 -329
- package/shared/localization/locales/fi.json +62 -329
- package/shared/localization/locales/fil.json +61 -328
- package/shared/localization/locales/fr.json +62 -329
- package/shared/localization/locales/he.json +62 -329
- package/shared/localization/locales/hi.json +62 -329
- package/shared/localization/locales/hr.json +63 -330
- package/shared/localization/locales/hu.json +62 -329
- package/shared/localization/locales/id.json +62 -329
- package/shared/localization/locales/it.json +62 -329
- package/shared/localization/locales/ja.json +62 -329
- package/shared/localization/locales/ko.json +62 -329
- package/shared/localization/locales/lt.json +62 -329
- package/shared/localization/locales/lv.json +62 -329
- package/shared/localization/locales/nl.json +62 -329
- package/shared/localization/locales/no.json +62 -329
- package/shared/localization/locales/pl.json +61 -328
- package/shared/localization/locales/pt-PT.json +62 -329
- package/shared/localization/locales/pt.json +64 -331
- package/shared/localization/locales/ro.json +62 -329
- package/shared/localization/locales/ru.json +62 -329
- package/shared/localization/locales/sk.json +62 -329
- package/shared/localization/locales/sl.json +62 -329
- package/shared/localization/locales/sr-Latn.json +62 -329
- package/shared/localization/locales/sr.json +62 -329
- package/shared/localization/locales/sv.json +62 -329
- package/shared/localization/locales/ta.json +61 -328
- package/shared/localization/locales/te.json +62 -329
- package/shared/localization/locales/th.json +62 -329
- package/shared/localization/locales/tr.json +62 -329
- package/shared/localization/locales/uk.json +62 -329
- package/shared/localization/locales/vi.json +61 -328
- package/shared/localization/locales/zh-HK.json +62 -329
- package/shared/localization/locales/zh-TW.json +61 -328
- package/shared/localization/locales/zh.json +62 -329
- package/tsconfig.json +1 -3
- package/types/artifacts.d.ts +21 -110
- package/types/audit.d.ts +0 -10
- package/types/config.d.ts +0 -1
- package/types/externs.d.ts +0 -2
- package/types/gatherer.d.ts +3 -0
- package/types/internal/smokehouse.d.ts +1 -1
- package/types/lh.d.ts +0 -2
- package/types/lhr/audit-details.d.ts +9 -4
- package/types/lhr/lhr.d.ts +0 -4
- package/types/lhr/settings.d.ts +0 -4
- package/core/audits/accessibility/duplicate-id-active.js +0 -42
- package/core/audits/content-width.d.ts +0 -17
- package/core/audits/content-width.js +0 -76
- package/core/audits/installable-manifest.d.ts +0 -111
- package/core/audits/installable-manifest.js +0 -248
- package/core/audits/layout-shift-elements.d.ts +0 -16
- package/core/audits/layout-shift-elements.js +0 -101
- package/core/audits/manual/pwa-cross-browser.d.ts +0 -12
- package/core/audits/manual/pwa-cross-browser.js +0 -40
- package/core/audits/manual/pwa-each-page-has-url.d.ts +0 -12
- package/core/audits/manual/pwa-each-page-has-url.js +0 -38
- package/core/audits/manual/pwa-page-transitions.d.ts +0 -12
- package/core/audits/manual/pwa-page-transitions.js +0 -38
- package/core/audits/maskable-icon.d.ts +0 -25
- package/core/audits/maskable-icon.js +0 -70
- package/core/audits/multi-check-audit.d.ts +0 -28
- package/core/audits/multi-check-audit.js +0 -82
- package/core/audits/no-unload-listeners.d.ts +0 -16
- package/core/audits/no-unload-listeners.js +0 -86
- package/core/audits/performance-budget.d.ts +0 -39
- package/core/audits/performance-budget.js +0 -154
- package/core/audits/script-elements-test-audit.d.ts +0 -14
- package/core/audits/script-elements-test-audit.js +0 -29
- package/core/audits/seo/plugins.d.ts +0 -15
- package/core/audits/seo/plugins.js +0 -150
- package/core/audits/seo/tap-targets.d.ts +0 -50
- package/core/audits/seo/tap-targets.js +0 -352
- package/core/audits/splash-screen.d.ts +0 -37
- package/core/audits/splash-screen.js +0 -98
- package/core/audits/themed-omnibox.d.ts +0 -42
- package/core/audits/themed-omnibox.js +0 -102
- package/core/audits/timing-budget.d.ts +0 -43
- package/core/audits/timing-budget.js +0 -175
- package/core/computed/manifest-values.d.ts +0 -24
- package/core/computed/manifest-values.js +0 -136
- package/core/config/budget.d.ts +0 -74
- package/core/config/budget.js +0 -340
- package/core/config/metrics-to-audits.d.ts +0 -19
- package/core/config/metrics-to-audits.js +0 -62
- package/core/gather/driver/service-workers.d.ts +0 -16
- package/core/gather/driver/service-workers.js +0 -52
- package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.d.ts +0 -47
- package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.js +0 -233
- package/core/gather/gatherers/global-listeners.d.ts +0 -27
- package/core/gather/gatherers/global-listeners.js +0 -108
- package/core/gather/gatherers/installability-errors.d.ts +0 -17
- package/core/gather/gatherers/installability-errors.js +0 -56
- package/core/gather/gatherers/script-elements.d.ts +0 -21
- package/core/gather/gatherers/script-elements.js +0 -100
- package/core/gather/gatherers/seo/embedded-content.d.ts +0 -10
- package/core/gather/gatherers/seo/embedded-content.js +0 -63
- package/core/gather/gatherers/seo/tap-targets.d.ts +0 -21
- package/core/gather/gatherers/seo/tap-targets.js +0 -389
- package/core/gather/gatherers/service-worker.d.ts +0 -10
- package/core/gather/gatherers/service-worker.js +0 -32
- package/core/gather/gatherers/web-app-manifest.d.ts +0 -32
- package/core/gather/gatherers/web-app-manifest.js +0 -106
- package/report/renderer/pwa-category-renderer.d.ts +0 -55
- package/report/renderer/pwa-category-renderer.js +0 -184
- package/third-party/chromium-synchronization/installability-errors-test.js +0 -79
- package/types/lhr/budget.d.ts +0 -60
|
@@ -247,6 +247,7 @@ export class NetworkRequest {
|
|
|
247
247
|
* is passed in via X-Headers similar to 'X-TotalFetchedSize'.
|
|
248
248
|
*/
|
|
249
249
|
_updateTimingsForLightrider(): void;
|
|
250
|
+
serverResponseTime: number | undefined;
|
|
250
251
|
}
|
|
251
252
|
export namespace NetworkRequest {
|
|
252
253
|
export { HEADER_TCP };
|
|
@@ -536,6 +536,7 @@ class NetworkRequest {
|
|
|
536
536
|
requestMs: requestMs,
|
|
537
537
|
responseMs: responseMs,
|
|
538
538
|
};
|
|
539
|
+
this.serverResponseTime = responseMs;
|
|
539
540
|
}
|
|
540
541
|
|
|
541
542
|
/**
|
|
@@ -574,8 +575,35 @@ class NetworkRequest {
|
|
|
574
575
|
* @return {Lantern.NetworkRequest<NetworkRequest>}
|
|
575
576
|
*/
|
|
576
577
|
static asLanternNetworkRequest(record) {
|
|
578
|
+
// In LR, network records are missing connection timing, but we've smuggled it in via headers.
|
|
579
|
+
let timing = record.timing;
|
|
580
|
+
let serverResponseTime;
|
|
581
|
+
if (global.isLightrider && record.lrStatistics) {
|
|
582
|
+
if (record.protocol.startsWith('h3')) {
|
|
583
|
+
// @ts-expect-error We don't need all the properties set.
|
|
584
|
+
timing = {
|
|
585
|
+
connectStart: 0,
|
|
586
|
+
connectEnd: record.lrStatistics.TCPMs,
|
|
587
|
+
};
|
|
588
|
+
} else {
|
|
589
|
+
// @ts-expect-error We don't need all the properties set.
|
|
590
|
+
timing = {
|
|
591
|
+
connectStart: 0,
|
|
592
|
+
sslStart: record.lrStatistics.TCPMs / 2,
|
|
593
|
+
connectEnd: record.lrStatistics.TCPMs,
|
|
594
|
+
sslEnd: record.lrStatistics.TCPMs,
|
|
595
|
+
};
|
|
596
|
+
|
|
597
|
+
// Lightrider does not have timings for sendEnd, but we do have this timing which should be
|
|
598
|
+
// close to the response time.
|
|
599
|
+
serverResponseTime = record.lrStatistics.requestMs;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
577
603
|
return {
|
|
578
604
|
...record,
|
|
605
|
+
timing,
|
|
606
|
+
serverResponseTime,
|
|
579
607
|
record,
|
|
580
608
|
};
|
|
581
609
|
}
|
|
@@ -634,7 +662,7 @@ class NetworkRequest {
|
|
|
634
662
|
/^content-encoding$/i,
|
|
635
663
|
/^x-content-encoding-over-network$/i,
|
|
636
664
|
];
|
|
637
|
-
const compressionTypes = ['gzip', 'br', 'deflate'];
|
|
665
|
+
const compressionTypes = ['gzip', 'br', 'deflate', 'zstd'];
|
|
638
666
|
return record.responseHeaders.some(header =>
|
|
639
667
|
patterns.some(p => header.name.match(p)) && compressionTypes.includes(header.value)
|
|
640
668
|
);
|
|
@@ -83,28 +83,44 @@ function processForProto(lhr) {
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
/**
|
|
86
|
-
*
|
|
86
|
+
* Execute `cb(obj, key)` on every object property where obj[key] is a string, recursively.
|
|
87
87
|
* @param {any} obj
|
|
88
|
+
* @param {(obj: Record<string, string>, key: string) => void} cb
|
|
88
89
|
*/
|
|
89
|
-
function
|
|
90
|
+
function iterateStrings(obj, cb) {
|
|
90
91
|
if (obj && typeof obj === 'object' && !Array.isArray(obj)) {
|
|
91
92
|
Object.keys(obj).forEach(key => {
|
|
92
|
-
if (typeof obj[key] === 'string'
|
|
93
|
-
|
|
94
|
-
} else
|
|
95
|
-
|
|
93
|
+
if (typeof obj[key] === 'string') {
|
|
94
|
+
cb(obj, key);
|
|
95
|
+
} else {
|
|
96
|
+
iterateStrings(obj[key], cb);
|
|
96
97
|
}
|
|
97
98
|
});
|
|
98
99
|
} else if (Array.isArray(obj)) {
|
|
99
100
|
obj.forEach(item => {
|
|
100
101
|
if (typeof item === 'object' || Array.isArray(item)) {
|
|
101
|
-
|
|
102
|
+
iterateStrings(item, cb);
|
|
102
103
|
}
|
|
103
104
|
});
|
|
104
105
|
}
|
|
105
106
|
}
|
|
106
107
|
|
|
107
|
-
|
|
108
|
+
iterateStrings(reportJson, (obj, key) => {
|
|
109
|
+
const value = obj[key];
|
|
110
|
+
|
|
111
|
+
// Remove empty strings, as they are dropped after round-tripping anyway.
|
|
112
|
+
if (value === '') {
|
|
113
|
+
delete obj[key];
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Sanitize lone surrogates.
|
|
118
|
+
// @ts-expect-error node 20
|
|
119
|
+
if (String.prototype.isWellFormed && !value.isWellFormed()) {
|
|
120
|
+
// @ts-expect-error node 20
|
|
121
|
+
obj[key] = value.toWellFormed();
|
|
122
|
+
}
|
|
123
|
+
});
|
|
108
124
|
|
|
109
125
|
return reportJson;
|
|
110
126
|
}
|
|
@@ -403,6 +403,9 @@ class TraceProcessor {
|
|
|
403
403
|
*/
|
|
404
404
|
static getMainThreadTopLevelEvents(trace, startTime = 0, endTime = Infinity) {
|
|
405
405
|
const topLevelEvents = [];
|
|
406
|
+
/** @type {ToplevelEvent|undefined} */
|
|
407
|
+
let prevToplevel = undefined;
|
|
408
|
+
|
|
406
409
|
// note: mainThreadEvents is already sorted by event start
|
|
407
410
|
for (const event of trace.mainThreadEvents) {
|
|
408
411
|
if (!this.isScheduleableTask(event) || !event.dur) continue;
|
|
@@ -411,11 +414,21 @@ class TraceProcessor {
|
|
|
411
414
|
const end = (event.ts + event.dur - trace.timeOriginEvt.ts) / 1000;
|
|
412
415
|
if (start > endTime || end < startTime) continue;
|
|
413
416
|
|
|
414
|
-
|
|
417
|
+
// Temporary fix for a Chrome bug where some RunTask events can be overlapping.
|
|
418
|
+
// We correct that here be ensuring each RunTask ends at least 1 microsecond before the next
|
|
419
|
+
// https://github.com/GoogleChrome/lighthouse/issues/15896
|
|
420
|
+
// https://issues.chromium.org/issues/329678173
|
|
421
|
+
if (prevToplevel && start < prevToplevel.end) {
|
|
422
|
+
prevToplevel.end = start - 0.001;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
prevToplevel = {
|
|
415
426
|
start,
|
|
416
427
|
end,
|
|
417
428
|
duration: event.dur / 1000,
|
|
418
|
-
}
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
topLevelEvents.push(prevToplevel);
|
|
419
432
|
}
|
|
420
433
|
|
|
421
434
|
return topLevelEvents;
|
package/core/runner.js
CHANGED
|
@@ -106,7 +106,6 @@ class Runner {
|
|
|
106
106
|
networkUserAgent: artifacts.NetworkUserAgent,
|
|
107
107
|
hostUserAgent: artifacts.HostUserAgent,
|
|
108
108
|
benchmarkIndex: artifacts.BenchmarkIndex,
|
|
109
|
-
benchmarkIndexes: artifacts.BenchmarkIndexes,
|
|
110
109
|
credits,
|
|
111
110
|
},
|
|
112
111
|
audits: auditResultsById,
|
|
@@ -199,32 +198,27 @@ class Runner {
|
|
|
199
198
|
data: sentryContext,
|
|
200
199
|
});
|
|
201
200
|
|
|
202
|
-
/** @type {LH.Artifacts} */
|
|
203
|
-
let artifacts;
|
|
204
201
|
if (settings.auditMode && !settings.gatherMode) {
|
|
205
202
|
// No browser required, just load the artifacts from disk.
|
|
206
203
|
const path = this._getDataSavePath(settings);
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const path = this._getDataSavePath(settings);
|
|
226
|
-
await assetSaver.saveArtifacts(artifacts, path);
|
|
227
|
-
}
|
|
204
|
+
return assetSaver.loadArtifacts(path);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const runnerStatus = {msg: 'Gather phase', id: 'lh:runner:gather'};
|
|
208
|
+
log.time(runnerStatus, 'verbose');
|
|
209
|
+
|
|
210
|
+
const artifacts = await gatherFn({resolvedConfig: options.resolvedConfig});
|
|
211
|
+
log.timeEnd(runnerStatus);
|
|
212
|
+
|
|
213
|
+
// If `gather` is run multiple times before `audit`, the timing entries for each `gather` can pollute one another.
|
|
214
|
+
// We need to clear the timing entries at the end of gathering.
|
|
215
|
+
// Set artifacts.Timing again to ensure lh:runner:gather is included.
|
|
216
|
+
artifacts.Timing = log.takeTimeEntries();
|
|
217
|
+
|
|
218
|
+
// -G means save these to disk (e.g. ./latest-run).
|
|
219
|
+
if (settings.gatherMode) {
|
|
220
|
+
const path = this._getDataSavePath(settings);
|
|
221
|
+
await assetSaver.saveArtifacts(artifacts, path);
|
|
228
222
|
}
|
|
229
223
|
|
|
230
224
|
return artifacts;
|
|
@@ -304,7 +298,6 @@ class Runner {
|
|
|
304
298
|
auditMode: undefined,
|
|
305
299
|
output: undefined,
|
|
306
300
|
channel: undefined,
|
|
307
|
-
budgets: undefined,
|
|
308
301
|
};
|
|
309
302
|
const normalizedGatherSettings = Object.assign({}, artifacts.settings, overrides);
|
|
310
303
|
const normalizedAuditSettings = Object.assign({}, settings, overrides);
|