lighthouse 9.5.0-dev.20220814 → 9.5.0-dev.20220815

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/run.js CHANGED
@@ -7,6 +7,7 @@
7
7
  /* eslint-disable no-console */
8
8
 
9
9
  import path from 'path';
10
+ import os from 'os';
10
11
 
11
12
  import psList from 'ps-list';
12
13
  import * as ChromeLauncher from 'chrome-launcher';
@@ -70,6 +71,18 @@ function parseChromeFlags(flags = '') {
70
71
  * @return {Promise<ChromeLauncher.LaunchedChrome>}
71
72
  */
72
73
  function getDebuggableChrome(flags) {
74
+ if (process.platform === 'darwin' && process.arch === 'x64') {
75
+ const cpus = os.cpus();
76
+ if (cpus[0].model.includes('Apple')) {
77
+ throw new Error(
78
+ 'Launching Chrome on Mac Silicon (arm64) from an x64 Node installation results in ' +
79
+ 'Rosetta translating the Chrome binary, even if Chrome is already arm64. This would ' +
80
+ 'result in huge performance issues. To resolve this, you must run Lighthouse CLI with ' +
81
+ 'a version of Node built for arm64. You should also confirm that your Chrome install ' +
82
+ 'says arm64 in chrome://version');
83
+ }
84
+ }
85
+
73
86
  return ChromeLauncher.launch({
74
87
  port: flags.port,
75
88
  ignoreDefaultFlags: flags.chromeIgnoreDefaultFlags,
@@ -56,6 +56,8 @@ class SourceMapV3 {
56
56
  sourceRoot;
57
57
  names;
58
58
  sourcesContent;
59
+ // eslint-disable-next-line @typescript-eslint/naming-convention
60
+ x_google_ignoreList;
59
61
  constructor() {
60
62
  }
61
63
  }
@@ -153,6 +155,38 @@ class TextSourceMap {
153
155
  const index = Platform.ArrayUtilities.upperBound(mappings, undefined, (unused, entry) => lineNumber - entry.lineNumber || columnNumber - entry.columnNumber);
154
156
  return index ? mappings[index - 1] : null;
155
157
  }
158
+ findEntryRanges(lineNumber, columnNumber) {
159
+ const mappings = this.mappings();
160
+ const index = Platform.ArrayUtilities.upperBound(mappings, undefined, (unused, entry) => lineNumber - entry.lineNumber || columnNumber - entry.columnNumber);
161
+ if (!index) {
162
+ // If the line and column are preceding all the entries, then there is nothing to map.
163
+ return null;
164
+ }
165
+ const sourceURL = mappings[index].sourceURL;
166
+ if (!sourceURL) {
167
+ return null;
168
+ }
169
+ // Let us compute the range that contains the source position in the compiled code.
170
+ const endLine = index < mappings.length ? mappings[index].lineNumber : 2 ** 31 - 1;
171
+ const endColumn = index < mappings.length ? mappings[index].columnNumber : 2 ** 31 - 1;
172
+ const range = new TextUtils.TextRange.TextRange(mappings[index - 1].lineNumber, mappings[index - 1].columnNumber, endLine, endColumn);
173
+ // Now try to find the corresponding token in the original code.
174
+ const reverseMappings = this.reversedMappings(sourceURL);
175
+ const startSourceLine = mappings[index - 1].sourceLineNumber;
176
+ const startSourceColumn = mappings[index - 1].sourceColumnNumber;
177
+ const endReverseIndex = Platform.ArrayUtilities.upperBound(reverseMappings, undefined, (unused, i) => startSourceLine - mappings[i].sourceLineNumber || startSourceColumn - mappings[i].sourceColumnNumber);
178
+ if (!endReverseIndex) {
179
+ return null;
180
+ }
181
+ const endSourceLine = endReverseIndex < reverseMappings.length ?
182
+ mappings[reverseMappings[endReverseIndex]].sourceLineNumber :
183
+ 2 ** 31 - 1;
184
+ const endSourceColumn = endReverseIndex < reverseMappings.length ?
185
+ mappings[reverseMappings[endReverseIndex]].sourceColumnNumber :
186
+ 2 ** 31 - 1;
187
+ const sourceRange = new TextUtils.TextRange.TextRange(startSourceLine, startSourceColumn, endSourceLine, endSourceColumn);
188
+ return { range, sourceRange, sourceURL };
189
+ }
156
190
  sourceLineMapping(sourceURL, lineNumber, columnNumber) {
157
191
  const mappings = this.mappings();
158
192
  const reverseMappings = this.reversedMappings(sourceURL);
@@ -219,37 +253,48 @@ class TextSourceMap {
219
253
  }
220
254
  /** @return {Array<{lineNumber: number, columnNumber: number, sourceURL?: string, sourceLineNumber: number, sourceColumnNumber: number, name?: string, lastColumnNumber?: number}>} */
221
255
  mappings() {
256
+ this.#ensureMappingsProcessed();
257
+ return this.#mappingsInternal ?? [];
258
+ }
259
+ reversedMappings(sourceURL) {
260
+ this.#ensureMappingsProcessed();
261
+ return this.#sourceInfos.get(sourceURL)?.reverseMappings ?? [];
262
+ }
263
+ #ensureMappingsProcessed() {
222
264
  if (this.#mappingsInternal === null) {
223
265
  this.#mappingsInternal = [];
224
266
  this.eachSection(this.parseMap.bind(this));
267
+ this.#computeReverseMappings(this.#mappingsInternal);
225
268
  this.#json = null;
226
269
  }
227
- return this.#mappingsInternal;
228
270
  }
229
- reversedMappings(sourceURL) {
230
- const info = this.#sourceInfos.get(sourceURL);
231
- if (!info) {
232
- return [];
271
+ #computeReverseMappings(mappings) {
272
+ const reverseMappingsPerUrl = new Map();
273
+ for (let i = 0; i < mappings.length; i++) {
274
+ const entryUrl = mappings[i].sourceURL;
275
+ if (!entryUrl) {
276
+ continue;
277
+ }
278
+ let reverseMap = reverseMappingsPerUrl.get(entryUrl);
279
+ if (!reverseMap) {
280
+ reverseMap = [];
281
+ reverseMappingsPerUrl.set(entryUrl, reverseMap);
282
+ }
283
+ reverseMap.push(i);
233
284
  }
234
- const mappings = this.mappings();
235
- if (info.reverseMappings === null) {
236
- const indexes = Array(mappings.length).fill(0).map((_, i) => i);
237
- info.reverseMappings = indexes.filter(i => mappings[i].sourceURL === sourceURL).sort(sourceMappingComparator);
285
+ for (const [url, reverseMap] of reverseMappingsPerUrl.entries()) {
286
+ const info = this.#sourceInfos.get(url);
287
+ if (!info) {
288
+ continue;
289
+ }
290
+ reverseMap.sort(sourceMappingComparator);
291
+ info.reverseMappings = reverseMap;
238
292
  }
239
- return info.reverseMappings;
240
293
  function sourceMappingComparator(indexA, indexB) {
241
294
  const a = mappings[indexA];
242
295
  const b = mappings[indexB];
243
- if (a.sourceLineNumber !== b.sourceLineNumber) {
244
- return a.sourceLineNumber - b.sourceLineNumber;
245
- }
246
- if (a.sourceColumnNumber !== b.sourceColumnNumber) {
247
- return a.sourceColumnNumber - b.sourceColumnNumber;
248
- }
249
- if (a.lineNumber !== b.lineNumber) {
250
- return a.lineNumber - b.lineNumber;
251
- }
252
- return a.columnNumber - b.columnNumber;
296
+ return a.sourceLineNumber - b.sourceLineNumber || a.sourceColumnNumber - b.sourceColumnNumber ||
297
+ a.lineNumber - b.lineNumber || a.columnNumber - b.columnNumber;
253
298
  }
254
299
  }
255
300
  eachSection(callback) {
@@ -267,6 +312,7 @@ class TextSourceMap {
267
312
  parseSources(sourceMap) {
268
313
  const sourcesList = [];
269
314
  const sourceRoot = sourceMap.sourceRoot || Platform.DevToolsPath.EmptyUrlString;
315
+ const ignoreList = new Set(sourceMap.x_google_ignoreList);
270
316
  for (let i = 0; i < sourceMap.sources.length; ++i) {
271
317
  let href = sourceMap.sources[i];
272
318
  // The source map v3 proposal says to prepend the sourceRoot to the source URL
@@ -286,11 +332,12 @@ class TextSourceMap {
286
332
  const source = sourceMap.sourcesContent && sourceMap.sourcesContent[i];
287
333
  if (url === this.#compiledURLInternal && source) {
288
334
  }
289
- if (this.#sourceInfos.has(url)) {
290
- continue;
291
- }
292
- this.#sourceInfos.set(url, new TextSourceMap.SourceInfo(source || null, null));
293
335
  sourcesList.push(url);
336
+ if (!this.#sourceInfos.has(url)) {
337
+ const content = source ?? null;
338
+ const ignoreListHint = ignoreList.has(i);
339
+ this.#sourceInfos.set(url, new TextSourceMap.SourceInfo(content, ignoreListHint));
340
+ }
294
341
  }
295
342
  sourceMapToSourceList.set(sourceMap, sourcesList);
296
343
  }
@@ -394,6 +441,44 @@ class TextSourceMap {
394
441
  }
395
442
  return false;
396
443
  }
444
+ hasIgnoreListHint(sourceURL) {
445
+ return this.#sourceInfos.get(sourceURL)?.ignoreListHint ?? false;
446
+ }
447
+ /**
448
+ * Returns a list of ranges in the generated script for original sources that
449
+ * match a predicate. Each range is a [begin, end) pair, meaning that code at
450
+ * the beginning location, up to but not including the end location, matches
451
+ * the predicate.
452
+ */
453
+ findRanges(predicate, options) {
454
+ const mappings = this.mappings();
455
+ const ranges = [];
456
+ if (!mappings.length) {
457
+ return [];
458
+ }
459
+ let current = null;
460
+ // If the first mapping isn't at the beginning of the original source, it's
461
+ // up to the caller to decide if it should be considered matching the
462
+ // predicate or not. By default, it's not.
463
+ if ((mappings[0].lineNumber !== 0 || mappings[0].columnNumber !== 0) && options?.isStartMatching) {
464
+ current = TextUtils.TextRange.TextRange.createUnboundedFromLocation(0, 0);
465
+ ranges.push(current);
466
+ }
467
+ for (const { sourceURL, lineNumber, columnNumber } of mappings) {
468
+ const ignoreListHint = sourceURL && predicate(sourceURL);
469
+ if (!current && ignoreListHint) {
470
+ current = TextUtils.TextRange.TextRange.createUnboundedFromLocation(lineNumber, columnNumber);
471
+ ranges.push(current);
472
+ continue;
473
+ }
474
+ if (current && !ignoreListHint) {
475
+ current.endLine = lineNumber;
476
+ current.endColumn = columnNumber;
477
+ current = null;
478
+ }
479
+ }
480
+ return ranges;
481
+ }
397
482
  }
398
483
  exports.TextSourceMap = TextSourceMap;
399
484
  (function (TextSourceMap) {
@@ -426,10 +511,11 @@ exports.TextSourceMap = TextSourceMap;
426
511
  TextSourceMap.StringCharIterator = StringCharIterator;
427
512
  class SourceInfo {
428
513
  content;
429
- reverseMappings;
430
- constructor(content, reverseMappings) {
514
+ ignoreListHint;
515
+ reverseMappings = null;
516
+ constructor(content, ignoreListHint) {
431
517
  this.content = content;
432
- this.reverseMappings = reverseMappings;
518
+ this.ignoreListHint = ignoreListHint;
433
519
  }
434
520
  }
435
521
  TextSourceMap.SourceInfo = SourceInfo;
@@ -19,9 +19,14 @@ const UIStrings = {
19
19
  */
20
20
  title: 'Deprecated Feature Used',
21
21
 
22
- // Store alphabetized messages per DeprecationIssueType in this block.
23
22
  /**
24
- * @description TODO(crbug.com/1318846): Description needed for translation
23
+ * @description We show this warning when 1) an "authorization" header is
24
+ * attached to the request by scripts, 2) there is no "authorization" in
25
+ * the "access-control-allow-headers" header in the response, and 3) there
26
+ * is a wildcard symbol ("*") in the "access-control-allow-header" header
27
+ * in the response. This is allowed now, but we're planning to reject such
28
+ * responses and require responses to have an "access-control-allow-headers"
29
+ * containing "authorization".
25
30
  */
26
31
  authorizationCoveredByWildcard:
27
32
  'Authorization will not be covered by the wildcard symbol (*) in CORS `Access-Control-Allow-Headers` handling.',
@@ -69,7 +74,9 @@ const UIStrings = {
69
74
  */
70
75
  crossOriginWindowApi: 'Triggering {PH1} from cross origin iframes has been deprecated and will be removed in the future.',
71
76
  /**
72
- * @description TODO(crbug.com/1320339): Description needed for translation
77
+ * @description Warning displayed to developers when they hide the Cast button
78
+ * on a video element using the deprecated CSS selector instead of using the
79
+ * disableRemotePlayback attribute on the element.
73
80
  */
74
81
  cssSelectorInternalMediaControlsOverlayCastButton:
75
82
  'The `disableRemotePlayback` attribute should be used in order to disable the default Cast integration instead of using `-internal-media-controls-overlay-cast-button` selector.',
@@ -89,6 +96,10 @@ const UIStrings = {
89
96
  * @description Warning displayed to developers when the non-standard `Event.path` API is used to notify them that this API is deprecated.
90
97
  */
91
98
  eventPath: '`Event.path` is deprecated and will be removed. Please use `Event.composedPath()` instead.',
99
+ /**
100
+ * @description This message is shown when the deprecated Expect-CT header is present.
101
+ */
102
+ expectCTHeader: 'The `Expect-CT` header is deprecated and will be removed. Chrome requires Certificate Transparency for all publicly trusted certificates issued after April 30, 2018.',
92
103
  /**
93
104
  * @description Warning displayed to developers when the Geolocation API is used from an insecure origin (one that isn't localhost or doesn't use HTTPS) to notify them that this use is no longer supported.
94
105
  */
@@ -109,6 +120,12 @@ const UIStrings = {
109
120
  */
110
121
  hostCandidateAttributeGetter:
111
122
  '`RTCPeerConnectionIceErrorEvent.hostCandidate` is deprecated. Please use `RTCPeerConnectionIceErrorEvent.address` or `RTCPeerConnectionIceErrorEvent.port` instead.',
123
+ /**
124
+ * @description A deprecation warning shown in the DevTools Issues tab,
125
+ * when a service worker reads one of the fields from an event named
126
+ * "canmakepayment".
127
+ */
128
+ identityInCanMakePaymentEvent: 'The merchant origin and arbitrary data from the `canmakepayment` service worker event are deprecated and will be removed: `topOrigin`, `paymentRequestOrigin`, `methodData`, `modifiers`.',
112
129
  /**
113
130
  * @description TODO(crbug.com/1320343): Description needed for translation
114
131
  */
@@ -156,6 +173,16 @@ const UIStrings = {
156
173
  */
157
174
  obsoleteWebRtcCipherSuite:
158
175
  'Your partner is negotiating an obsolete (D)TLS version. Please check with your partner to have this fixed.',
176
+ /**
177
+ * @description Warning displayed to developers when `window.openDatabase` is used in non-secure contexts to notify that the API is deprecated and will be removed.
178
+ */
179
+ openWebDatabaseInsecureContext:
180
+ 'WebSQL in non-secure contexts is deprecated and will be removed in M107. Please use Web Storage or Indexed Database.',
181
+ /**
182
+ * @description Warning displayed to developers when persistent storage type is used to notify that storage type is deprecated.
183
+ */
184
+ persistentQuotaType:
185
+ '`StorageType.persistent` is deprecated. Please use standardized `navigator.storage` instead.',
159
186
  /**
160
187
  * @description This issue indicates that a `<source>` element with a `<picture>` parent was using an `src` attribute, which is not valid and is ignored by the browser. The `srcset` attribute should be used instead.
161
188
  */
@@ -172,7 +199,7 @@ const UIStrings = {
172
199
  * @description Warning displayed to developers when `window.webkitStorageInfo` is used to notify that the API is deprecated.
173
200
  */
174
201
  prefixedStorageInfo:
175
- '`window.webkitStorageInfo` is deprecated. Please use `navigator.webkitTemporaryStorage` or `navigator.webkitPersistentStorage` instead.',
202
+ '`window.webkitStorageInfo` is deprecated. Please use standardized `navigator.storage` instead.',
176
203
  /**
177
204
  * @description Standard message when one web API is deprecated in favor of another. Both
178
205
  * placeholders are always web API functions.
@@ -232,7 +259,8 @@ const UIStrings = {
232
259
  */
233
260
  rtcpMuxPolicyNegotiate: 'The `rtcpMuxPolicy` option is deprecated and will be removed.',
234
261
  /**
235
- * @description TODO(crbug.com/1318878): Description needed for translation
262
+ * @description A deprecation warning shown in the DevTools Issues tab. The placeholder is always the noun
263
+ * "SharedArrayBuffer" which refers to a JavaScript construct.
236
264
  */
237
265
  sharedArrayBufferConstructedWithoutIsolation:
238
266
  '`SharedArrayBuffer` will require cross-origin isolation. See https://developer.chrome.com/blog/enabling-shared-array-buffer/ for more details.',
@@ -244,16 +272,24 @@ const UIStrings = {
244
272
  textToSpeech_DisallowedByAutoplay:
245
273
  '`speechSynthesis.speak()` without user activation is deprecated and will be removed.',
246
274
  /**
247
- * @description TODO(crbug.com/1318879): Description needed for translation
275
+ * @description A deprecation warning shown in the DevTools Issues tab. The placeholder is always the noun
276
+ * "SharedArrayBuffer" which refers to a JavaScript construct. "Extensions" refers to Chrome extensions. The warning is shown
277
+ * when Chrome Extensions attempt to use "SharedArrayBuffer"s under insecure circumstances.
248
278
  */
249
279
  v8SharedArrayBufferConstructedInExtensionWithoutIsolation:
250
280
  'Extensions should opt into cross-origin isolation to continue using `SharedArrayBuffer`. See https://developer.chrome.com/docs/extensions/mv3/cross-origin-isolation/.',
251
281
  /**
252
- * @description TODO(crbug.com/1318881): Description needed for translation
282
+ * @description Warning displayed to developers that they are using
283
+ * `XMLHttpRequest` API in a way that they expect an unsupported character
284
+ * encoding `UTF-16` could be used in the server reply.
253
285
  */
254
286
  xhrJSONEncodingDetection: 'UTF-16 is not supported by response json in `XMLHttpRequest`',
255
287
  /**
256
- * @description TODO(crbug.com/1318882): Description needed for translation
288
+ * @description Warning displayed to developers. It is shown when
289
+ * the `XMLHttpRequest` API is used in a way that it slows down the page load
290
+ * of the next page. The `main thread` refers to an operating systems thread
291
+ * used to run most of the processing of HTML documents, so please use a
292
+ * consistent wording.
257
293
  */
258
294
  xmlHttpRequestSynchronousInNonWorkerOutsideBeforeUnload:
259
295
  'Synchronous `XMLHttpRequest` on the main thread is deprecated because of its detrimental effects to the end user\u2019s experience. For more help, check https://xhr.spec.whatwg.org/.',
@@ -306,7 +342,7 @@ function getDescription(issueDetails) {
306
342
  break;
307
343
  case 'CrossOriginAccessBasedOnDocumentDomain':
308
344
  message = str_(UIStrings.crossOriginAccessBasedOnDocumentDomain);
309
- milestone = 106;
345
+ milestone = 109;
310
346
  break;
311
347
  case 'CrossOriginWindowAlert':
312
348
  message = str_(UIStrings.crossOriginWindowApi, {PH1: 'window.alert'});
@@ -325,13 +361,18 @@ function getDescription(issueDetails) {
325
361
  break;
326
362
  case 'DocumentDomainSettingWithoutOriginAgentClusterHeader':
327
363
  message = str_(UIStrings.documentDomainSettingWithoutOriginAgentClusterHeader);
328
- milestone = 106;
364
+ milestone = 109;
329
365
  break;
330
366
  case 'EventPath':
331
367
  message = str_(UIStrings.eventPath);
332
368
  feature = 5726124632965120;
333
369
  milestone = 109;
334
370
  break;
371
+ case 'ExpectCTHeader':
372
+ message = str_(UIStrings.expectCTHeader);
373
+ feature = 6244547273687040;
374
+ milestone = 107;
375
+ break;
335
376
  case 'GeolocationInsecureOrigin':
336
377
  message = str_(UIStrings.geolocationInsecureOrigin);
337
378
  break;
@@ -344,6 +385,10 @@ function getDescription(issueDetails) {
344
385
  case 'HostCandidateAttributeGetter':
345
386
  message = str_(UIStrings.hostCandidateAttributeGetter);
346
387
  break;
388
+ case 'IdentityInCanMakePaymentEvent':
389
+ message = str_(UIStrings.identityInCanMakePaymentEvent);
390
+ feature = 5190978431352832;
391
+ break;
347
392
  case 'InsecurePrivateNetworkSubresourceRequest':
348
393
  message = str_(UIStrings.insecurePrivateNetworkSubresourceRequest);
349
394
  feature = 5436853517811712;
@@ -365,6 +410,15 @@ function getDescription(issueDetails) {
365
410
  message = str_(UIStrings.mediaSourceDurationTruncatingBuffered);
366
411
  feature = 6107495151960064;
367
412
  break;
413
+ case 'NavigateEventRestoreScroll':
414
+ message = str_(
415
+ UIStrings.deprecatedWithReplacement, {PH1: 'navigateEvent.restoreScroll()', PH2: 'navigateEvent.scroll()'});
416
+ break;
417
+ case 'NavigateEventTransitionWhile':
418
+ message = str_(
419
+ UIStrings.deprecatedWithReplacement,
420
+ {PH1: 'navigateEvent.transitionWhile()', PH2: 'navigateEvent.intercept()'});
421
+ break;
368
422
  case 'NoSysexWebMIDIWithoutPermission':
369
423
  message = str_(UIStrings.noSysexWebMIDIWithoutPermission);
370
424
  feature = 5138066234671104;
@@ -381,6 +435,16 @@ function getDescription(issueDetails) {
381
435
  message = str_(UIStrings.obsoleteWebRtcCipherSuite);
382
436
  milestone = 81;
383
437
  break;
438
+ case 'OpenWebDatabaseInsecureContext':
439
+ message = str_(UIStrings.openWebDatabaseInsecureContext);
440
+ feature = 5175124599767040;
441
+ milestone = 105;
442
+ break;
443
+ case 'PersistentQuotaType':
444
+ message = str_(UIStrings.persistentQuotaType);
445
+ feature = 5176235376246784;
446
+ milestone = 106;
447
+ break;
384
448
  case 'PictureSourceSrc':
385
449
  message = str_(UIStrings.pictureSourceSrc);
386
450
  break;
@@ -67,6 +67,7 @@ const RESOURCE_TYPES = {
67
67
  Ping: 'Ping',
68
68
  Preflight: 'Preflight',
69
69
  CSPViolationReport: 'CSPViolationReport',
70
+ Prefetch: 'Prefetch',
70
71
  };
71
72
 
72
73
  class NetworkRequest {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lighthouse",
3
3
  "type": "module",
4
- "version": "9.5.0-dev.20220814",
4
+ "version": "9.5.0-dev.20220815",
5
5
  "description": "Automated auditing, performance metrics, and best practices for the web.",
6
6
  "main": "./core/index.js",
7
7
  "bin": {
@@ -134,13 +134,13 @@
134
134
  "archiver": "^3.0.0",
135
135
  "c8": "^7.11.3",
136
136
  "chalk": "^2.4.1",
137
- "chrome-devtools-frontend": "1.0.1012379",
137
+ "chrome-devtools-frontend": "1.0.1034999",
138
138
  "concurrently": "^6.4.0",
139
139
  "conventional-changelog-cli": "^2.1.1",
140
140
  "cpy": "^8.1.2",
141
141
  "cross-env": "^7.0.2",
142
142
  "csv-validator": "^0.0.3",
143
- "devtools-protocol": "0.0.999451",
143
+ "devtools-protocol": "0.0.1034970",
144
144
  "es-main": "^1.0.2",
145
145
  "eslint": "^8.4.1",
146
146
  "eslint-config-google": "^0.14.0",
@@ -214,8 +214,8 @@
214
214
  "yargs-parser": "^21.0.0"
215
215
  },
216
216
  "resolutions": {
217
- "puppeteer/**/devtools-protocol": "0.0.999451",
218
- "puppeteer-core/**/devtools-protocol": "0.0.999451",
217
+ "puppeteer/**/devtools-protocol": "0.0.1034970",
218
+ "puppeteer-core/**/devtools-protocol": "0.0.1034970",
219
219
  "testdouble/**/quibble": "connorjclark/quibble#mod-cache"
220
220
  },
221
221
  "repository": "GoogleChrome/lighthouse",
@@ -1796,6 +1796,9 @@
1796
1796
  "core/lib/deprecations-strings.js | eventPath": {
1797
1797
  "message": "`Event.path` is deprecated and will be removed. Please use `Event.composedPath()` instead."
1798
1798
  },
1799
+ "core/lib/deprecations-strings.js | expectCTHeader": {
1800
+ "message": "The `Expect-CT` header is deprecated and will be removed. Chrome requires Certificate Transparency for all publicly trusted certificates issued after April 30, 2018."
1801
+ },
1799
1802
  "core/lib/deprecations-strings.js | feature": {
1800
1803
  "message": "Check the feature status page for more details."
1801
1804
  },
@@ -1811,6 +1814,9 @@
1811
1814
  "core/lib/deprecations-strings.js | hostCandidateAttributeGetter": {
1812
1815
  "message": "`RTCPeerConnectionIceErrorEvent.hostCandidate` is deprecated. Please use `RTCPeerConnectionIceErrorEvent.address` or `RTCPeerConnectionIceErrorEvent.port` instead."
1813
1816
  },
1817
+ "core/lib/deprecations-strings.js | identityInCanMakePaymentEvent": {
1818
+ "message": "The merchant origin and arbitrary data from the `canmakepayment` service worker event are deprecated and will be removed: `topOrigin`, `paymentRequestOrigin`, `methodData`, `modifiers`."
1819
+ },
1814
1820
  "core/lib/deprecations-strings.js | insecurePrivateNetworkSubresourceRequest": {
1815
1821
  "message": "The website requested a subresource from a network that it could only access because of its users' privileged network position. These requests expose non-public devices and servers to the internet, increasing the risk of a cross-site request forgery (CSRF) attack, and/or information leakage. To mitigate these risks, Chrome deprecates requests to non-public subresources when initiated from non-secure contexts, and will start blocking them."
1816
1822
  },
@@ -1841,11 +1847,17 @@
1841
1847
  "core/lib/deprecations-strings.js | obsoleteWebRtcCipherSuite": {
1842
1848
  "message": "Your partner is negotiating an obsolete (D)TLS version. Please check with your partner to have this fixed."
1843
1849
  },
1850
+ "core/lib/deprecations-strings.js | openWebDatabaseInsecureContext": {
1851
+ "message": "WebSQL in non-secure contexts is deprecated and will be removed in M107. Please use Web Storage or Indexed Database."
1852
+ },
1853
+ "core/lib/deprecations-strings.js | persistentQuotaType": {
1854
+ "message": "`StorageType.persistent` is deprecated. Please use standardized `navigator.storage` instead."
1855
+ },
1844
1856
  "core/lib/deprecations-strings.js | pictureSourceSrc": {
1845
1857
  "message": "`<source src>` with a `<picture>` parent is invalid and therefore ignored. Please use `<source srcset>` instead."
1846
1858
  },
1847
1859
  "core/lib/deprecations-strings.js | prefixedStorageInfo": {
1848
- "message": "`window.webkitStorageInfo` is deprecated. Please use `navigator.webkitTemporaryStorage` or `navigator.webkitPersistentStorage` instead."
1860
+ "message": "`window.webkitStorageInfo` is deprecated. Please use standardized `navigator.storage` instead."
1849
1861
  },
1850
1862
  "core/lib/deprecations-strings.js | requestedSubresourceWithEmbeddedCredentials": {
1851
1863
  "message": "Subresource requests whose URLs contain embedded credentials (e.g. `https://user:pass@host/`) are blocked."
@@ -1796,6 +1796,9 @@
1796
1796
  "core/lib/deprecations-strings.js | eventPath": {
1797
1797
  "message": "`Event.path` îś d̂ép̂ŕêćât́êd́ âńd̂ ẃîĺl̂ b́ê ŕêḿôv́êd́. P̂ĺêáŝé ûśê `Event.composedPath()` ín̂śt̂éâd́."
1798
1798
  },
1799
+ "core/lib/deprecations-strings.js | expectCTHeader": {
1800
+ "message": "T̂h́ê `Expect-CT` h́êád̂ér̂ íŝ d́êṕr̂éĉát̂éd̂ án̂d́ ŵíl̂ĺ b̂é r̂ém̂óv̂éd̂. Ćĥŕôḿê ŕêq́ûír̂éŝ Ćêŕt̂íf̂íĉát̂é T̂ŕâńŝṕâŕêńĉý f̂ór̂ ál̂ĺ p̂úb̂ĺîćl̂ý t̂ŕûśt̂éd̂ ćêŕt̂íf̂íĉát̂éŝ íŝśûéd̂ áf̂t́êŕ Âṕr̂íl̂ 30, 2018."
1801
+ },
1799
1802
  "core/lib/deprecations-strings.js | feature": {
1800
1803
  "message": "Ĉh́êćk̂ t́ĥé f̂éât́ûŕê śt̂át̂úŝ ṕâǵê f́ôŕ m̂ór̂é d̂ét̂áîĺŝ."
1801
1804
  },
@@ -1811,6 +1814,9 @@
1811
1814
  "core/lib/deprecations-strings.js | hostCandidateAttributeGetter": {
1812
1815
  "message": "`RTCPeerConnectionIceErrorEvent.hostCandidate` îś d̂ép̂ŕêćât́êd́. P̂ĺêáŝé ûśê `RTCPeerConnectionIceErrorEvent.address` ór̂ `RTCPeerConnectionIceErrorEvent.port` ín̂śt̂éâd́."
1813
1816
  },
1817
+ "core/lib/deprecations-strings.js | identityInCanMakePaymentEvent": {
1818
+ "message": "T̂h́ê ḿêŕĉh́âńt̂ ór̂íĝín̂ án̂d́ âŕb̂ít̂ŕâŕŷ d́ât́â f́r̂óm̂ t́ĥé `canmakepayment` ŝér̂v́îćê ẃôŕk̂ér̂ év̂én̂t́ âŕê d́êṕr̂éĉát̂éd̂ án̂d́ ŵíl̂ĺ b̂é r̂ém̂óv̂éd̂: `topOrigin`, `paymentRequestOrigin`, `methodData`, `modifiers`."
1819
+ },
1814
1820
  "core/lib/deprecations-strings.js | insecurePrivateNetworkSubresourceRequest": {
1815
1821
  "message": "T̂h́ê ẃêb́ŝít̂é r̂éq̂úêśt̂éd̂ á ŝúb̂ŕêśôúr̂ćê f́r̂óm̂ á n̂ét̂ẃôŕk̂ t́ĥát̂ ít̂ ćôúl̂d́ ôńl̂ý âćĉéŝś b̂éĉáûśê óf̂ ít̂ś ûśêŕŝ' ṕr̂ív̂íl̂éĝéd̂ ńêt́ŵór̂ḱ p̂óŝít̂íôń. T̂h́êśê ŕêq́ûéŝt́ŝ éx̂ṕôśê ńôń-p̂úb̂ĺîć d̂év̂íĉéŝ án̂d́ ŝér̂v́êŕŝ t́ô t́ĥé îńt̂ér̂ńêt́, îńĉŕêáŝín̂ǵ t̂h́ê ŕîśk̂ óf̂ á ĉŕôśŝ-śît́ê ŕêq́ûéŝt́ f̂ór̂ǵêŕŷ (ĆŜŔF̂) át̂t́âćk̂, án̂d́/ôŕ îńf̂ór̂ḿât́îón̂ ĺêák̂áĝé. T̂ó m̂ít̂íĝát̂é t̂h́êśê ŕîśk̂ś, Ĉh́r̂óm̂é d̂ép̂ŕêćât́êś r̂éq̂úêśt̂ś t̂ó n̂ón̂-ṕûb́l̂íĉ śûb́r̂éŝóûŕĉéŝ ẃĥén̂ ín̂ít̂íât́êd́ f̂ŕôḿ n̂ón̂-śêćûŕê ćôńt̂éx̂t́ŝ, án̂d́ ŵíl̂ĺ ŝt́âŕt̂ b́l̂óĉḱîńĝ t́ĥém̂."
1816
1822
  },
@@ -1841,11 +1847,17 @@
1841
1847
  "core/lib/deprecations-strings.js | obsoleteWebRtcCipherSuite": {
1842
1848
  "message": "Ŷóûŕ p̂ár̂t́n̂ér̂ íŝ ńêǵôt́îát̂ín̂ǵ âń ôb́ŝól̂ét̂é (D̂)T́L̂Ś v̂ér̂śîón̂. Ṕl̂éâśê ćĥéĉḱ ŵít̂h́ ŷóûŕ p̂ár̂t́n̂ér̂ t́ô h́âv́ê t́ĥíŝ f́îx́êd́."
1843
1849
  },
1850
+ "core/lib/deprecations-strings.js | openWebDatabaseInsecureContext": {
1851
+ "message": "Ŵéb̂ŚQ̂Ĺ îń n̂ón̂-śêćûŕê ćôńt̂éx̂t́ŝ íŝ d́êṕr̂éĉát̂éd̂ án̂d́ ŵíl̂ĺ b̂é r̂ém̂óv̂éd̂ ín̂ Ḿ107. P̂ĺêáŝé ûśê Ẃêb́ Ŝt́ôŕâǵê ór̂ Ín̂d́êx́êd́ D̂át̂áb̂áŝé."
1852
+ },
1853
+ "core/lib/deprecations-strings.js | persistentQuotaType": {
1854
+ "message": "`StorageType.persistent` îś d̂ép̂ŕêćât́êd́. P̂ĺêáŝé ûśê śt̂án̂d́âŕd̂íẑéd̂ `navigator.storage` ín̂śt̂éâd́."
1855
+ },
1844
1856
  "core/lib/deprecations-strings.js | pictureSourceSrc": {
1845
1857
  "message": "`<source src>` ŵít̂h́ â `<picture>` ṕâŕêńt̂ íŝ ín̂v́âĺîd́ âńd̂ t́ĥér̂éf̂ór̂é îǵn̂ór̂éd̂. Ṕl̂éâśê úŝé `<source srcset>` îńŝt́êád̂."
1846
1858
  },
1847
1859
  "core/lib/deprecations-strings.js | prefixedStorageInfo": {
1848
- "message": "`window.webkitStorageInfo` îś d̂ép̂ŕêćât́êd́. P̂ĺêáŝé ûśê `navigator.webkitTemporaryStorage` ór̂ `navigator.webkitPersistentStorage` ín̂śt̂éâd́."
1860
+ "message": "`window.webkitStorageInfo` îś d̂ép̂ŕêćât́êd́. P̂ĺêáŝé ûśê śt̂án̂d́âŕd̂íẑéd̂ `navigator.storage` ín̂śt̂éâd́."
1849
1861
  },
1850
1862
  "core/lib/deprecations-strings.js | requestedSubresourceWithEmbeddedCredentials": {
1851
1863
  "message": "Ŝúb̂ŕêśôúr̂ćê ŕêq́ûéŝt́ŝ ẃĥóŝé ÛŔL̂ś ĉón̂t́âín̂ ém̂b́êd́d̂éd̂ ćr̂éd̂én̂t́îál̂ś (ê.ǵ. `https://user:pass@host/`) âŕê b́l̂óĉḱêd́."