lighthouse 13.0.0 → 13.0.1

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.
Files changed (67) hide show
  1. package/core/audits/audit.js +2 -2
  2. package/core/audits/bootup-time.js +1 -1
  3. package/core/audits/byte-efficiency/unminified-css.js +1 -1
  4. package/core/audits/byte-efficiency/unminified-javascript.js +1 -1
  5. package/core/audits/byte-efficiency/unused-css-rules.js +2 -2
  6. package/core/audits/byte-efficiency/unused-javascript.js +1 -1
  7. package/core/audits/insights/cache-insight.js +1 -1
  8. package/core/audits/insights/cls-culprits-insight.js +1 -1
  9. package/core/audits/insights/document-latency-insight.js +1 -1
  10. package/core/audits/insights/dom-size-insight.js +1 -1
  11. package/core/audits/insights/duplicated-javascript-insight.js +1 -1
  12. package/core/audits/insights/font-display-insight.js +1 -1
  13. package/core/audits/insights/forced-reflow-insight.js +1 -1
  14. package/core/audits/insights/image-delivery-insight.js +1 -1
  15. package/core/audits/insights/inp-breakdown-insight.js +1 -1
  16. package/core/audits/insights/insight-audit.js +3 -2
  17. package/core/audits/insights/lcp-breakdown-insight.js +1 -1
  18. package/core/audits/insights/lcp-discovery-insight.js +1 -1
  19. package/core/audits/insights/legacy-javascript-insight.js +1 -1
  20. package/core/audits/insights/modern-http-insight.js +1 -1
  21. package/core/audits/insights/network-dependency-tree-insight.js +1 -1
  22. package/core/audits/insights/render-blocking-insight.js +1 -1
  23. package/core/audits/insights/slow-css-selector-insight.js +1 -1
  24. package/core/audits/insights/third-parties-insight.js +1 -1
  25. package/core/audits/insights/viewport-insight.js +1 -1
  26. package/core/audits/layout-shifts.js +3 -3
  27. package/core/audits/long-tasks.js +3 -3
  28. package/core/audits/mainthread-work-breakdown.js +1 -1
  29. package/core/audits/metrics/first-contentful-paint.js +2 -1
  30. package/core/audits/metrics/interactive.js +2 -1
  31. package/core/audits/metrics/largest-contentful-paint.js +2 -1
  32. package/core/audits/metrics/max-potential-fid.js +2 -1
  33. package/core/audits/metrics/speed-index.js +4 -2
  34. package/core/audits/metrics/total-blocking-time.js +4 -2
  35. package/core/audits/metrics.js +3 -3
  36. package/core/audits/predictive-perf.js +3 -3
  37. package/core/audits/redirects.js +3 -3
  38. package/core/audits/server-response-time.js +4 -3
  39. package/core/computed/metrics/first-contentful-paint-all-frames.js +1 -1
  40. package/core/computed/metrics/first-contentful-paint.js +1 -1
  41. package/core/computed/metrics/interactive.js +1 -1
  42. package/core/computed/metrics/lantern-first-contentful-paint.js +1 -1
  43. package/core/computed/metrics/lantern-interactive.js +1 -1
  44. package/core/computed/metrics/lantern-largest-contentful-paint.js +1 -1
  45. package/core/computed/metrics/lantern-max-potential-fid.js +1 -1
  46. package/core/computed/metrics/lantern-speed-index.js +1 -1
  47. package/core/computed/metrics/lantern-total-blocking-time.js +1 -1
  48. package/core/computed/metrics/largest-contentful-paint-all-frames.js +1 -1
  49. package/core/computed/metrics/largest-contentful-paint.js +1 -1
  50. package/core/computed/metrics/lcp-breakdown.js +4 -3
  51. package/core/computed/metrics/max-potential-fid.js +1 -1
  52. package/core/computed/metrics/metric.js +1 -0
  53. package/core/computed/metrics/speed-index.js +1 -1
  54. package/core/computed/metrics/time-to-first-byte.js +5 -4
  55. package/core/computed/metrics/timing-summary.d.ts +5 -2
  56. package/core/computed/metrics/timing-summary.js +7 -4
  57. package/core/computed/metrics/total-blocking-time.js +1 -1
  58. package/core/computed/navigation-insights.d.ts +3 -1
  59. package/core/computed/navigation-insights.js +4 -4
  60. package/core/computed/page-dependency-graph.d.ts +3 -1
  61. package/core/computed/page-dependency-graph.js +4 -4
  62. package/core/computed/tbt-impact-tasks.js +1 -1
  63. package/core/computed/trace-engine-result.d.ts +5 -2
  64. package/core/computed/trace-engine-result.js +7 -4
  65. package/core/gather/gatherers/trace-elements.js +2 -1
  66. package/package.json +1 -1
  67. package/types/artifacts.d.ts +3 -2
@@ -496,9 +496,9 @@ class Audit {
496
496
  const trace = artifacts.Trace;
497
497
  const devtoolsLog = artifacts.DevtoolsLog;
498
498
  const gatherContext = artifacts.GatherContext;
499
- const {URL, SourceMaps} = artifacts;
499
+ const {URL, HostDPR, SourceMaps} = artifacts;
500
500
  // eslint-disable-next-line max-len
501
- return {trace, devtoolsLog, gatherContext, settings: context.settings, URL, SourceMaps, simulator: null};
501
+ return {trace, devtoolsLog, gatherContext, settings: context.settings, URL, SourceMaps, HostDPR, simulator: null};
502
502
  }
503
503
  }
504
504
 
@@ -49,7 +49,7 @@ class BootupTime extends Audit {
49
49
  description: str_(UIStrings.description),
50
50
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
51
51
  guidanceLevel: 1,
52
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'URL', 'GatherContext', 'SourceMaps'],
52
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'URL', 'GatherContext', 'SourceMaps', 'HostDPR'],
53
53
  };
54
54
  }
55
55
 
@@ -38,7 +38,7 @@ class UnminifiedCSS extends ByteEfficiencyAudit {
38
38
  scoreDisplayMode: ByteEfficiencyAudit.SCORING_MODES.METRIC_SAVINGS,
39
39
  guidanceLevel: 3,
40
40
  requiredArtifacts: ['Stylesheets', 'DevtoolsLog', 'Trace', 'URL', 'GatherContext',
41
- 'SourceMaps'],
41
+ 'SourceMaps', 'HostDPR'],
42
42
  };
43
43
  }
44
44
 
@@ -45,7 +45,7 @@ class UnminifiedJavaScript extends ByteEfficiencyAudit {
45
45
  scoreDisplayMode: ByteEfficiencyAudit.SCORING_MODES.METRIC_SAVINGS,
46
46
  guidanceLevel: 3,
47
47
  requiredArtifacts: ['Scripts', 'DevtoolsLog', 'Trace', 'GatherContext', 'URL',
48
- 'SourceMaps'],
48
+ 'SourceMaps', 'HostDPR'],
49
49
  };
50
50
  }
51
51
 
@@ -34,8 +34,8 @@ class UnusedCSSRules extends ByteEfficiencyAudit {
34
34
  description: str_(UIStrings.description),
35
35
  scoreDisplayMode: ByteEfficiencyAudit.SCORING_MODES.METRIC_SAVINGS,
36
36
  guidanceLevel: 1,
37
- requiredArtifacts:
38
- ['Stylesheets', 'CSSUsage', 'URL', 'DevtoolsLog', 'Trace', 'GatherContext', 'SourceMaps'],
37
+ // eslint-disable-next-line max-len
38
+ requiredArtifacts: ['Stylesheets', 'CSSUsage', 'URL', 'DevtoolsLog', 'Trace', 'GatherContext', 'SourceMaps', 'HostDPR'],
39
39
  };
40
40
  }
41
41
 
@@ -69,7 +69,7 @@ class UnusedJavaScript extends ByteEfficiencyAudit {
69
69
  scoreDisplayMode: ByteEfficiencyAudit.SCORING_MODES.METRIC_SAVINGS,
70
70
  guidanceLevel: 1,
71
71
  requiredArtifacts: ['JsUsage', 'Scripts', 'SourceMaps', 'GatherContext',
72
- 'DevtoolsLog', 'Trace', 'URL', 'SourceMaps'],
72
+ 'DevtoolsLog', 'Trace', 'URL', 'HostDPR'],
73
73
  };
74
74
  }
75
75
 
@@ -24,7 +24,7 @@ class CacheInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['uses-long-cache-ttl'],
29
29
  };
30
30
  }
@@ -37,7 +37,7 @@ class CLSCulpritsInsight extends Audit {
37
37
  failureTitle: insightStr_(InsightUIStrings.title),
38
38
  description: insightStr_(InsightUIStrings.description),
39
39
  guidanceLevel: 3,
40
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
40
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
41
41
  replacesAudits: ['layout-shifts'],
42
42
  };
43
43
  }
@@ -24,7 +24,7 @@ class DocumentLatencyInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['redirects', 'server-response-time', 'uses-text-compression'],
29
29
  };
30
30
  }
@@ -24,7 +24,7 @@ class DOMSizeInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['dom-size'],
29
29
  };
30
30
  }
@@ -27,7 +27,7 @@ class DuplicatedJavaScriptInsight extends Audit {
27
27
  failureTitle: str_(UIStrings.title),
28
28
  description: str_(UIStrings.description),
29
29
  guidanceLevel: 2,
30
- requiredArtifacts: ['Trace', 'SourceMaps'],
30
+ requiredArtifacts: ['Trace', 'SourceMaps', 'HostDPR'],
31
31
  replacesAudits: ['duplicated-javascript'],
32
32
  };
33
33
  }
@@ -24,7 +24,7 @@ class FontDisplayInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['font-display'],
29
29
  };
30
30
  }
@@ -24,7 +24,7 @@ class ForcedReflowInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  };
29
29
  }
30
30
 
@@ -29,7 +29,7 @@ class ImageDeliveryInsight extends Audit {
29
29
  failureTitle: str_(UIStrings.title),
30
30
  description: str_(UIStrings.description),
31
31
  guidanceLevel: 3,
32
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
32
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
33
33
  replacesAudits: [
34
34
  'modern-image-formats',
35
35
  'uses-optimized-images',
@@ -24,7 +24,7 @@ class INPBreakdownInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['work-during-interaction'],
29
29
  };
30
30
  }
@@ -22,8 +22,9 @@ async function getInsightSet(artifacts, context) {
22
22
  const settings = context.settings;
23
23
  const trace = artifacts.Trace;
24
24
  const processedTrace = await ProcessedTrace.request(trace, context);
25
- const SourceMaps = artifacts.SourceMaps;
26
- const traceEngineResult = await TraceEngineResult.request({trace, settings, SourceMaps}, context);
25
+ const {SourceMaps, HostDPR} = artifacts;
26
+ const traceEngineResult =
27
+ await TraceEngineResult.request({trace, settings, SourceMaps, HostDPR}, context);
27
28
 
28
29
  const navigationId = processedTrace.timeOriginEvt.args.data?.navigationId;
29
30
  const key = navigationId ?? NO_NAVIGATION;
@@ -24,7 +24,7 @@ class LCPBreakdownInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['largest-contentful-paint-element'],
29
29
  };
30
30
  }
@@ -24,7 +24,7 @@ class LCPDiscoveryInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['prioritize-lcp-image', 'lcp-lazy-loaded'],
29
29
  };
30
30
  }
@@ -28,7 +28,7 @@ class LegacyJavaScriptInsight extends Audit {
28
28
  failureTitle: str_(UIStrings.title),
29
29
  description: str_(UIStrings.description),
30
30
  guidanceLevel: 2,
31
- requiredArtifacts: ['Trace', 'Scripts', 'SourceMaps'],
31
+ requiredArtifacts: ['Trace', 'Scripts', 'SourceMaps', 'HostDPR'],
32
32
  };
33
33
  }
34
34
 
@@ -24,7 +24,7 @@ class ModernHTTPInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'SourceMaps', 'HostDPR'],
28
28
  };
29
29
  }
30
30
 
@@ -24,7 +24,7 @@ class NetworkDependencyTreeInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 1,
27
- requiredArtifacts: ['Trace', 'SourceMaps', 'TraceElements'],
27
+ requiredArtifacts: ['Trace', 'SourceMaps', 'TraceElements', 'HostDPR'],
28
28
  replacesAudits: ['critical-request-chains', 'uses-rel-preconnect'],
29
29
  };
30
30
  }
@@ -24,7 +24,7 @@ class RenderBlockingInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['render-blocking-resources'],
29
29
  };
30
30
  }
@@ -28,7 +28,7 @@ class SlowCSSSelectorInsight extends Audit {
28
28
  failureTitle: str_(UIStrings.title),
29
29
  description: str_(UIStrings.description),
30
30
  guidanceLevel: 3,
31
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
31
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
32
32
  };
33
33
  }
34
34
 
@@ -32,7 +32,7 @@ class ThirdPartiesInsight extends Audit {
32
32
  failureTitle: str_(UIStrings.title),
33
33
  description: str_(UIStrings.description),
34
34
  guidanceLevel: 3,
35
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
35
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
36
36
  replacesAudits: ['third-party-summary'],
37
37
  };
38
38
  }
@@ -24,7 +24,7 @@ class ViewportInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
27
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
28
28
  replacesAudits: ['viewport'],
29
29
  };
30
30
  }
@@ -47,7 +47,7 @@ class LayoutShifts extends Audit {
47
47
  description: str_(UIStrings.description),
48
48
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
49
49
  guidanceLevel: 2,
50
- requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps'],
50
+ requiredArtifacts: ['Trace', 'TraceElements', 'SourceMaps', 'HostDPR'],
51
51
  };
52
52
  }
53
53
 
@@ -59,9 +59,9 @@ class LayoutShifts extends Audit {
59
59
  static async audit(artifacts, context) {
60
60
  const settings = context.settings;
61
61
  const trace = artifacts.Trace;
62
- const SourceMaps = artifacts.SourceMaps;
62
+ const {SourceMaps, HostDPR} = artifacts;
63
63
  const traceEngineResult =
64
- await TraceEngineResult.request({trace, settings, SourceMaps}, context);
64
+ await TraceEngineResult.request({trace, settings, SourceMaps, HostDPR}, context);
65
65
  const clusters = traceEngineResult.data.LayoutShifts.clusters ?? [];
66
66
  const {cumulativeLayoutShift: clsSavings, impactByNodeId} =
67
67
  await CumulativeLayoutShiftComputed.request(trace, context);
@@ -68,7 +68,7 @@ class LongTasks extends Audit {
68
68
  scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
69
69
  title: str_(UIStrings.title),
70
70
  description: str_(UIStrings.description),
71
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'URL', 'GatherContext', 'SourceMaps'],
71
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'URL', 'GatherContext', 'SourceMaps', 'HostDPR'],
72
72
  guidanceLevel: 1,
73
73
  };
74
74
  }
@@ -176,7 +176,7 @@ class LongTasks extends Audit {
176
176
  */
177
177
  static async audit(artifacts, context) {
178
178
  const settings = context.settings || {};
179
- const {URL, SourceMaps} = artifacts;
179
+ const {URL, HostDPR, SourceMaps} = artifacts;
180
180
  const trace = artifacts.Trace;
181
181
  const tasks = await MainThreadTasks.request(trace, context);
182
182
  const devtoolsLog = artifacts.DevtoolsLog;
@@ -194,7 +194,7 @@ class LongTasks extends Audit {
194
194
  const simulatorOptions = {devtoolsLog, settings: context.settings};
195
195
  const pageGraph =
196
196
  // eslint-disable-next-line max-len
197
- await PageDependencyGraph.request({settings, trace, devtoolsLog, URL, SourceMaps, fromTrace: false}, context);
197
+ await PageDependencyGraph.request({settings, trace, devtoolsLog, URL, SourceMaps, HostDPR, fromTrace: false}, context);
198
198
  const simulator = await LoadSimulator.request(simulatorOptions, context);
199
199
  const simulation = simulator.simulate(pageGraph, {label: 'long-tasks-diagnostic'});
200
200
  for (const [node, timing] of simulation.nodeTimings.entries()) {
@@ -46,7 +46,7 @@ class MainThreadWorkBreakdown extends Audit {
46
46
  description: str_(UIStrings.description),
47
47
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
48
48
  guidanceLevel: 1,
49
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'URL', 'GatherContext', 'SourceMaps'],
49
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'URL', 'GatherContext', 'SourceMaps', 'HostDPR'],
50
50
  };
51
51
  }
52
52
 
@@ -27,7 +27,7 @@ class FirstContentfulPaint extends Audit {
27
27
  description: str_(UIStrings.description),
28
28
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
29
29
  supportedModes: ['navigation'],
30
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps'],
30
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps', 'HostDPR'],
31
31
  };
32
32
  }
33
33
 
@@ -67,6 +67,7 @@ class FirstContentfulPaint extends Audit {
67
67
  const metricComputationData = {trace, devtoolsLog, gatherContext,
68
68
  settings: context.settings, URL: artifacts.URL,
69
69
  SourceMaps: artifacts.SourceMaps, simulator: null,
70
+ HostDPR: artifacts.HostDPR,
70
71
  };
71
72
  const metricResult = await ComputedFcp.request(metricComputationData, context);
72
73
  const options = context.options[context.settings.formFactor];
@@ -33,7 +33,7 @@ class InteractiveMetric extends Audit {
33
33
  description: str_(UIStrings.description),
34
34
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
35
35
  supportedModes: ['navigation'],
36
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps'],
36
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps', 'HostDPR'],
37
37
  };
38
38
  }
39
39
 
@@ -74,6 +74,7 @@ class InteractiveMetric extends Audit {
74
74
  trace, devtoolsLog, gatherContext,
75
75
  settings: context.settings, URL: artifacts.URL,
76
76
  SourceMaps: artifacts.SourceMaps, simulator: null,
77
+ HostDPR: artifacts.HostDPR,
77
78
  };
78
79
  const metricResult = await Interactive.request(metricComputationData, context);
79
80
  const timeInMs = metricResult.timing;
@@ -28,7 +28,7 @@ class LargestContentfulPaint extends Audit {
28
28
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
29
29
  supportedModes: ['navigation'],
30
30
  requiredArtifacts: ['HostUserAgent', 'Trace', 'DevtoolsLog', 'GatherContext', 'URL',
31
- 'SourceMaps'],
31
+ 'SourceMaps', 'HostDPR'],
32
32
  };
33
33
  }
34
34
 
@@ -77,6 +77,7 @@ class LargestContentfulPaint extends Audit {
77
77
  trace, devtoolsLog, gatherContext,
78
78
  settings: context.settings, URL: artifacts.URL,
79
79
  SourceMaps: artifacts.SourceMaps, simulator: null,
80
+ HostDPR: artifacts.HostDPR,
80
81
  };
81
82
 
82
83
  const metricResult = await ComputedLcp.request(metricComputationData, context);
@@ -43,7 +43,7 @@ class MaxPotentialFID extends Audit {
43
43
  description: str_(UIStrings.description),
44
44
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
45
45
  supportedModes: ['navigation'],
46
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps'],
46
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps', 'HostDPR'],
47
47
  };
48
48
  }
49
49
 
@@ -124,6 +124,7 @@ class MaxPotentialFID extends Audit {
124
124
  trace, devtoolsLog, gatherContext,
125
125
  settings: context.settings, URL: artifacts.URL,
126
126
  SourceMaps: artifacts.SourceMaps, simulator: null,
127
+ HostDPR: artifacts.HostDPR,
127
128
  };
128
129
  const metricResult = await ComputedFid.request(metricComputationData, context);
129
130
 
@@ -27,7 +27,7 @@ class SpeedIndex extends Audit {
27
27
  description: str_(UIStrings.description),
28
28
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
29
29
  supportedModes: ['navigation'],
30
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps'],
30
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps', 'HostDPR'],
31
31
  };
32
32
  }
33
33
 
@@ -69,7 +69,9 @@ class SpeedIndex extends Audit {
69
69
  const metricComputationData = {
70
70
  trace, devtoolsLog, gatherContext,
71
71
  settings: context.settings, URL: artifacts.URL,
72
- SourceMaps: artifacts.SourceMaps, simulator: null,
72
+ SourceMaps: artifacts.SourceMaps,
73
+ HostDPR: artifacts.HostDPR,
74
+ simulator: null,
73
75
  };
74
76
  const metricResult = await ComputedSi.request(metricComputationData, context);
75
77
  const options = context.options[context.settings.formFactor];
@@ -27,7 +27,7 @@ class TotalBlockingTime extends Audit {
27
27
  title: str_(i18n.UIStrings.totalBlockingTimeMetric),
28
28
  description: str_(UIStrings.description),
29
29
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
30
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps'],
30
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps', 'HostDPR'],
31
31
  };
32
32
  }
33
33
 
@@ -91,7 +91,9 @@ class TotalBlockingTime extends Audit {
91
91
  const metricComputationData = {
92
92
  trace, devtoolsLog, gatherContext,
93
93
  settings: context.settings, URL: artifacts.URL,
94
- SourceMaps: artifacts.SourceMaps, simulator: null,
94
+ SourceMaps: artifacts.SourceMaps,
95
+ HostDPR: artifacts.HostDPR,
96
+ simulator: null,
95
97
  };
96
98
  if (
97
99
  gatherContext.gatherMode === 'timespan' &&
@@ -26,7 +26,7 @@ class Metrics extends Audit {
26
26
  title: 'Metrics',
27
27
  description: 'Collects all available metrics.',
28
28
  supportedModes: ['navigation'],
29
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps'],
29
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps', 'HostDPR'],
30
30
  };
31
31
  }
32
32
 
@@ -40,9 +40,9 @@ class Metrics extends Audit {
40
40
  const gatherContext = artifacts.GatherContext;
41
41
  const trace = artifacts.Trace;
42
42
  const devtoolsLog = artifacts.DevtoolsLog;
43
- const {URL, SourceMaps} = artifacts;
43
+ const {URL, HostDPR, SourceMaps} = artifacts;
44
44
  const summary = await TimingSummary
45
- .request({trace, devtoolsLog, gatherContext, settings, URL, SourceMaps}, context);
45
+ .request({trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, HostDPR}, context);
46
46
  const metrics = summary.metrics;
47
47
  const debugInfo = summary.debugInfo;
48
48
 
@@ -33,7 +33,7 @@ class PredictivePerf extends Audit {
33
33
  'a cellular connection on a mobile device.',
34
34
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
35
35
  supportedModes: ['navigation'],
36
- requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps'],
36
+ requiredArtifacts: ['Trace', 'DevtoolsLog', 'GatherContext', 'URL', 'SourceMaps', 'HostDPR'],
37
37
  };
38
38
  }
39
39
 
@@ -46,11 +46,11 @@ class PredictivePerf extends Audit {
46
46
  const gatherContext = artifacts.GatherContext;
47
47
  const trace = artifacts.Trace;
48
48
  const devtoolsLog = artifacts.DevtoolsLog;
49
- const {URL, SourceMaps} = artifacts;
49
+ const {URL, HostDPR, SourceMaps} = artifacts;
50
50
  /** @type {LH.Config.Settings} */
51
51
  const settings = JSON.parse(JSON.stringify(defaultSettings)); // Use default settings.
52
52
  const computationData =
53
- {trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, simulator: null};
53
+ {trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, HostDPR, simulator: null};
54
54
  const fcp = await LanternFirstContentfulPaint.request(computationData, context);
55
55
  const tti = await LanternInteractive.request(computationData, context);
56
56
  const si = await LanternSpeedIndex.request(computationData, context);
@@ -31,7 +31,7 @@ class Redirects extends Audit {
31
31
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
32
32
  supportedModes: ['navigation'],
33
33
  guidanceLevel: 2,
34
- requiredArtifacts: ['URL', 'GatherContext', 'DevtoolsLog', 'Trace', 'SourceMaps'],
34
+ requiredArtifacts: ['URL', 'GatherContext', 'DevtoolsLog', 'Trace', 'SourceMaps', 'HostDPR'],
35
35
  };
36
36
  }
37
37
 
@@ -87,14 +87,14 @@ class Redirects extends Audit {
87
87
  const trace = artifacts.Trace;
88
88
  const devtoolsLog = artifacts.DevtoolsLog;
89
89
  const gatherContext = artifacts.GatherContext;
90
- const {URL, SourceMaps} = artifacts;
90
+ const {URL, HostDPR, SourceMaps} = artifacts;
91
91
 
92
92
  const processedTrace = await ProcessedTrace.request(trace, context);
93
93
  const networkRecords = await NetworkRecords.request(devtoolsLog, context);
94
94
  const documentRequests = Redirects.getDocumentRequestChain(networkRecords, processedTrace);
95
95
 
96
96
  const metricComputationData =
97
- {trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, simulator: null};
97
+ {trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, HostDPR, simulator: null};
98
98
  const metricResult = await LanternInteractive.request(metricComputationData, context);
99
99
 
100
100
  /** @type {Map<string, LH.Gatherer.Simulation.NodeTiming>} */
@@ -35,7 +35,7 @@ class ServerResponseTime extends Audit {
35
35
  description: str_(UIStrings.description),
36
36
  supportedModes: ['navigation'],
37
37
  guidanceLevel: 1,
38
- requiredArtifacts: ['Trace', 'SourceMaps'],
38
+ requiredArtifacts: ['Trace', 'SourceMaps', 'HostDPR'],
39
39
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
40
40
  };
41
41
  }
@@ -48,8 +48,9 @@ class ServerResponseTime extends Audit {
48
48
  static async audit(artifacts, context) {
49
49
  const settings = context.settings;
50
50
  const trace = artifacts.Trace;
51
- const SourceMaps = artifacts.SourceMaps;
52
- const navInsights = await NavigationInsights.request({trace, settings, SourceMaps}, context);
51
+ const {SourceMaps, HostDPR} = artifacts;
52
+ const navInsights =
53
+ await NavigationInsights.request({trace, settings, SourceMaps, HostDPR}, context);
53
54
  const responseTime = navInsights.model.DocumentLatency.data?.serverResponseTime;
54
55
  const url = navInsights.model.DocumentLatency.data?.documentRequest?.args.data.url;
55
56
 
@@ -32,6 +32,6 @@ class FirstContentfulPaintAllFrames extends NavigationMetric {
32
32
 
33
33
  const FirstContentfulPaintAllFramesComputed = makeComputedArtifact(
34
34
  FirstContentfulPaintAllFrames,
35
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
35
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
36
36
  );
37
37
  export {FirstContentfulPaintAllFramesComputed as FirstContentfulPaintAllFrames};
@@ -35,6 +35,6 @@ class FirstContentfulPaint extends NavigationMetric {
35
35
 
36
36
  const FirstContentfulPaintComputed = makeComputedArtifact(
37
37
  FirstContentfulPaint,
38
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
38
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
39
39
  );
40
40
  export {FirstContentfulPaintComputed as FirstContentfulPaint};
@@ -181,7 +181,7 @@ class Interactive extends NavigationMetric {
181
181
 
182
182
  const InteractiveComputed = makeComputedArtifact(
183
183
  Interactive,
184
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
184
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
185
185
  );
186
186
  export {InteractiveComputed as Interactive};
187
187
 
@@ -32,6 +32,6 @@ class LanternFirstContentfulPaint extends Lantern.Metrics.FirstContentfulPaint {
32
32
 
33
33
  const LanternFirstContentfulPaintComputed = makeComputedArtifact(
34
34
  LanternFirstContentfulPaint,
35
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
35
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
36
36
  );
37
37
  export {LanternFirstContentfulPaintComputed as LanternFirstContentfulPaint};
@@ -34,6 +34,6 @@ class LanternInteractive extends Lantern.Metrics.Interactive {
34
34
 
35
35
  const LanternInteractiveComputed = makeComputedArtifact(
36
36
  LanternInteractive,
37
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
37
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
38
38
  );
39
39
  export {LanternInteractiveComputed as LanternInteractive};
@@ -34,6 +34,6 @@ class LanternLargestContentfulPaint extends Lantern.Metrics.LargestContentfulPai
34
34
 
35
35
  const LanternLargestContentfulPaintComputed = makeComputedArtifact(
36
36
  LanternLargestContentfulPaint,
37
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
37
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
38
38
  );
39
39
  export {LanternLargestContentfulPaintComputed as LanternLargestContentfulPaint};
@@ -34,6 +34,6 @@ class LanternMaxPotentialFID extends Lantern.Metrics.MaxPotentialFID {
34
34
 
35
35
  const LanternMaxPotentialFIDComputed = makeComputedArtifact(
36
36
  LanternMaxPotentialFID,
37
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
37
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
38
38
  );
39
39
  export {LanternMaxPotentialFIDComputed as LanternMaxPotentialFID};
@@ -40,6 +40,6 @@ class LanternSpeedIndex extends Lantern.Metrics.SpeedIndex {
40
40
 
41
41
  const LanternSpeedIndexComputed = makeComputedArtifact(
42
42
  LanternSpeedIndex,
43
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
43
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
44
44
  );
45
45
  export {LanternSpeedIndexComputed as LanternSpeedIndex};
@@ -35,6 +35,6 @@ class LanternTotalBlockingTime extends Lantern.Metrics.TotalBlockingTime {
35
35
 
36
36
  const LanternTotalBlockingTimeComputed = makeComputedArtifact(
37
37
  LanternTotalBlockingTime,
38
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
38
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
39
39
  );
40
40
  export {LanternTotalBlockingTimeComputed as LanternTotalBlockingTime};
@@ -40,6 +40,6 @@ class LargestContentfulPaintAllFrames extends NavigationMetric {
40
40
 
41
41
  const LargestContentfulPaintAllFramesComputed = makeComputedArtifact(
42
42
  LargestContentfulPaintAllFrames,
43
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
43
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
44
44
  );
45
45
  export {LargestContentfulPaintAllFramesComputed as LargestContentfulPaintAllFrames};
@@ -47,6 +47,6 @@ class LargestContentfulPaint extends NavigationMetric {
47
47
 
48
48
  const LargestContentfulPaintComputed = makeComputedArtifact(
49
49
  LargestContentfulPaint,
50
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
50
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
51
51
  );
52
52
  export {LargestContentfulPaintComputed as LargestContentfulPaint};
@@ -54,8 +54,9 @@ class LCPBreakdown {
54
54
  };
55
55
  }
56
56
 
57
- const {trace, settings, SourceMaps} = data;
58
- const navInsights = await NavigationInsights.request({trace, settings, SourceMaps}, context);
57
+ const {trace, settings, SourceMaps, HostDPR} = data;
58
+ const navInsights =
59
+ await NavigationInsights.request({trace, settings, SourceMaps, HostDPR}, context);
59
60
  const lcpBreakdown = navInsights.model.LCPBreakdown;
60
61
  if (lcpBreakdown instanceof Error) {
61
62
  throw new LighthouseError(LighthouseError.errors.NO_LCP, {}, {cause: lcpBreakdown});
@@ -80,7 +81,7 @@ class LCPBreakdown {
80
81
 
81
82
  const LCPBreakdownComputed = makeComputedArtifact(
82
83
  LCPBreakdown,
83
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
84
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
84
85
  );
85
86
  export {LCPBreakdownComputed as LCPBreakdown};
86
87
 
@@ -40,6 +40,6 @@ class MaxPotentialFID extends NavigationMetric {
40
40
 
41
41
  const MaxPotentialFIDComputed = makeComputedArtifact(
42
42
  MaxPotentialFID,
43
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
43
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
44
44
  );
45
45
  export {MaxPotentialFIDComputed as MaxPotentialFID};
@@ -35,6 +35,7 @@ class Metric {
35
35
  settings: data.settings,
36
36
  URL: data.URL,
37
37
  SourceMaps: data.SourceMaps,
38
+ HostDPR: data.HostDPR,
38
39
  simulator: null,
39
40
  };
40
41
  }
@@ -35,6 +35,6 @@ class SpeedIndex extends NavigationMetric {
35
35
 
36
36
  const SpeedIndexComputed = makeComputedArtifact(
37
37
  SpeedIndex,
38
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
38
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
39
39
  );
40
40
  export {SpeedIndexComputed as SpeedIndex};
@@ -45,10 +45,11 @@ class TimeToFirstByte extends NavigationMetric {
45
45
  * @return {Promise<LH.Artifacts.Metric>}
46
46
  */
47
47
  static async computeObservedMetric(data, context) {
48
- const {trace, settings, SourceMaps} = data;
48
+ const {trace, settings, SourceMaps, HostDPR} = data;
49
49
  const traceEngineResult =
50
- await TraceEngineResult.request({trace, settings, SourceMaps}, context);
51
- const navInsights = await NavigationInsights.request({trace, settings, SourceMaps}, context);
50
+ await TraceEngineResult.request({trace, settings, SourceMaps, HostDPR}, context);
51
+ const navInsights =
52
+ await NavigationInsights.request({trace, settings, SourceMaps, HostDPR}, context);
52
53
  const lcpBreakdown = navInsights.model.LCPBreakdown;
53
54
 
54
55
  // Defer to LCP breakdown, but if there's no LCP fallback to manual calculation.
@@ -81,6 +82,6 @@ class TimeToFirstByte extends NavigationMetric {
81
82
 
82
83
  const TimeToFirstByteComputed = makeComputedArtifact(
83
84
  TimeToFirstByte,
84
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
85
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
85
86
  );
86
87
  export {TimeToFirstByteComputed as TimeToFirstByte};
@@ -7,6 +7,7 @@ declare const TimingSummaryComputed: typeof TimingSummary & {
7
7
  settings: LH.Util.ImmutableObject<LH.Config.Settings>;
8
8
  URL: LH.Artifacts["URL"];
9
9
  SourceMaps: LH.Artifacts["SourceMaps"];
10
+ HostDPR: LH.Artifacts["HostDPR"];
10
11
  }, context: LH.Artifacts.ComputedContext) => Promise<{
11
12
  metrics: LH.Artifacts.TimingSummary;
12
13
  debugInfo: Record<string, boolean>;
@@ -20,15 +21,16 @@ declare class TimingSummary {
20
21
  * @param {LH.Util.ImmutableObject<LH.Config.Settings>} settings
21
22
  * @param {LH.Artifacts['URL']} URL
22
23
  * @param {LH.Artifacts['SourceMaps']} SourceMaps
24
+ * @param {LH.Artifacts['HostDPR']} HostDPR
23
25
  * @param {LH.Artifacts.ComputedContext} context
24
26
  * @return {Promise<{metrics: LH.Artifacts.TimingSummary, debugInfo: Record<string,boolean>}>}
25
27
  */
26
- static summarize(trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, gatherContext: LH.Artifacts["GatherContext"], settings: LH.Util.ImmutableObject<LH.Config.Settings>, URL: LH.Artifacts["URL"], SourceMaps: LH.Artifacts["SourceMaps"], context: LH.Artifacts.ComputedContext): Promise<{
28
+ static summarize(trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, gatherContext: LH.Artifacts["GatherContext"], settings: LH.Util.ImmutableObject<LH.Config.Settings>, URL: LH.Artifacts["URL"], SourceMaps: LH.Artifacts["SourceMaps"], HostDPR: LH.Artifacts["HostDPR"], context: LH.Artifacts.ComputedContext): Promise<{
27
29
  metrics: LH.Artifacts.TimingSummary;
28
30
  debugInfo: Record<string, boolean>;
29
31
  }>;
30
32
  /**
31
- * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, gatherContext: LH.Artifacts['GatherContext']; settings: LH.Util.ImmutableObject<LH.Config.Settings>, URL: LH.Artifacts['URL'], SourceMaps: LH.Artifacts['SourceMaps']}} data
33
+ * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, gatherContext: LH.Artifacts['GatherContext']; settings: LH.Util.ImmutableObject<LH.Config.Settings>, URL: LH.Artifacts['URL'], SourceMaps: LH.Artifacts['SourceMaps'], HostDPR: LH.Artifacts['HostDPR']}} data
32
34
  * @param {LH.Artifacts.ComputedContext} context
33
35
  * @return {Promise<{metrics: LH.Artifacts.TimingSummary, debugInfo: Record<string,boolean>}>}
34
36
  */
@@ -39,6 +41,7 @@ declare class TimingSummary {
39
41
  settings: LH.Util.ImmutableObject<LH.Config.Settings>;
40
42
  URL: LH.Artifacts["URL"];
41
43
  SourceMaps: LH.Artifacts["SourceMaps"];
44
+ HostDPR: LH.Artifacts["HostDPR"];
42
45
  }, context: LH.Artifacts.ComputedContext): Promise<{
43
46
  metrics: LH.Artifacts.TimingSummary;
44
47
  debugInfo: Record<string, boolean>;
@@ -31,12 +31,14 @@ class TimingSummary {
31
31
  * @param {LH.Util.ImmutableObject<LH.Config.Settings>} settings
32
32
  * @param {LH.Artifacts['URL']} URL
33
33
  * @param {LH.Artifacts['SourceMaps']} SourceMaps
34
+ * @param {LH.Artifacts['HostDPR']} HostDPR
34
35
  * @param {LH.Artifacts.ComputedContext} context
35
36
  * @return {Promise<{metrics: LH.Artifacts.TimingSummary, debugInfo: Record<string,boolean>}>}
36
37
  */
37
- static async summarize(trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, context) {
38
+ // eslint-disable-next-line max-len
39
+ static async summarize(trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, HostDPR, context) {
38
40
  const metricComputationData =
39
- {trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, simulator: null};
41
+ {trace, devtoolsLog, gatherContext, settings, URL, SourceMaps, HostDPR, simulator: null};
40
42
 
41
43
  /**
42
44
  * @template TArtifacts
@@ -147,7 +149,7 @@ class TimingSummary {
147
149
  return {metrics, debugInfo};
148
150
  }
149
151
  /**
150
- * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, gatherContext: LH.Artifacts['GatherContext']; settings: LH.Util.ImmutableObject<LH.Config.Settings>, URL: LH.Artifacts['URL'], SourceMaps: LH.Artifacts['SourceMaps']}} data
152
+ * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, gatherContext: LH.Artifacts['GatherContext']; settings: LH.Util.ImmutableObject<LH.Config.Settings>, URL: LH.Artifacts['URL'], SourceMaps: LH.Artifacts['SourceMaps'], HostDPR: LH.Artifacts['HostDPR']}} data
151
153
  * @param {LH.Artifacts.ComputedContext} context
152
154
  * @return {Promise<{metrics: LH.Artifacts.TimingSummary, debugInfo: Record<string,boolean>}>}
153
155
  */
@@ -159,6 +161,7 @@ class TimingSummary {
159
161
  data.settings,
160
162
  data.URL,
161
163
  data.SourceMaps,
164
+ data.HostDPR,
162
165
  context
163
166
  );
164
167
  }
@@ -166,6 +169,6 @@ class TimingSummary {
166
169
 
167
170
  const TimingSummaryComputed = makeComputedArtifact(
168
171
  TimingSummary,
169
- ['devtoolsLog', 'gatherContext', 'settings', 'trace', 'URL', 'SourceMaps']
172
+ ['devtoolsLog', 'gatherContext', 'settings', 'trace', 'URL', 'SourceMaps', 'HostDPR']
170
173
  );
171
174
  export {TimingSummaryComputed as TimingSummary};
@@ -71,6 +71,6 @@ class TotalBlockingTime extends ComputedMetric {
71
71
 
72
72
  const TotalBlockingTimeComputed = makeComputedArtifact(
73
73
  TotalBlockingTime,
74
- ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps']
74
+ ['devtoolsLog', 'gatherContext', 'settings', 'simulator', 'trace', 'URL', 'SourceMaps', 'HostDPR']
75
75
  );
76
76
  export {TotalBlockingTimeComputed as TotalBlockingTime};
@@ -4,6 +4,7 @@ declare const NavigationInsightsComputed: typeof NavigationInsights & {
4
4
  trace: LH.Trace;
5
5
  settings: LH.Audit.Context["settings"];
6
6
  SourceMaps: LH.Artifacts["SourceMaps"];
7
+ HostDPR: LH.Artifacts["HostDPR"];
7
8
  }, context: LH.Artifacts.ComputedContext) => Promise<import("@paulirish/trace_engine/models/trace/insights/types.js").InsightSet>;
8
9
  };
9
10
  /**
@@ -12,13 +13,14 @@ declare const NavigationInsightsComputed: typeof NavigationInsights & {
12
13
  */
13
14
  declare class NavigationInsights {
14
15
  /**
15
- * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings'], SourceMaps: LH.Artifacts['SourceMaps']}} data
16
+ * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings'], SourceMaps: LH.Artifacts['SourceMaps'], HostDPR: LH.Artifacts['HostDPR']}} data
16
17
  * @param {LH.Artifacts.ComputedContext} context
17
18
  */
18
19
  static compute_(data: {
19
20
  trace: LH.Trace;
20
21
  settings: LH.Audit.Context["settings"];
21
22
  SourceMaps: LH.Artifacts["SourceMaps"];
23
+ HostDPR: LH.Artifacts["HostDPR"];
22
24
  }, context: LH.Artifacts.ComputedContext): Promise<import("@paulirish/trace_engine/models/trace/insights/types.js").InsightSet>;
23
25
  }
24
26
  //# sourceMappingURL=navigation-insights.d.ts.map
@@ -14,14 +14,14 @@ import {TraceEngineResult} from './trace-engine-result.js';
14
14
  */
15
15
  class NavigationInsights {
16
16
  /**
17
- * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings'], SourceMaps: LH.Artifacts['SourceMaps']}} data
17
+ * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings'], SourceMaps: LH.Artifacts['SourceMaps'], HostDPR: LH.Artifacts['HostDPR']}} data
18
18
  * @param {LH.Artifacts.ComputedContext} context
19
19
  */
20
20
  static async compute_(data, context) {
21
- const {trace, settings, SourceMaps} = data;
21
+ const {trace, settings, SourceMaps, HostDPR} = data;
22
22
  const processedTrace = await ProcessedTrace.request(trace, context);
23
23
  const traceEngineResult =
24
- await TraceEngineResult.request({trace, settings, SourceMaps}, context);
24
+ await TraceEngineResult.request({trace, settings, SourceMaps, HostDPR}, context);
25
25
 
26
26
  const navigationId = processedTrace.timeOriginEvt.args.data?.navigationId;
27
27
  if (!navigationId) throw new Error('No navigationId found');
@@ -34,5 +34,5 @@ class NavigationInsights {
34
34
  }
35
35
 
36
36
  const NavigationInsightsComputed =
37
- makeComputedArtifact(NavigationInsights, ['trace', 'settings', 'SourceMaps']);
37
+ makeComputedArtifact(NavigationInsights, ['trace', 'settings', 'SourceMaps', 'HostDPR']);
38
38
  export {NavigationInsightsComputed as NavigationInsights};
@@ -6,12 +6,13 @@ declare const PageDependencyGraphComputed: typeof PageDependencyGraph & {
6
6
  settings: LH.Audit.Context["settings"];
7
7
  URL: LH.Artifacts["URL"];
8
8
  SourceMaps: LH.Artifacts["SourceMaps"];
9
+ HostDPR: LH.Artifacts["HostDPR"];
9
10
  fromTrace: boolean;
10
11
  }, context: LH.Artifacts.ComputedContext) => Promise<import("../../types/gatherer.js").default.Simulation.GraphNode>;
11
12
  };
12
13
  declare class PageDependencyGraph {
13
14
  /**
14
- * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, settings: LH.Audit.Context['settings'], URL: LH.Artifacts['URL'], SourceMaps: LH.Artifacts['SourceMaps'], fromTrace: boolean}} data
15
+ * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, settings: LH.Audit.Context['settings'], URL: LH.Artifacts['URL'], SourceMaps: LH.Artifacts['SourceMaps'], HostDPR: LH.Artifacts['HostDPR'], fromTrace: boolean}} data
15
16
  * @param {LH.Artifacts.ComputedContext} context
16
17
  * @return {Promise<LH.Gatherer.Simulation.GraphNode>}
17
18
  */
@@ -21,6 +22,7 @@ declare class PageDependencyGraph {
21
22
  settings: LH.Audit.Context["settings"];
22
23
  URL: LH.Artifacts["URL"];
23
24
  SourceMaps: LH.Artifacts["SourceMaps"];
25
+ HostDPR: LH.Artifacts["HostDPR"];
24
26
  fromTrace: boolean;
25
27
  }, context: LH.Artifacts.ComputedContext): Promise<LH.Gatherer.Simulation.GraphNode>;
26
28
  }
@@ -13,12 +13,12 @@ import {TraceEngineResult} from './trace-engine-result.js';
13
13
 
14
14
  class PageDependencyGraph {
15
15
  /**
16
- * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, settings: LH.Audit.Context['settings'], URL: LH.Artifacts['URL'], SourceMaps: LH.Artifacts['SourceMaps'], fromTrace: boolean}} data
16
+ * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, settings: LH.Audit.Context['settings'], URL: LH.Artifacts['URL'], SourceMaps: LH.Artifacts['SourceMaps'], HostDPR: LH.Artifacts['HostDPR'], fromTrace: boolean}} data
17
17
  * @param {LH.Artifacts.ComputedContext} context
18
18
  * @return {Promise<LH.Gatherer.Simulation.GraphNode>}
19
19
  */
20
20
  static async compute_(data, context) {
21
- const {trace, settings, devtoolsLog, URL, SourceMaps} = data;
21
+ const {trace, settings, devtoolsLog, URL, SourceMaps, HostDPR} = data;
22
22
  const [{mainThreadEvents}, networkRecords] = await Promise.all([
23
23
  ProcessedTrace.request(trace, context),
24
24
  NetworkRecords.request(devtoolsLog, context),
@@ -26,7 +26,7 @@ class PageDependencyGraph {
26
26
 
27
27
  if (data.fromTrace) {
28
28
  const traceEngineResult =
29
- await TraceEngineResult.request({trace, settings, SourceMaps}, context);
29
+ await TraceEngineResult.request({trace, settings, SourceMaps, HostDPR}, context);
30
30
  const parsedTrace = traceEngineResult.data;
31
31
  const requests =
32
32
  Lantern.TraceEngineComputationData.createNetworkRequests(trace, parsedTrace);
@@ -46,5 +46,5 @@ class PageDependencyGraph {
46
46
  }
47
47
 
48
48
  const PageDependencyGraphComputed = makeComputedArtifact(PageDependencyGraph,
49
- ['devtoolsLog', 'settings', 'trace', 'URL', 'SourceMaps', 'fromTrace']);
49
+ ['devtoolsLog', 'settings', 'trace', 'URL', 'SourceMaps', 'HostDPR', 'fromTrace']);
50
50
  export {PageDependencyGraphComputed as PageDependencyGraph};
@@ -239,6 +239,6 @@ class TBTImpactTasks {
239
239
 
240
240
  const TBTImpactTasksComputed = makeComputedArtifact(
241
241
  TBTImpactTasks,
242
- ['trace', 'devtoolsLog', 'URL', 'SourceMaps', 'gatherContext', 'settings', 'simulator']
242
+ ['trace', 'devtoolsLog', 'URL', 'SourceMaps', 'gatherContext', 'settings', 'simulator', 'HostDPR']
243
243
  );
244
244
  export {TBTImpactTasksComputed as TBTImpactTasks};
@@ -4,6 +4,7 @@ declare const TraceEngineResultComputed: typeof TraceEngineResult & {
4
4
  trace: LH.Trace;
5
5
  settings: LH.Audit.Context["settings"];
6
6
  SourceMaps: LH.Artifacts["SourceMaps"];
7
+ HostDPR: LH.Artifacts["HostDPR"];
7
8
  }, context: LH.Artifacts.ComputedContext) => Promise<LH.Artifacts.TraceEngineResult>;
8
9
  };
9
10
  /**
@@ -14,9 +15,10 @@ declare class TraceEngineResult {
14
15
  * @param {LH.TraceEvent[]} _traceEvents
15
16
  * @param {LH.Audit.Context['settings']} settings
16
17
  * @param {LH.Artifacts['SourceMaps']} SourceMaps
18
+ * @param {LH.Artifacts['HostDPR']} HostDPR
17
19
  * @return {Promise<LH.Artifacts.TraceEngineResult>}
18
20
  */
19
- static runTraceEngine(_traceEvents: LH.TraceEvent[], settings: LH.Audit.Context["settings"], SourceMaps: LH.Artifacts["SourceMaps"]): Promise<LH.Artifacts.TraceEngineResult>;
21
+ static runTraceEngine(_traceEvents: LH.TraceEvent[], settings: LH.Audit.Context["settings"], SourceMaps: LH.Artifacts["SourceMaps"], HostDPR: LH.Artifacts["HostDPR"]): Promise<LH.Artifacts.TraceEngineResult>;
20
22
  /**
21
23
  * Adapts the given DevTools function that returns a localized string to one
22
24
  * that returns a LH.IcuMessage.
@@ -49,7 +51,7 @@ declare class TraceEngineResult {
49
51
  */
50
52
  static localizeInsights(insightSets: import("@paulirish/trace_engine/models/trace/insights/types.js").TraceInsightSets): void;
51
53
  /**
52
- * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings'], SourceMaps: LH.Artifacts['SourceMaps']}} data
54
+ * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings'], SourceMaps: LH.Artifacts['SourceMaps'], HostDPR: LH.Artifacts['HostDPR']}} data
53
55
  * @param {LH.Artifacts.ComputedContext} context
54
56
  * @return {Promise<LH.Artifacts.TraceEngineResult>}
55
57
  */
@@ -57,6 +59,7 @@ declare class TraceEngineResult {
57
59
  trace: LH.Trace;
58
60
  settings: LH.Audit.Context["settings"];
59
61
  SourceMaps: LH.Artifacts["SourceMaps"];
62
+ HostDPR: LH.Artifacts["HostDPR"];
60
63
  }, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.TraceEngineResult>;
61
64
  }
62
65
  import * as LH from '../../types/lh.js';
@@ -22,9 +22,10 @@ class TraceEngineResult {
22
22
  * @param {LH.TraceEvent[]} _traceEvents
23
23
  * @param {LH.Audit.Context['settings']} settings
24
24
  * @param {LH.Artifacts['SourceMaps']} SourceMaps
25
+ * @param {LH.Artifacts['HostDPR']} HostDPR
25
26
  * @return {Promise<LH.Artifacts.TraceEngineResult>}
26
27
  */
27
- static async runTraceEngine(_traceEvents, settings, SourceMaps) {
28
+ static async runTraceEngine(_traceEvents, settings, SourceMaps, HostDPR) {
28
29
  const processor = new TraceEngine.TraceProcessor(TraceEngine.TraceHandlers);
29
30
  const traceEvents =
30
31
  /** @type {import('@paulirish/trace_engine').Types.Events.Event[]} */ (_traceEvents);
@@ -51,6 +52,7 @@ class TraceEngineResult {
51
52
  },
52
53
  },
53
54
  lanternSettings,
55
+ metadata: {hostDPR: HostDPR},
54
56
  async resolveSourceMap(params) {
55
57
  const sourceMap = SourceMaps.find(sm => sm.scriptId === params.scriptId);
56
58
  if (!sourceMap || !sourceMap.map) {
@@ -220,7 +222,7 @@ class TraceEngineResult {
220
222
  }
221
223
 
222
224
  /**
223
- * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings'], SourceMaps: LH.Artifacts['SourceMaps']}} data
225
+ * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings'], SourceMaps: LH.Artifacts['SourceMaps'], HostDPR: LH.Artifacts['HostDPR']}} data
224
226
  * @param {LH.Artifacts.ComputedContext} context
225
227
  * @return {Promise<LH.Artifacts.TraceEngineResult>}
226
228
  */
@@ -251,11 +253,12 @@ class TraceEngineResult {
251
253
  }
252
254
 
253
255
  const result =
254
- await TraceEngineResult.runTraceEngine(traceEvents, data.settings, data.SourceMaps);
256
+ await TraceEngineResult.runTraceEngine(
257
+ traceEvents, data.settings, data.SourceMaps, data.HostDPR);
255
258
  return result;
256
259
  }
257
260
  }
258
261
 
259
262
  const TraceEngineResultComputed =
260
- makeComputedArtifact(TraceEngineResult, ['trace', 'settings', 'SourceMaps']);
263
+ makeComputedArtifact(TraceEngineResult, ['trace', 'settings', 'SourceMaps', 'HostDPR']);
261
264
  export {TraceEngineResultComputed as TraceEngineResult};
@@ -332,8 +332,9 @@ class TraceElements extends BaseGatherer {
332
332
  const trace = context.dependencies.Trace;
333
333
  const SourceMaps = context.dependencies.SourceMaps;
334
334
  const settings = context.settings;
335
+ const HostDPR = context.baseArtifacts.HostDPR;
335
336
  const traceEngineResult =
336
- await TraceEngineResult.request({trace, settings, SourceMaps}, context);
337
+ await TraceEngineResult.request({trace, settings, SourceMaps, HostDPR}, context);
337
338
 
338
339
  const processedTrace = await ProcessedTrace.request(trace, context);
339
340
  const {mainThreadEvents} = processedTrace;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lighthouse",
3
3
  "type": "module",
4
- "version": "13.0.0",
4
+ "version": "13.0.1",
5
5
  "description": "Automated auditing, performance metrics, and best practices for the web.",
6
6
  "main": "./core/index.js",
7
7
  "bin": {
@@ -44,12 +44,12 @@ interface UniversalBaseArtifacts {
44
44
  LighthouseRunWarnings: Array<string | IcuMessage>;
45
45
  /** The benchmark index that indicates rough device class. */
46
46
  BenchmarkIndex: number;
47
- /** The host's device pixel ratio. */
48
- HostDPR: number;
49
47
  /** An object containing information about the testing configuration used by Lighthouse. */
50
48
  settings: Config.Settings;
51
49
  /** The timing instrumentation of the gather portion of a run. */
52
50
  Timing: Artifacts.MeasureEntry[];
51
+ /** The host's device pixel ratio. */
52
+ HostDPR: number;
53
53
  /** Device which Chrome is running on. */
54
54
  HostFormFactor: 'desktop'|'mobile';
55
55
  /** The user agent string of the version of Chrome used. */
@@ -481,6 +481,7 @@ declare module Artifacts {
481
481
  simulator: Gatherer.Simulation.Simulator | null;
482
482
  URL: Artifacts['URL'];
483
483
  SourceMaps: Artifacts['SourceMaps'];
484
+ HostDPR: Artifacts['HostDPR'];
484
485
  }
485
486
 
486
487
  interface MetricComputationData extends MetricComputationDataInput {