lighthouse 10.0.2 → 10.1.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/cli/bin.js +1 -1
- package/cli/run.js +1 -1
- package/cli/test/smokehouse/config/exclusions.js +0 -2
- package/cli/test/smokehouse/lighthouse-runners/bundle.js +1 -1
- package/core/audits/audit.d.ts +6 -0
- package/core/audits/audit.js +16 -4
- package/core/audits/bootup-time.js +2 -3
- package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +4 -0
- package/core/audits/byte-efficiency/byte-efficiency-audit.js +8 -2
- package/core/audits/byte-efficiency/legacy-javascript.d.ts +5 -0
- package/core/audits/byte-efficiency/legacy-javascript.js +42 -16
- package/core/audits/byte-efficiency/polyfill-graph-data.json +50 -50
- package/core/audits/byte-efficiency/total-byte-weight.js +1 -1
- package/core/audits/byte-efficiency/unminified-javascript.js +2 -1
- package/core/audits/byte-efficiency/uses-long-cache-ttl.js +2 -2
- package/core/audits/byte-efficiency/uses-responsive-images-snapshot.js +4 -0
- package/core/audits/dobetterweb/doctype.js +3 -2
- package/core/audits/long-tasks.js +2 -1
- package/core/audits/mainthread-work-breakdown.js +2 -1
- package/core/audits/network-rtt.js +1 -1
- package/core/audits/network-server-latency.js +2 -1
- package/core/audits/performance-budget.js +1 -1
- package/core/audits/prioritize-lcp-image.js +1 -1
- package/core/audits/seo/tap-targets.js +1 -1
- package/core/audits/third-party-summary.js +4 -1
- package/core/audits/timing-budget.js +2 -1
- package/core/audits/uses-rel-preconnect.js +1 -1
- package/core/audits/uses-rel-preload.js +1 -1
- package/core/audits/valid-source-maps.js +1 -1
- package/core/audits/work-during-interaction.js +1 -1
- package/core/computed/metrics/cumulative-layout-shift.d.ts +3 -3
- package/core/computed/metrics/cumulative-layout-shift.js +21 -9
- package/core/computed/unused-css.js +8 -7
- package/core/config/lr-mobile-config.js +0 -11
- package/core/gather/driver/prepare.js +15 -0
- package/core/lib/asset-saver.js +2 -12
- package/core/lib/i18n/i18n.d.ts +1 -1
- package/core/lib/i18n/i18n.js +1 -1
- package/core/lib/lighthouse-compatibility.js +17 -0
- package/core/lib/network-request.js +1 -1
- package/core/lib/page-functions.d.ts +17 -5
- package/core/lib/page-functions.js +41 -22
- package/core/lib/tracehouse/trace-processor.d.ts +8 -0
- package/core/lib/tracehouse/trace-processor.js +27 -6
- package/core/lib/url-utils.js +1 -1
- package/core/runner.js +1 -0
- package/dist/report/bundle.esm.js +258 -45
- package/dist/report/flow.js +18 -18
- package/dist/report/standalone.js +17 -17
- package/flow-report/src/i18n/i18n.d.ts +6 -0
- package/flow-report/src/summary/category.tsx +0 -1
- package/package.json +6 -7
- package/report/assets/styles.css +89 -5
- package/report/renderer/components.js +1 -1
- package/report/renderer/details-renderer.d.ts +26 -6
- package/report/renderer/details-renderer.js +144 -21
- package/report/renderer/performance-category-renderer.js +3 -3
- package/report/renderer/report-renderer.js +1 -0
- package/report/renderer/report-ui-features.js +18 -9
- package/report/renderer/report-utils.d.ts +13 -4
- package/report/renderer/report-utils.js +43 -11
- package/shared/localization/locales/ar-XB.json +1 -1
- package/shared/localization/locales/ar.json +1 -1
- package/shared/localization/locales/bg.json +1 -1
- package/shared/localization/locales/ca.json +1 -1
- package/shared/localization/locales/cs.json +1 -1
- package/shared/localization/locales/da.json +1 -1
- package/shared/localization/locales/de.json +1 -1
- package/shared/localization/locales/el.json +1 -1
- package/shared/localization/locales/en-GB.json +1 -1
- package/shared/localization/locales/en-US.json +11 -2
- package/shared/localization/locales/en-XA.json +1 -1
- package/shared/localization/locales/en-XL.json +11 -2
- package/shared/localization/locales/es-419.json +1 -1
- package/shared/localization/locales/es.json +1 -1
- package/shared/localization/locales/fi.json +1 -1
- package/shared/localization/locales/fil.json +1 -1
- package/shared/localization/locales/fr.json +1 -1
- package/shared/localization/locales/he.json +1 -1
- package/shared/localization/locales/hi.json +1 -1
- package/shared/localization/locales/hr.json +1 -1
- package/shared/localization/locales/hu.json +1 -1
- package/shared/localization/locales/id.json +1 -1
- package/shared/localization/locales/it.json +1 -1
- package/shared/localization/locales/ja.json +1 -1
- package/shared/localization/locales/ko.json +1 -1
- package/shared/localization/locales/lt.json +1 -1
- package/shared/localization/locales/lv.json +1 -1
- package/shared/localization/locales/nl.json +1 -1
- package/shared/localization/locales/no.json +1 -1
- package/shared/localization/locales/pl.json +1 -1
- package/shared/localization/locales/pt-PT.json +1 -1
- package/shared/localization/locales/pt.json +1 -1
- package/shared/localization/locales/ro.json +1 -1
- package/shared/localization/locales/ru.json +1 -1
- package/shared/localization/locales/sk.json +1 -1
- package/shared/localization/locales/sl.json +1 -1
- package/shared/localization/locales/sr-Latn.json +1 -1
- package/shared/localization/locales/sr.json +1 -1
- package/shared/localization/locales/sv.json +1 -1
- package/shared/localization/locales/ta.json +1 -1
- package/shared/localization/locales/te.json +1 -1
- package/shared/localization/locales/th.json +1 -1
- package/shared/localization/locales/tr.json +1 -1
- package/shared/localization/locales/uk.json +1 -1
- package/shared/localization/locales/vi.json +1 -1
- package/shared/localization/locales/zh-HK.json +1 -1
- package/shared/localization/locales/zh-TW.json +1 -1
- package/shared/localization/locales/zh.json +1 -1
- package/shared/tsconfig.json +1 -1
- package/shared/util.d.ts +6 -0
- package/shared/util.js +33 -0
- package/types/artifacts.d.ts +2 -1
- package/types/lhr/audit-details.d.ts +35 -11
package/cli/bin.js
CHANGED
|
@@ -115,7 +115,7 @@ async function begin() {
|
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
// By default, cliFlags.enableErrorReporting is undefined so the user is
|
|
118
|
-
// prompted. This can be
|
|
118
|
+
// prompted. This can be overridden with an explicit flag or by the cached
|
|
119
119
|
// answer returned by askPermission().
|
|
120
120
|
if (typeof cliFlags.enableErrorReporting === 'undefined') {
|
|
121
121
|
cliFlags.enableErrorReporting = await askPermission();
|
package/cli/run.js
CHANGED
|
@@ -241,7 +241,7 @@ async function runLighthouse(url, flags, config) {
|
|
|
241
241
|
if (flags.legacyNavigation) {
|
|
242
242
|
log.warn('CLI', 'Legacy navigation CLI is deprecated');
|
|
243
243
|
flags.channel = 'legacy-navigation-cli';
|
|
244
|
-
} else {
|
|
244
|
+
} else if (!flags.channel) {
|
|
245
245
|
flags.channel = 'cli';
|
|
246
246
|
}
|
|
247
247
|
|
|
@@ -25,8 +25,6 @@ const exclusions = {
|
|
|
25
25
|
'metrics-tricky-tti', 'metrics-tricky-tti-late-fcp', 'screenshot',
|
|
26
26
|
// Disabled because of differences that need further investigation
|
|
27
27
|
'byte-efficiency', 'byte-gzip', 'perf-preload',
|
|
28
|
-
// https://bugs.chromium.org/p/chromium/issues/detail?id=1420418
|
|
29
|
-
'issues-mixed-content',
|
|
30
28
|
],
|
|
31
29
|
};
|
|
32
30
|
|
|
@@ -63,7 +63,7 @@ async function runBundledLighthouse(url, config, testRunnerOptions) {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
// Load bundle, which creates a `global.runBundledLighthouse`.
|
|
66
|
-
|
|
66
|
+
await import(LH_ROOT + '/dist/lighthouse-dt-bundle.js');
|
|
67
67
|
|
|
68
68
|
global.require = originalRequire;
|
|
69
69
|
global.Buffer = originalBuffer;
|
package/core/audits/audit.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
export type TableOptions = {
|
|
2
2
|
wastedMs?: number | undefined;
|
|
3
3
|
wastedBytes?: number | undefined;
|
|
4
|
+
sortedBy?: LH.Audit.Details.Table['sortedBy'] | undefined;
|
|
5
|
+
skipSumming?: LH.Audit.Details.Table['skipSumming'] | undefined;
|
|
6
|
+
isEntityGrouped?: LH.Audit.Details.Table['isEntityGrouped'] | undefined;
|
|
4
7
|
};
|
|
5
8
|
export type OpportunityOptions = {
|
|
6
9
|
overallSavingsMs: number;
|
|
7
10
|
overallSavingsBytes?: number | undefined;
|
|
11
|
+
sortedBy?: LH.Audit.Details.Opportunity['sortedBy'] | undefined;
|
|
12
|
+
skipSumming?: LH.Audit.Details.Opportunity['skipSumming'] | undefined;
|
|
13
|
+
isEntityGrouped?: LH.Audit.Details.Opportunity['isEntityGrouped'] | undefined;
|
|
8
14
|
};
|
|
9
15
|
export class Audit {
|
|
10
16
|
/**
|
package/core/audits/audit.js
CHANGED
|
@@ -15,12 +15,18 @@ const DEFAULT_PASS = 'defaultPass';
|
|
|
15
15
|
* @typedef TableOptions
|
|
16
16
|
* @property {number=} wastedMs
|
|
17
17
|
* @property {number=} wastedBytes
|
|
18
|
+
* @property {LH.Audit.Details.Table['sortedBy']=} sortedBy
|
|
19
|
+
* @property {LH.Audit.Details.Table['skipSumming']=} skipSumming
|
|
20
|
+
* @property {LH.Audit.Details.Table['isEntityGrouped']=} isEntityGrouped
|
|
18
21
|
*/
|
|
19
22
|
|
|
20
23
|
/**
|
|
21
24
|
* @typedef OpportunityOptions
|
|
22
25
|
* @property {number} overallSavingsMs
|
|
23
26
|
* @property {number=} overallSavingsBytes
|
|
27
|
+
* @property {LH.Audit.Details.Opportunity['sortedBy']=} sortedBy
|
|
28
|
+
* @property {LH.Audit.Details.Opportunity['skipSumming']=} skipSumming
|
|
29
|
+
* @property {LH.Audit.Details.Opportunity['isEntityGrouped']=} isEntityGrouped
|
|
24
30
|
*/
|
|
25
31
|
|
|
26
32
|
/**
|
|
@@ -75,7 +81,7 @@ class Audit {
|
|
|
75
81
|
* @return {LH.Audit.Product|Promise<LH.Audit.Product>}
|
|
76
82
|
*/
|
|
77
83
|
static audit(artifacts, context) {
|
|
78
|
-
throw new Error('audit() method must be
|
|
84
|
+
throw new Error('audit() method must be overridden');
|
|
79
85
|
}
|
|
80
86
|
|
|
81
87
|
/* eslint-enable no-unused-vars */
|
|
@@ -139,7 +145,7 @@ class Audit {
|
|
|
139
145
|
* @return {LH.Audit.Details.Table}
|
|
140
146
|
*/
|
|
141
147
|
static makeTableDetails(headings, results, options = {}) {
|
|
142
|
-
const {wastedBytes, wastedMs} = options;
|
|
148
|
+
const {wastedBytes, wastedMs, sortedBy, skipSumming, isEntityGrouped} = options;
|
|
143
149
|
const summary = (wastedBytes || wastedMs) ? {wastedBytes, wastedMs} : undefined;
|
|
144
150
|
if (results.length === 0) {
|
|
145
151
|
return {
|
|
@@ -157,6 +163,9 @@ class Audit {
|
|
|
157
163
|
headings: headings,
|
|
158
164
|
items: results,
|
|
159
165
|
summary,
|
|
166
|
+
sortedBy,
|
|
167
|
+
skipSumming,
|
|
168
|
+
isEntityGrouped,
|
|
160
169
|
};
|
|
161
170
|
}
|
|
162
171
|
|
|
@@ -216,7 +225,7 @@ class Audit {
|
|
|
216
225
|
const lineNumber = lineIndex + 1;
|
|
217
226
|
/** @type LH.Audit.Details.SnippetValue['lines'][0] */
|
|
218
227
|
const lineDetail = {
|
|
219
|
-
content:
|
|
228
|
+
content: Util.truncate(line, maxLineLength),
|
|
220
229
|
lineNumber,
|
|
221
230
|
};
|
|
222
231
|
if (line.length > maxLineLength) {
|
|
@@ -234,7 +243,7 @@ class Audit {
|
|
|
234
243
|
*/
|
|
235
244
|
static makeOpportunityDetails(headings, items, options) {
|
|
236
245
|
Audit.assertHeadingKeysExist(headings, items);
|
|
237
|
-
const {overallSavingsMs, overallSavingsBytes} = options;
|
|
246
|
+
const {overallSavingsMs, overallSavingsBytes, sortedBy, skipSumming, isEntityGrouped} = options;
|
|
238
247
|
|
|
239
248
|
return {
|
|
240
249
|
type: 'opportunity',
|
|
@@ -242,6 +251,9 @@ class Audit {
|
|
|
242
251
|
items,
|
|
243
252
|
overallSavingsMs,
|
|
244
253
|
overallSavingsBytes,
|
|
254
|
+
sortedBy,
|
|
255
|
+
skipSumming,
|
|
256
|
+
isEntityGrouped,
|
|
245
257
|
};
|
|
246
258
|
}
|
|
247
259
|
|
|
@@ -117,8 +117,6 @@ class BootupTime extends Audit {
|
|
|
117
117
|
runWarnings = [str_(UIStrings.chromeExtensionsWarning)];
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
const summary = {wastedMs: totalBootupTime};
|
|
121
|
-
|
|
122
120
|
/** @type {LH.Audit.Details.Table['headings']} */
|
|
123
121
|
const headings = [
|
|
124
122
|
{key: 'url', valueType: 'url', label: str_(i18n.UIStrings.columnURL)},
|
|
@@ -128,7 +126,8 @@ class BootupTime extends Audit {
|
|
|
128
126
|
label: str_(UIStrings.columnScriptParse)},
|
|
129
127
|
];
|
|
130
128
|
|
|
131
|
-
const details = BootupTime.makeTableDetails(headings, results,
|
|
129
|
+
const details = BootupTime.makeTableDetails(headings, results,
|
|
130
|
+
{wastedMs: totalBootupTime, sortedBy: ['total']});
|
|
132
131
|
|
|
133
132
|
const score = Audit.computeLogNormalScore(
|
|
134
133
|
{p10: context.options.p10, median: context.options.median},
|
|
@@ -7,6 +7,7 @@ export type ByteEfficiencyProduct = {
|
|
|
7
7
|
displayValue?: import("../../index.js").IcuMessage | undefined;
|
|
8
8
|
explanation?: import("../../index.js").IcuMessage | undefined;
|
|
9
9
|
warnings?: (string | import("../../index.js").IcuMessage)[] | undefined;
|
|
10
|
+
sortedBy?: string[] | undefined;
|
|
10
11
|
};
|
|
11
12
|
/**
|
|
12
13
|
* @typedef {object} ByteEfficiencyProduct
|
|
@@ -16,6 +17,7 @@ export type ByteEfficiencyProduct = {
|
|
|
16
17
|
* @property {LH.IcuMessage} [displayValue]
|
|
17
18
|
* @property {LH.IcuMessage} [explanation]
|
|
18
19
|
* @property {Array<string | LH.IcuMessage>} [warnings]
|
|
20
|
+
* @property {Array<string>} [sortedBy]
|
|
19
21
|
*/
|
|
20
22
|
/**
|
|
21
23
|
* @overview Used as the base for all byte efficiency audits. Computes total bytes
|
|
@@ -24,6 +26,8 @@ export type ByteEfficiencyProduct = {
|
|
|
24
26
|
export class ByteEfficiencyAudit extends Audit {
|
|
25
27
|
/**
|
|
26
28
|
* Creates a score based on the wastedMs value using linear interpolation between control points.
|
|
29
|
+
* A negative wastedMs is scored as 1, assuming time is not being wasted with respect to the
|
|
30
|
+
* opportunity being measured.
|
|
27
31
|
*
|
|
28
32
|
* @param {number} wastedMs
|
|
29
33
|
* @return {number}
|
|
@@ -29,6 +29,7 @@ const WASTED_MS_FOR_SCORE_OF_ZERO = 5000;
|
|
|
29
29
|
* @property {LH.IcuMessage} [displayValue]
|
|
30
30
|
* @property {LH.IcuMessage} [explanation]
|
|
31
31
|
* @property {Array<string | LH.IcuMessage>} [warnings]
|
|
32
|
+
* @property {Array<string>} [sortedBy]
|
|
32
33
|
*/
|
|
33
34
|
|
|
34
35
|
/**
|
|
@@ -38,12 +39,14 @@ const WASTED_MS_FOR_SCORE_OF_ZERO = 5000;
|
|
|
38
39
|
class ByteEfficiencyAudit extends Audit {
|
|
39
40
|
/**
|
|
40
41
|
* Creates a score based on the wastedMs value using linear interpolation between control points.
|
|
42
|
+
* A negative wastedMs is scored as 1, assuming time is not being wasted with respect to the
|
|
43
|
+
* opportunity being measured.
|
|
41
44
|
*
|
|
42
45
|
* @param {number} wastedMs
|
|
43
46
|
* @return {number}
|
|
44
47
|
*/
|
|
45
48
|
static scoreForWastedMs(wastedMs) {
|
|
46
|
-
if (wastedMs
|
|
49
|
+
if (wastedMs <= 0) {
|
|
47
50
|
return 1;
|
|
48
51
|
} else if (wastedMs < WASTED_MS_FOR_AVERAGE) {
|
|
49
52
|
return linearInterpolation(0, 1, WASTED_MS_FOR_AVERAGE, 0.75, wastedMs);
|
|
@@ -213,6 +216,8 @@ class ByteEfficiencyAudit extends Audit {
|
|
|
213
216
|
|
|
214
217
|
const wastedBytes = results.reduce((sum, item) => sum + item.wastedBytes, 0);
|
|
215
218
|
|
|
219
|
+
// `wastedMs` may be negative, if making the opportunity change could be detrimental.
|
|
220
|
+
// This is useful information in the LHR and should be preserved.
|
|
216
221
|
let wastedMs;
|
|
217
222
|
if (gatherContext.gatherMode === 'navigation') {
|
|
218
223
|
if (!graph) throw Error('Page dependency graph should always be computed in navigation mode');
|
|
@@ -228,8 +233,9 @@ class ByteEfficiencyAudit extends Audit {
|
|
|
228
233
|
displayValue = str_(i18n.UIStrings.displayValueByteSavings, {wastedBytes});
|
|
229
234
|
}
|
|
230
235
|
|
|
236
|
+
const sortedBy = result.sortedBy || ['wastedBytes'];
|
|
231
237
|
const details = Audit.makeOpportunityDetails(result.headings, results,
|
|
232
|
-
{overallSavingsMs: wastedMs, overallSavingsBytes: wastedBytes});
|
|
238
|
+
{overallSavingsMs: wastedMs, overallSavingsBytes: wastedBytes, sortedBy});
|
|
233
239
|
|
|
234
240
|
return {
|
|
235
241
|
explanation: result.explanation,
|
|
@@ -28,6 +28,11 @@ declare class LegacyJavascript extends ByteEfficiencyAudit {
|
|
|
28
28
|
*/
|
|
29
29
|
static buildPolyfillExpression(object: string | null, property: string): string;
|
|
30
30
|
static getPolyfillData(): {
|
|
31
|
+
name: string;
|
|
32
|
+
modules: string[];
|
|
33
|
+
corejs?: boolean | undefined;
|
|
34
|
+
}[];
|
|
35
|
+
static getCoreJsPolyfillData(): {
|
|
31
36
|
name: string;
|
|
32
37
|
coreJs2Module: string;
|
|
33
38
|
coreJs3Module: string;
|
|
@@ -177,7 +177,12 @@ class LegacyJavascript extends ByteEfficiencyAudit {
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
static getPolyfillData() {
|
|
180
|
-
|
|
180
|
+
/** @type {Array<{name: string, modules: string[], corejs?: boolean}>} */
|
|
181
|
+
const data = [
|
|
182
|
+
{name: 'focus-visible', modules: ['focus-visible']},
|
|
183
|
+
];
|
|
184
|
+
|
|
185
|
+
const coreJsPolyfills = [
|
|
181
186
|
['Array.prototype.fill', 'es6.array.fill'],
|
|
182
187
|
['Array.prototype.filter', 'es6.array.filter'],
|
|
183
188
|
['Array.prototype.find', 'es6.array.find'],
|
|
@@ -225,15 +230,32 @@ class LegacyJavascript extends ByteEfficiencyAudit {
|
|
|
225
230
|
['Object.entries', 'es7.object.entries'],
|
|
226
231
|
['Object.getOwnPropertyDescriptors', 'es7.object.get-own-property-descriptors'],
|
|
227
232
|
['Object.values', 'es7.object.values'],
|
|
228
|
-
]
|
|
229
|
-
|
|
230
|
-
|
|
233
|
+
];
|
|
234
|
+
|
|
235
|
+
for (const [name, coreJs2Module] of coreJsPolyfills) {
|
|
236
|
+
data.push({
|
|
231
237
|
name,
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
238
|
+
modules: [
|
|
239
|
+
coreJs2Module,
|
|
240
|
+
// corejs 3 module name
|
|
241
|
+
coreJs2Module
|
|
242
|
+
.replace('es6.', 'es.')
|
|
243
|
+
.replace('es7.', 'es.')
|
|
244
|
+
.replace('typed.', 'typed-array.'),
|
|
245
|
+
],
|
|
246
|
+
corejs: true,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return data;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
static getCoreJsPolyfillData() {
|
|
254
|
+
return this.getPolyfillData().filter(d => d.corejs).map(d => {
|
|
255
|
+
return {
|
|
256
|
+
name: d.name,
|
|
257
|
+
coreJs2Module: d.modules[0],
|
|
258
|
+
coreJs3Module: d.modules[1],
|
|
237
259
|
};
|
|
238
260
|
});
|
|
239
261
|
}
|
|
@@ -242,15 +264,20 @@ class LegacyJavascript extends ByteEfficiencyAudit {
|
|
|
242
264
|
* @return {Pattern[]}
|
|
243
265
|
*/
|
|
244
266
|
static getPolyfillPatterns() {
|
|
245
|
-
|
|
267
|
+
/** @type {Pattern[]} */
|
|
268
|
+
const patterns = [];
|
|
269
|
+
|
|
270
|
+
for (const {name} of this.getCoreJsPolyfillData()) {
|
|
246
271
|
const parts = name.split('.');
|
|
247
272
|
const object = parts.length > 1 ? parts.slice(0, parts.length - 1).join('.') : null;
|
|
248
273
|
const property = parts[parts.length - 1];
|
|
249
|
-
|
|
274
|
+
patterns.push({
|
|
250
275
|
name,
|
|
251
276
|
expression: this.buildPolyfillExpression(object, property),
|
|
252
|
-
};
|
|
253
|
-
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return patterns;
|
|
254
281
|
}
|
|
255
282
|
|
|
256
283
|
/**
|
|
@@ -301,12 +328,12 @@ class LegacyJavascript extends ByteEfficiencyAudit {
|
|
|
301
328
|
// If it's a bundle with source maps, add in the polyfill modules by name too.
|
|
302
329
|
const bundle = bundles.find(b => b.script.scriptId === script.scriptId);
|
|
303
330
|
if (bundle) {
|
|
304
|
-
for (const {
|
|
331
|
+
for (const {name, modules} of polyfillData) {
|
|
305
332
|
// Skip if the pattern matching found a match for this polyfill.
|
|
306
333
|
if (matches.some(m => m.name === name)) continue;
|
|
307
334
|
|
|
308
335
|
const source = bundle.rawMap.sources.find(source =>
|
|
309
|
-
|
|
336
|
+
modules.some(module => source.endsWith(`${module}.js`)));
|
|
310
337
|
if (!source) continue;
|
|
311
338
|
|
|
312
339
|
const mapping = bundle.map.mappings().find(m => m.sourceURL === source);
|
|
@@ -344,7 +371,6 @@ class LegacyJavascript extends ByteEfficiencyAudit {
|
|
|
344
371
|
}
|
|
345
372
|
}
|
|
346
373
|
|
|
347
|
-
if (polyfillResults.length > 0) estimatedWastedBytesFromPolyfills += graph.baseSize;
|
|
348
374
|
estimatedWastedBytesFromPolyfills += [...modulesSeen].reduce((acc, moduleIndex) => {
|
|
349
375
|
return acc + graph.moduleSizes[moduleIndex];
|
|
350
376
|
}, 0);
|
|
@@ -1,54 +1,54 @@
|
|
|
1
1
|
{
|
|
2
|
-
"moduleSizes": [498, 265, 277, 263, 453, 219, 216, 546, 339, 1608, 671, 1525, 420, 214, 504, 98, 524, 196, 268, 642, 204, 742, 618, 169, 394, 127, 433, 1473, 779, 239, 144, 182, 254, 77, 508, 124, 1388, 75, 133, 301, 362, 170, 1078, 182, 490, 195, 321, 316, 447, 551, 216, 284, 253, 17, 107, 295, 356, 345, 1939, 1596, 291, 139, 259, 1291, 179, 528, 174, 61, 326, 20, 444, 522, 104, 1945, 120, 1943, 680, 1409, 850, 630, 288, 38, 695, 569, 106, 587, 208, 370, 606, 766, 535, 616, 200, 170, 224, 422, 970, 978, 498, 284, 241, 210, 151, 194, 178, 814, 205, 189, 215, 111, 236, 147, 237, 191, 691, 212, 432, 499, 445, 176, 333, 129, 414, 617, 380, 251, 199, 524, 515, 681, 160, 259, 295, 283, 178, 472, 786, 520, 202, 575, 575, 349, 549, 458, 166, 173, 508, 1522, 743, 414, 431, 393, 899, 137, 270, 131, 472, 457, 205, 778, 801, 133],
|
|
2
|
+
"moduleSizes": [11897, 498, 265, 277, 263, 453, 219, 216, 546, 339, 1608, 671, 1525, 420, 214, 504, 98, 524, 196, 268, 642, 204, 742, 618, 169, 394, 127, 433, 1473, 779, 239, 144, 182, 254, 77, 508, 124, 1388, 75, 133, 301, 362, 170, 1078, 182, 490, 195, 321, 316, 447, 551, 216, 284, 253, 17, 107, 295, 356, 345, 1939, 1596, 291, 139, 259, 1291, 179, 528, 174, 61, 326, 20, 444, 522, 104, 1945, 120, 1943, 680, 1409, 850, 630, 288, 38, 695, 569, 106, 587, 208, 370, 606, 766, 535, 616, 200, 170, 224, 422, 970, 978, 498, 284, 241, 210, 151, 194, 178, 814, 205, 189, 215, 111, 236, 147, 237, 191, 691, 212, 432, 499, 445, 176, 333, 129, 414, 617, 380, 251, 199, 524, 515, 681, 160, 259, 295, 283, 178, 472, 786, 520, 202, 575, 575, 349, 549, 458, 166, 173, 508, 1522, 743, 414, 431, 393, 899, 137, 270, 131, 472, 457, 205, 778, 801, 133, 3000],
|
|
3
3
|
"dependencies": {
|
|
4
|
-
"Array.prototype.fill": [
|
|
5
|
-
"Array.prototype.filter": [
|
|
6
|
-
"Array.prototype.find": [
|
|
7
|
-
"Array.prototype.findIndex": [
|
|
8
|
-
"Array.prototype.forEach": [
|
|
9
|
-
"Array.from": [
|
|
10
|
-
"Array.isArray": [
|
|
11
|
-
"Array.prototype.map": [
|
|
12
|
-
"Array.of": [
|
|
13
|
-
"Array.prototype.some": [
|
|
14
|
-
"Date.now": [
|
|
15
|
-
"Date.prototype.toISOString": [
|
|
16
|
-
"Date.prototype.toJSON": [
|
|
17
|
-
"Date.prototype.toString": [
|
|
18
|
-
"Function.prototype.name": [
|
|
19
|
-
"Number.isInteger": [
|
|
20
|
-
"Number.isSafeInteger": [
|
|
21
|
-
"Object.defineProperties": [
|
|
22
|
-
"Object.defineProperty": [
|
|
23
|
-
"Object.freeze": [
|
|
24
|
-
"Object.getPrototypeOf": [
|
|
25
|
-
"Object.isExtensible": [
|
|
26
|
-
"Object.isFrozen": [
|
|
27
|
-
"Object.isSealed": [
|
|
28
|
-
"Object.keys": [
|
|
29
|
-
"Object.preventExtensions": [
|
|
30
|
-
"Object.seal": [
|
|
31
|
-
"Object.setPrototypeOf": [
|
|
32
|
-
"Reflect.apply": [
|
|
33
|
-
"Reflect.construct": [
|
|
34
|
-
"Reflect.defineProperty": [
|
|
35
|
-
"Reflect.deleteProperty": [
|
|
36
|
-
"Reflect.get": [
|
|
37
|
-
"Reflect.getOwnPropertyDescriptor": [
|
|
38
|
-
"Reflect.getPrototypeOf": [
|
|
39
|
-
"Reflect.has": [
|
|
40
|
-
"Reflect.isExtensible": [
|
|
41
|
-
"Reflect.ownKeys": [
|
|
42
|
-
"Reflect.preventExtensions": [
|
|
43
|
-
"Reflect.setPrototypeOf": [
|
|
44
|
-
"String.prototype.codePointAt": [
|
|
45
|
-
"String.fromCodePoint": [
|
|
46
|
-
"String.raw": [
|
|
47
|
-
"String.prototype.repeat": [
|
|
48
|
-
"Object.entries": [
|
|
49
|
-
"Object.getOwnPropertyDescriptors": [
|
|
50
|
-
"Object.values": [
|
|
4
|
+
"Array.prototype.fill": [0, 5, 8, 11, 21, 23, 25, 26, 29, 36, 37, 54, 55, 57, 58, 60, 66, 73, 74, 75, 76, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 114, 116],
|
|
5
|
+
"Array.prototype.filter": [0, 11, 12, 13, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 57, 58, 60, 62, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 117],
|
|
6
|
+
"Array.prototype.find": [0, 5, 11, 12, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 55, 57, 58, 60, 62, 64, 66, 73, 74, 75, 76, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 108, 114, 119],
|
|
7
|
+
"Array.prototype.findIndex": [0, 5, 11, 12, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 55, 57, 58, 60, 62, 64, 66, 73, 74, 75, 76, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 108, 114, 118],
|
|
8
|
+
"Array.prototype.forEach": [0, 9, 11, 12, 14, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 57, 58, 60, 62, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 120],
|
|
9
|
+
"Array.from": [0, 10, 11, 19, 20, 21, 22, 23, 25, 26, 27, 29, 36, 37, 41, 46, 49, 50, 54, 57, 58, 60, 61, 64, 66, 72, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 121],
|
|
10
|
+
"Array.isArray": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 62, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 122],
|
|
11
|
+
"Array.prototype.map": [0, 11, 12, 13, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 57, 58, 60, 62, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 123],
|
|
12
|
+
"Array.of": [0, 11, 21, 22, 23, 25, 26, 27, 29, 36, 37, 54, 57, 58, 60, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 124],
|
|
13
|
+
"Array.prototype.some": [0, 11, 12, 14, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 57, 58, 60, 62, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 125],
|
|
14
|
+
"Date.now": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 126],
|
|
15
|
+
"Date.prototype.toISOString": [0, 11, 21, 22, 23, 25, 26, 28, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 98, 99, 101, 102, 103, 104, 108, 109, 114, 127],
|
|
16
|
+
"Date.prototype.toJSON": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 128],
|
|
17
|
+
"Date.prototype.toString": [0, 25, 26, 29, 54, 58, 60, 74, 94, 114, 129],
|
|
18
|
+
"Function.prototype.name": [0, 130],
|
|
19
|
+
"Number.isInteger": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 67, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 131],
|
|
20
|
+
"Number.isSafeInteger": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 67, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 132],
|
|
21
|
+
"Object.defineProperties": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 114, 133],
|
|
22
|
+
"Object.defineProperty": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 134],
|
|
23
|
+
"Object.freeze": [0, 7, 11, 15, 21, 23, 25, 26, 27, 29, 36, 37, 39, 54, 57, 58, 59, 60, 66, 73, 74, 75, 79, 80, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 136],
|
|
24
|
+
"Object.getPrototypeOf": [0, 11, 21, 23, 24, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 83, 86, 88, 92, 94, 101, 102, 103, 104, 114, 138],
|
|
25
|
+
"Object.isExtensible": [0, 7, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 139],
|
|
26
|
+
"Object.isFrozen": [0, 7, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 140],
|
|
27
|
+
"Object.isSealed": [0, 7, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 141],
|
|
28
|
+
"Object.keys": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 114, 142],
|
|
29
|
+
"Object.preventExtensions": [0, 7, 11, 15, 21, 23, 25, 26, 27, 29, 36, 37, 39, 54, 57, 58, 59, 60, 66, 73, 74, 75, 79, 80, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 143],
|
|
30
|
+
"Object.seal": [0, 7, 11, 15, 21, 23, 25, 26, 27, 29, 36, 37, 39, 54, 57, 58, 59, 60, 66, 73, 74, 75, 79, 80, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 144],
|
|
31
|
+
"Object.setPrototypeOf": [0, 4, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 89, 92, 94, 101, 102, 103, 104, 114, 145],
|
|
32
|
+
"Reflect.apply": [0, 11, 21, 23, 25, 26, 29, 36, 37, 40, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 147],
|
|
33
|
+
"Reflect.construct": [0, 3, 11, 16, 21, 22, 23, 25, 26, 29, 36, 37, 40, 43, 54, 55, 57, 58, 60, 64, 66, 73, 74, 75, 76, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 108, 114, 148],
|
|
34
|
+
"Reflect.defineProperty": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 149],
|
|
35
|
+
"Reflect.deleteProperty": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 150],
|
|
36
|
+
"Reflect.get": [0, 11, 21, 23, 24, 25, 26, 29, 36, 37, 54, 57, 58, 60, 65, 66, 73, 74, 75, 79, 81, 82, 83, 86, 88, 92, 94, 101, 102, 103, 104, 114, 153],
|
|
37
|
+
"Reflect.getOwnPropertyDescriptor": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 151],
|
|
38
|
+
"Reflect.getPrototypeOf": [0, 11, 21, 23, 24, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 83, 86, 88, 92, 94, 101, 102, 103, 104, 114, 152],
|
|
39
|
+
"Reflect.has": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 154],
|
|
40
|
+
"Reflect.isExtensible": [0, 7, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 155],
|
|
41
|
+
"Reflect.ownKeys": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 156],
|
|
42
|
+
"Reflect.preventExtensions": [0, 11, 21, 23, 25, 26, 29, 36, 37, 39, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 157],
|
|
43
|
+
"Reflect.setPrototypeOf": [0, 4, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 89, 92, 94, 101, 102, 103, 104, 114, 158],
|
|
44
|
+
"String.prototype.codePointAt": [0, 11, 21, 22, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 97, 101, 102, 103, 104, 108, 109, 114, 159],
|
|
45
|
+
"String.fromCodePoint": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 160],
|
|
46
|
+
"String.raw": [0, 11, 21, 22, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 109, 114, 161],
|
|
47
|
+
"String.prototype.repeat": [0, 11, 21, 22, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 99, 101, 102, 103, 104, 108, 109, 114, 162],
|
|
48
|
+
"Object.entries": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 87, 88, 90, 92, 94, 101, 102, 103, 104, 114, 135],
|
|
49
|
+
"Object.getOwnPropertyDescriptors": [0, 11, 21, 23, 25, 26, 27, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 137],
|
|
50
|
+
"Object.values": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 87, 88, 90, 92, 94, 101, 102, 103, 104, 114, 146],
|
|
51
|
+
"focus-visible": [163]
|
|
51
52
|
},
|
|
52
|
-
"maxSize":
|
|
53
|
-
"baseSize": 11897
|
|
53
|
+
"maxSize": 87683
|
|
54
54
|
}
|
|
@@ -93,7 +93,7 @@ class TotalByteWeight extends Audit {
|
|
|
93
93
|
{key: 'totalBytes', valueType: 'bytes', label: str_(i18n.UIStrings.columnTransferSize)},
|
|
94
94
|
];
|
|
95
95
|
|
|
96
|
-
const tableDetails = Audit.makeTableDetails(headings, results);
|
|
96
|
+
const tableDetails = Audit.makeTableDetails(headings, results, {sortedBy: ['totalBytes']});
|
|
97
97
|
|
|
98
98
|
return {
|
|
99
99
|
score,
|
|
@@ -8,6 +8,7 @@ import {ByteEfficiencyAudit} from './byte-efficiency-audit.js';
|
|
|
8
8
|
import * as i18n from '../../lib/i18n/i18n.js';
|
|
9
9
|
import {computeJSTokenLength as computeTokenLength} from '../../lib/minification-estimator.js';
|
|
10
10
|
import {getRequestForScript, isInline} from '../../lib/script-helpers.js';
|
|
11
|
+
import {Util} from '../../../shared/util.js';
|
|
11
12
|
|
|
12
13
|
const UIStrings = {
|
|
13
14
|
/** Imperative title of a Lighthouse audit that tells the user to minify the page’s JS code to reduce file size. This is displayed in a list of audit titles that Lighthouse generates. */
|
|
@@ -84,7 +85,7 @@ class UnminifiedJavaScript extends ByteEfficiencyAudit {
|
|
|
84
85
|
const networkRecord = getRequestForScript(networkRecords, script);
|
|
85
86
|
|
|
86
87
|
const displayUrl = isInline(script) ?
|
|
87
|
-
`inline: ${script.content
|
|
88
|
+
`inline: ${Util.truncate(script.content, 40)}` :
|
|
88
89
|
script.url;
|
|
89
90
|
try {
|
|
90
91
|
const result = UnminifiedJavaScript.computeWaste(script.content, displayUrl, networkRecord);
|
|
@@ -280,8 +280,8 @@ class CacheHeaders extends Audit {
|
|
|
280
280
|
displayUnit: 'kb', granularity: 1},
|
|
281
281
|
];
|
|
282
282
|
|
|
283
|
-
const
|
|
284
|
-
|
|
283
|
+
const details = Audit.makeTableDetails(headings, results,
|
|
284
|
+
{wastedBytes: totalWastedBytes, sortedBy: ['totalBytes'], skipSumming: ['cacheLifetimeMs']});
|
|
285
285
|
|
|
286
286
|
return {
|
|
287
287
|
score,
|
|
@@ -56,6 +56,10 @@ class UsesResponsiveImagesSnapshot extends Audit {
|
|
|
56
56
|
/** @type {LH.Audit.Details.TableItem[]} */
|
|
57
57
|
const items = [];
|
|
58
58
|
for (const image of artifacts.ImageElements) {
|
|
59
|
+
// Ignore CSS images because it's difficult to determine what is a spritesheet,
|
|
60
|
+
// and the reward-to-effort ratio for responsive CSS images is quite low https://css-tricks.com/responsive-images-css/.
|
|
61
|
+
if (image.isCss) continue;
|
|
62
|
+
|
|
59
63
|
if (!image.naturalDimensions) continue;
|
|
60
64
|
const actual = image.naturalDimensions;
|
|
61
65
|
const displayed = UsesResponsiveImages.default.getDisplayedDimensions(
|
|
@@ -67,10 +67,11 @@ class Doctype extends Audit {
|
|
|
67
67
|
const doctypeSystemId = artifacts.Doctype.systemId;
|
|
68
68
|
const compatMode = artifacts.Doctype.documentCompatMode;
|
|
69
69
|
|
|
70
|
+
const trace = artifacts.traces?.[Audit.DEFAULT_PASS];
|
|
71
|
+
|
|
70
72
|
/** @type {LH.Crdp.Audits.QuirksModeIssueDetails[]} */
|
|
71
73
|
let quirksModeIssues = [];
|
|
72
|
-
if (
|
|
73
|
-
const trace = artifacts.traces[Audit.DEFAULT_PASS];
|
|
74
|
+
if (trace && artifacts.InspectorIssues) {
|
|
74
75
|
const processedTrace = await ProcessedTrace.request(trace, context);
|
|
75
76
|
const mainFrameId = processedTrace.mainFrameInfo.frameId;
|
|
76
77
|
quirksModeIssues =
|
|
@@ -104,7 +104,8 @@ class LongTasks extends Audit {
|
|
|
104
104
|
/* eslint-enable max-len */
|
|
105
105
|
];
|
|
106
106
|
|
|
107
|
-
const tableDetails = Audit.makeTableDetails(headings, results
|
|
107
|
+
const tableDetails = Audit.makeTableDetails(headings, results,
|
|
108
|
+
{sortedBy: ['duration'], skipSumming: ['startTime']});
|
|
108
109
|
|
|
109
110
|
let displayValue;
|
|
110
111
|
if (results.length > 0) {
|
|
@@ -114,7 +114,8 @@ class MainThreadWorkBreakdown extends Audit {
|
|
|
114
114
|
];
|
|
115
115
|
|
|
116
116
|
results.sort((a, b) => categoryTotals[b.group] - categoryTotals[a.group]);
|
|
117
|
-
const tableDetails = MainThreadWorkBreakdown.makeTableDetails(headings, results
|
|
117
|
+
const tableDetails = MainThreadWorkBreakdown.makeTableDetails(headings, results,
|
|
118
|
+
{sortedBy: ['duration']});
|
|
118
119
|
|
|
119
120
|
const score = Audit.computeLogNormalScore(
|
|
120
121
|
{p10: context.options.p10, median: context.options.median},
|
|
@@ -73,7 +73,7 @@ class NetworkRTT extends Audit {
|
|
|
73
73
|
{key: 'rtt', valueType: 'ms', granularity: 1, label: str_(i18n.UIStrings.columnTimeSpent)},
|
|
74
74
|
];
|
|
75
75
|
|
|
76
|
-
const tableDetails = Audit.makeTableDetails(headings, results);
|
|
76
|
+
const tableDetails = Audit.makeTableDetails(headings, results, {sortedBy: ['rtt']});
|
|
77
77
|
|
|
78
78
|
return {
|
|
79
79
|
score: 1,
|
|
@@ -72,7 +72,8 @@ class NetworkServerLatency extends Audit {
|
|
|
72
72
|
label: str_(i18n.UIStrings.columnTimeSpent)},
|
|
73
73
|
];
|
|
74
74
|
|
|
75
|
-
const tableDetails = Audit.makeTableDetails(headings, results
|
|
75
|
+
const tableDetails = Audit.makeTableDetails(headings, results,
|
|
76
|
+
{sortedBy: ['serverResponseTime']});
|
|
76
77
|
|
|
77
78
|
return {
|
|
78
79
|
score: Math.max(1 - (maxLatency / 500), 0),
|