lighthouse 8.6.0-dev.20211101 → 8.6.0-dev.20211102

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 (88) hide show
  1. package/dist/report/flow.js +13 -13
  2. package/dist/report/standalone.js +11 -11
  3. package/flow-report/.eslintrc.cjs +2 -0
  4. package/flow-report/assets/styles.css +1 -1
  5. package/flow-report/src/common.tsx +11 -4
  6. package/flow-report/src/i18n/i18n.tsx +10 -6
  7. package/flow-report/src/icons.tsx +21 -9
  8. package/flow-report/src/sidebar/sidebar.tsx +9 -3
  9. package/flow-report/src/summary/category.tsx +7 -2
  10. package/flow-report/src/summary/summary.tsx +9 -3
  11. package/flow-report/src/util.ts +21 -9
  12. package/flow-report/src/wrappers/report-renderer.tsx +9 -3
  13. package/flow-report/src/wrappers/report.tsx +7 -2
  14. package/flow-report/test/setup/env-setup.ts +1 -1
  15. package/lighthouse-cli/.eslintrc.cjs +2 -0
  16. package/lighthouse-cli/cli-flags.js +1 -1
  17. package/lighthouse-core/audits/audit.js +1 -1
  18. package/lighthouse-core/computed/resource-summary.js +1 -1
  19. package/lighthouse-core/config/default-config.js +0 -2
  20. package/lighthouse-core/gather/connections/cri.js +1 -1
  21. package/lighthouse-core/lib/proto-preprocessor.js +14 -2
  22. package/lighthouse-core/lib/url-shim.js +1 -1
  23. package/lighthouse-core/util-commonjs.js +24 -9
  24. package/package.json +3 -3
  25. package/report/.eslintrc.cjs +2 -0
  26. package/report/assets/styles.css +226 -250
  27. package/report/assets/templates.html +19 -29
  28. package/report/renderer/category-renderer.js +21 -17
  29. package/report/renderer/components.js +21 -54
  30. package/report/renderer/crc-details-renderer.js +15 -12
  31. package/report/renderer/open-tab.js +9 -3
  32. package/report/renderer/performance-category-renderer.js +31 -19
  33. package/report/renderer/report-renderer.js +2 -1
  34. package/report/renderer/report-ui-features.js +2 -3
  35. package/report/renderer/util.js +25 -9
  36. package/report/test/renderer/category-renderer-test.js +2 -2
  37. package/report/test/renderer/performance-category-renderer-test.js +1 -1
  38. package/report/test/renderer/report-ui-features-test.js +7 -9
  39. package/report/test-assets/faux-psi.js +5 -5
  40. package/shared/localization/locales/ar-XB.json +0 -15
  41. package/shared/localization/locales/ar.json +0 -15
  42. package/shared/localization/locales/bg.json +0 -15
  43. package/shared/localization/locales/ca.json +0 -15
  44. package/shared/localization/locales/cs.json +0 -15
  45. package/shared/localization/locales/da.json +0 -15
  46. package/shared/localization/locales/de.json +0 -15
  47. package/shared/localization/locales/el.json +0 -15
  48. package/shared/localization/locales/en-GB.json +0 -15
  49. package/shared/localization/locales/en-US.json +18 -15
  50. package/shared/localization/locales/en-XA.json +0 -15
  51. package/shared/localization/locales/en-XL.json +18 -15
  52. package/shared/localization/locales/es-419.json +0 -15
  53. package/shared/localization/locales/es.json +0 -15
  54. package/shared/localization/locales/fi.json +0 -15
  55. package/shared/localization/locales/fil.json +0 -15
  56. package/shared/localization/locales/fr.json +0 -15
  57. package/shared/localization/locales/he.json +0 -15
  58. package/shared/localization/locales/hi.json +0 -15
  59. package/shared/localization/locales/hr.json +0 -15
  60. package/shared/localization/locales/hu.json +0 -15
  61. package/shared/localization/locales/id.json +0 -15
  62. package/shared/localization/locales/it.json +0 -15
  63. package/shared/localization/locales/ja.json +0 -15
  64. package/shared/localization/locales/ko.json +0 -15
  65. package/shared/localization/locales/lt.json +0 -15
  66. package/shared/localization/locales/lv.json +0 -15
  67. package/shared/localization/locales/nl.json +0 -15
  68. package/shared/localization/locales/no.json +0 -15
  69. package/shared/localization/locales/pl.json +0 -15
  70. package/shared/localization/locales/pt-PT.json +0 -15
  71. package/shared/localization/locales/pt.json +0 -15
  72. package/shared/localization/locales/ro.json +0 -15
  73. package/shared/localization/locales/ru.json +0 -15
  74. package/shared/localization/locales/sk.json +0 -15
  75. package/shared/localization/locales/sl.json +0 -15
  76. package/shared/localization/locales/sr-Latn.json +0 -15
  77. package/shared/localization/locales/sr.json +0 -15
  78. package/shared/localization/locales/sv.json +0 -15
  79. package/shared/localization/locales/ta.json +0 -15
  80. package/shared/localization/locales/te.json +0 -15
  81. package/shared/localization/locales/th.json +0 -15
  82. package/shared/localization/locales/tr.json +0 -15
  83. package/shared/localization/locales/uk.json +0 -15
  84. package/shared/localization/locales/vi.json +0 -15
  85. package/shared/localization/locales/zh-HK.json +0 -15
  86. package/shared/localization/locales/zh-TW.json +0 -15
  87. package/shared/localization/locales/zh.json +0 -15
  88. package/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js +0 -96
@@ -183,15 +183,26 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
183
183
  // Metrics.
184
184
  const metricAudits = category.auditRefs.filter(audit => audit.group === 'metrics');
185
185
  if (metricAudits.length) {
186
- const metricAuditsEl = this.renderAuditGroup(groups.metrics);
186
+ const [metricsGroupEl, metricsFooterEl] = this.renderAuditGroup(groups.metrics);
187
187
 
188
188
  // Metric descriptions toggle.
189
- const toggleTmpl = this.dom.createComponent('metricsToggle');
190
- const _toggleEl = this.dom.find('.lh-metrics-toggle', toggleTmpl);
191
- metricAuditsEl.append(..._toggleEl.childNodes);
192
-
193
- const metricsBoxesEl = this.dom.createChildOf(metricAuditsEl, 'div', 'lh-metrics-container');
194
-
189
+ const checkboxEl = this.dom.createElement('input', 'lh-metrics-toggle__input');
190
+ const checkboxId = `lh-metrics-toggle${Util.getUniqueSuffix()}`;
191
+ checkboxEl.setAttribute('aria-label', 'Toggle the display of metric descriptions');
192
+ checkboxEl.type = 'checkbox';
193
+ checkboxEl.id = checkboxId;
194
+ metricsGroupEl.prepend(checkboxEl);
195
+ const metricHeaderEl = this.dom.find('.lh-audit-group__header', metricsGroupEl);
196
+ const labelEl = this.dom.createChildOf(metricHeaderEl, 'label', 'lh-metrics-toggle__label');
197
+ labelEl.htmlFor = checkboxId;
198
+ const showEl = this.dom.createChildOf(labelEl, 'span', 'lh-metrics-toggle__labeltext--show');
199
+ const hideEl = this.dom.createChildOf(labelEl, 'span', 'lh-metrics-toggle__labeltext--hide');
200
+ showEl.textContent = Util.i18n.strings.expandView;
201
+ hideEl.textContent = Util.i18n.strings.collapseView;
202
+
203
+ const metricAudits = category.auditRefs.filter(audit => audit.group === 'metrics');
204
+ const metricsBoxesEl = this.dom.createElement('div', 'lh-metrics-container');
205
+ metricsGroupEl.insertBefore(metricsBoxesEl, metricsFooterEl);
195
206
  metricAudits.forEach(item => {
196
207
  metricsBoxesEl.appendChild(this._renderMetric(item));
197
208
  });
@@ -208,8 +219,8 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
208
219
  this.dom.safelySetHref(calculatorLink, this._getScoringCalculatorHref(category.auditRefs));
209
220
 
210
221
 
211
- metricAuditsEl.classList.add('lh-audit-group--metrics');
212
- element.appendChild(metricAuditsEl);
222
+ metricsGroupEl.classList.add('lh-audit-group--metrics');
223
+ element.appendChild(metricsGroupEl);
213
224
  }
214
225
 
215
226
  // Filmstrip
@@ -240,7 +251,7 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
240
251
  const wastedMsValues = opportunityAudits.map(audit => this._getWastedMs(audit));
241
252
  const maxWaste = Math.max(...wastedMsValues);
242
253
  const scale = Math.max(Math.ceil(maxWaste / 1000) * 1000, minimumScale);
243
- const groupEl = this.renderAuditGroup(groups['load-opportunities']);
254
+ const [groupEl, footerEl] = this.renderAuditGroup(groups['load-opportunities']);
244
255
  const tmpl = this.dom.createComponent('opportunityHeader');
245
256
 
246
257
  this.dom.find('.lh-load-opportunity__col--one', tmpl).textContent =
@@ -249,8 +260,9 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
249
260
  strings.opportunitySavingsColumnLabel;
250
261
 
251
262
  const headerEl = this.dom.find('.lh-load-opportunity__header', tmpl);
252
- groupEl.appendChild(headerEl);
253
- opportunityAudits.forEach(item => groupEl.appendChild(this._renderOpportunity(item, scale)));
263
+ groupEl.insertBefore(headerEl, footerEl);
264
+ opportunityAudits.forEach(item =>
265
+ groupEl.insertBefore(this._renderOpportunity(item, scale), footerEl));
254
266
  groupEl.classList.add('lh-audit-group--load-opportunities');
255
267
  element.appendChild(groupEl);
256
268
  }
@@ -266,8 +278,8 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
266
278
  });
267
279
 
268
280
  if (diagnosticAudits.length) {
269
- const groupEl = this.renderAuditGroup(groups['diagnostics']);
270
- diagnosticAudits.forEach(item => groupEl.appendChild(this.renderAudit(item)));
281
+ const [groupEl, footerEl] = this.renderAuditGroup(groups['diagnostics']);
282
+ diagnosticAudits.forEach(item => groupEl.insertBefore(this.renderAudit(item), footerEl));
271
283
  groupEl.classList.add('lh-audit-group--diagnostics');
272
284
  element.appendChild(groupEl);
273
285
  }
@@ -294,16 +306,16 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
294
306
  const table = this.detailsRenderer.render(audit.result.details);
295
307
  if (table) {
296
308
  table.id = id;
297
- table.classList.add('lh-audit');
309
+ table.classList.add('lh-details', 'lh-details--budget', 'lh-audit');
298
310
  budgetTableEls.push(table);
299
311
  }
300
312
  }
301
313
  });
302
314
  if (budgetTableEls.length > 0) {
303
- const budgetsGroupEl = this.renderAuditGroup(groups.budgets);
304
- budgetTableEls.forEach(table => budgetsGroupEl.appendChild(table));
305
- budgetsGroupEl.classList.add('lh-audit-group--budgets');
306
- element.appendChild(budgetsGroupEl);
315
+ const [groupEl, footerEl] = this.renderAuditGroup(groups.budgets);
316
+ budgetTableEls.forEach(table => groupEl.insertBefore(table, footerEl));
317
+ groupEl.classList.add('lh-audit-group--budgets');
318
+ element.appendChild(groupEl);
307
319
  }
308
320
 
309
321
  return element;
@@ -268,6 +268,7 @@ export class ReportRenderer {
268
268
  }
269
269
 
270
270
  const scoreScale = this._dom.createElement('div');
271
+ scoreScale.classList.add('lh-scorescale-wrap');
271
272
  scoreScale.append(this._dom.createComponent('scorescale'));
272
273
  if (scoreHeader) {
273
274
  const scoresContainer = this._dom.find('.lh-scores-container', headerContainer);
@@ -287,7 +288,7 @@ export class ReportRenderer {
287
288
  for (const category of Object.values(report.categories)) {
288
289
  const renderer = specificCategoryRenderers[category.id] || categoryRenderer;
289
290
  // .lh-category-wrapper is full-width and provides horizontal rules between categories.
290
- // .lh-category within has the max-width: var(--report-width);
291
+ // .lh-category within has the max-width: var(--report-content-width);
291
292
  const wrapper = renderer.dom.createChildOf(categories, 'div', 'lh-category-wrapper');
292
293
  wrapper.appendChild(renderer.render(
293
294
  category,
@@ -256,10 +256,9 @@ export class ReportUIFeatures {
256
256
  const allThirdParty = thirdPartyRows.length === rowEls.length;
257
257
  const allFirstParty = !thirdPartyRows.length;
258
258
 
259
- // If all or none of the rows are 3rd party, disable the checkbox.
259
+ // If all or none of the rows are 3rd party, hide the control.
260
260
  if (allThirdParty || allFirstParty) {
261
- filterInput.disabled = true;
262
- filterInput.checked = allThirdParty;
261
+ this._dom.find('div.lh-3p-filter', filterTemplate).hidden = true;
263
262
  }
264
263
 
265
264
  // Add checkbox to the DOM.
@@ -38,7 +38,11 @@ const listOfTlds = [
38
38
  'web', 'spb', 'blog', 'jus', 'kiev', 'mil', 'wi', 'qc', 'ca', 'bel', 'on',
39
39
  ];
40
40
 
41
- export class Util {
41
+ class Util {
42
+ /** @type {I18n<typeof UIStrings>} */
43
+ // @ts-expect-error: Is set in report renderer.
44
+ static i18n = null;
45
+
42
46
  static get PASS_THRESHOLD() {
43
47
  return PASS_THRESHOLD;
44
48
  }
@@ -417,7 +421,7 @@ export class Util {
417
421
  throttling.downloadThroughputKbps === 1.6 * 1024 * 0.9 &&
418
422
  throttling.uploadThroughputKbps === 750 * 0.9;
419
423
  };
420
- summary = `${isSlow4G() ? 'Slow 4G' : 'Custom'} throttling by DevTools`;
424
+ summary = isSlow4G() ? Util.i18n.strings.runtimeSlow4g : Util.i18n.strings.runtimeCustom;
421
425
  break;
422
426
  }
423
427
  case 'simulate': {
@@ -429,7 +433,7 @@ export class Util {
429
433
  const isSlow4G = () => {
430
434
  return rttMs === 150 && throughputKbps === 1.6 * 1024;
431
435
  };
432
- summary = isSlow4G() ? 'Simulated slow 4G' : 'Custom simulated throttling';
436
+ summary = isSlow4G() ? Util.i18n.strings.runtimeSlow4g : Util.i18n.strings.runtimeCustom;
433
437
  break;
434
438
  }
435
439
  default:
@@ -554,14 +558,10 @@ Util.getUniqueSuffix = (() => {
554
558
  };
555
559
  })();
556
560
 
557
- /** @type {I18n<typeof Util['UIStrings']>} */
558
- // @ts-expect-error: Is set in report renderer.
559
- Util.i18n = null;
560
-
561
561
  /**
562
562
  * Report-renderer-specific strings.
563
563
  */
564
- Util.UIStrings = {
564
+ const UIStrings = {
565
565
  /** Disclaimer shown to users below the metric values (First Contentful Paint, Time to Interactive, etc) to warn them that the numbers they see will likely change slightly the next time they run Lighthouse. */
566
566
  varianceDisclaimer: 'Values are estimated and may vary. The [performance score is calculated](https://web.dev/performance-scoring/) directly from these metrics.',
567
567
  /** Text link pointing to an interactive calculator that explains Lighthouse scoring. The link text should be fairly short. */
@@ -661,6 +661,22 @@ Util.UIStrings = {
661
661
 
662
662
  /** Descriptive explanation for environment throttling that was provided by the runtime environment instead of provided by Lighthouse throttling. */
663
663
  throttlingProvided: 'Provided by environment',
664
+ /** Label for an interactive control that will reveal or hide a group of content. This control toggles between the text 'Show' and 'Hide'. */
665
+ show: 'Show',
666
+ /** Label for an interactive control that will reveal or hide a group of content. This control toggles between the text 'Show' and 'Hide'. */
667
+ hide: 'Hide',
668
+ /** Label for an interactive control that will reveal or hide a group of content. This control toggles between the text 'Expand view' and 'Collapse view'. */
669
+ expandView: 'Expand view',
670
+ /** Label for an interactive control that will reveal or hide a group of content. This control toggles between the text 'Expand view' and 'Collapse view'. */
671
+ collapseView: 'Collapse view',
672
+ /** Label indicating that Lighthouse throttled the page to emulate a slow 4G network connection. */
673
+ runtimeSlow4g: 'Slow 4G throttling',
674
+ /** Label indicating that Lighthouse throttled the page using custom throttling settings. */
675
+ runtimeCustom: 'Custom throttling',
664
676
  };
677
+ Util.UIStrings = UIStrings;
665
678
 
666
- export const UIStrings = Util.UIStrings;
679
+ export {
680
+ Util,
681
+ UIStrings,
682
+ };
@@ -197,8 +197,8 @@ describe('CategoryRenderer', () => {
197
197
  'score shows informative and dash icon');
198
198
 
199
199
  assert.ok(pwaCategory.manualDescription);
200
- const description = categoryDOM
201
- .querySelector('.lh-clump--manual .lh-audit-group__description').textContent;
200
+ const description = categoryDOM.querySelector('.lh-clump--manual').closest('.lh-audit-group')
201
+ .querySelector('.lh-audit-group__description').textContent;
202
202
  // may need to be adjusted if description includes a link at the beginning
203
203
  assert.ok(description.startsWith(pwaCategory.manualDescription.substring(0, 20)),
204
204
  'no manual description');
@@ -192,7 +192,7 @@ describe('PerfCategoryRenderer', () => {
192
192
 
193
193
  it('renders the passed audits', () => {
194
194
  const categoryDOM = renderer.render(category, sampleResults.categoryGroups);
195
- const passedSection = categoryDOM.querySelector('.lh-category > .lh-clump--passed');
195
+ const passedSection = categoryDOM.querySelector('.lh-clump--passed');
196
196
 
197
197
  const passedAudits = category.auditRefs.filter(audit =>
198
198
  !audit.group &&
@@ -256,17 +256,15 @@ describe('ReportUIFeatures', () => {
256
256
  .toThrowError('query #uses-rel-preconnect .lh-3p-filter-input not found');
257
257
  });
258
258
 
259
- it('filter is disabled and checked for when just third party resources', () => {
260
- const filterCheckbox =
261
- dom.find('#render-blocking-resources .lh-3p-filter-input', container);
262
- expect(filterCheckbox.disabled).toEqual(true);
263
- expect(filterCheckbox.checked).toEqual(true);
259
+ it('filter is hidden when just third party resources', () => {
260
+ const filterControl =
261
+ dom.find('#render-blocking-resources .lh-3p-filter', container);
262
+ expect(filterControl.hidden).toEqual(true);
264
263
  });
265
264
 
266
- it('filter is disabled and not checked for just first party resources', () => {
267
- const filterCheckbox = dom.find('#uses-text-compression .lh-3p-filter-input', container);
268
- expect(filterCheckbox.disabled).toEqual(true);
269
- expect(filterCheckbox.checked).toEqual(false);
265
+ it('filter is hidden for just first party resources', () => {
266
+ const filterControl = dom.find('#uses-text-compression .lh-3p-filter', container);
267
+ expect(filterControl.hidden).toEqual(true);
270
268
  });
271
269
  });
272
270
  });
@@ -101,15 +101,15 @@ async function decorateScreenshot(datauri, tabId) {
101
101
  img.src = datauri;
102
102
  });
103
103
  const c = document.createElement('canvas');
104
- c.width = img.width;
105
- c.height = img.height;
104
+ c.width = tabId === 'desktop' ? 280 : img.width;
105
+ c.height = tabId === 'desktop' ? 194 : img.height;
106
106
 
107
107
  const ctx = c.getContext('2d');
108
108
  if (!ctx) throw new Error();
109
- ctx.drawImage(img, 0, 0);
110
- ctx.font = `${img.width / 2}px serif`;
109
+ ctx.drawImage(img, 0, 0, c.width, c.height);
110
+ ctx.font = `${c.width / 2}px serif`;
111
111
  ctx.textAlign = 'center';
112
112
  ctx.globalAlpha = 0.7;
113
- ctx.fillText(tabId === 'mobile' ? '📱' : '💻', img.width / 2, Math.min(img.height / 2, 700));
113
+ ctx.fillText(tabId === 'mobile' ? '📱' : '💻', c.width / 2, Math.min(c.height / 2, 700));
114
114
  return c.toDataURL();
115
115
  }
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "‏‮Avoids‬‏ ‏‮an‬‏ ‏‮excessive‬‏ ‏‮DOM‬‏ ‏‮size‬‏"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "‏‮Failing‬‏ ‏‮Anchors‬‏"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "‏‮Add‬‏ `rel=\"noopener\"` ‏‮or‬‏ `rel=\"noreferrer\"` ‏‮to‬‏ ‏‮any‬‏ ‏‮external‬‏ ‏‮links‬‏ ‏‮to‬‏ ‏‮improve‬‏ ‏‮performance‬‏ ‏‮and‬‏ ‏‮prevent‬‏ ‏‮security‬‏ ‏‮vulnerabilities‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://web.dev/external-anchors-use-rel-noopener/)."
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "‏‮Links‬‏ ‏‮to‬‏ ‏‮cross‬‏-‏‮origin‬‏ ‏‮destinations‬‏ ‏‮are‬‏ ‏‮unsafe‬‏"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "‏‮Links‬‏ ‏‮to‬‏ ‏‮cross‬‏-‏‮origin‬‏ ‏‮destinations‬‏ ‏‮are‬‏ ‏‮safe‬‏"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "‏‮Unable‬‏ ‏‮to‬‏ ‏‮determine‬‏ ‏‮the‬‏ ‏‮destination‬‏ ‏‮for‬‏ ‏‮anchor‬‏ ({anchorHTML}). ‏‮If‬‏ ‏‮not‬‏ ‏‮used‬‏ ‏‮as‬‏ ‏‮a‬‏ ‏‮hyperlink‬‏, ‏‮consider‬‏ ‏‮removing‬‏ ‏‮target‬‏=_‏‮blank‬‏."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "‏‮Users‬‏ ‏‮are‬‏ ‏‮mistrustful‬‏ ‏‮of‬‏ ‏‮or‬‏ ‏‮confused‬‏ ‏‮by‬‏ ‏‮sites‬‏ ‏‮that‬‏ ‏‮request‬‏ ‏‮their‬‏ ‏‮location‬‏ ‏‮without‬‏ ‏‮context‬‏. ‏‮Consider‬‏ ‏‮tying‬‏ ‏‮the‬‏ ‏‮request‬‏ ‏‮to‬‏ ‏‮a‬‏ ‏‮user‬‏ ‏‮action‬‏ ‏‮instead‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://web.dev/geolocation-on-start/)."
820
805
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "تجنُب حجم DOM الزائد"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "علامات الارتساء التي تعذّرت مراجعتها"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "يمكنك إضافة `rel=\"noopener\"` أو `rel=\"noreferrer\"` إلى أي روابط خارجية لتحسين الأداء ومنع الثغرات الأمنية. [مزيد من المعلومات](https://web.dev/external-anchors-use-rel-noopener/)"
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "الروابط إلى وجهات مشتركة المصدر هي غير آمنة"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "الروابط إلى وجهات مشتركة المصدر هي آمنة"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "يتعذّر تحديد الوجهة لإعلان ثابت {anchorHTML}). في حال عدم استخدامه كرابط تشعبي، يمكنك إزالة target=_blank."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "لا يثق المستخدمون في المواقع الإلكترونية التي تطلب مواقعهم الجغرافية بدون سياق أو قد يؤدي ذلك إلى إرباكهم. يمكنك ربط الطلب بإجراء المستخدم بدلاً من ذلك. [مزيد من المعلومات](https://web.dev/geolocation-on-start/)"
820
805
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "Не се използва DOM с твърде голям размер"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "Anchor маркери с грешки"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "Добавете `rel=\"noopener\"` или `rel=\"noreferrer\"` към връзките към външни сайтове, за да подобрите ефективността и да избегнете уязвимости в сигурността. [Научете повече](https://web.dev/external-anchors-use-rel-noopener/)."
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "Връзките към външни дестинации не са безопасни"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "Връзките към външни дестинации са безопасни"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "Не можахме да определим дестинацията за котвата ({anchorHTML}). Ако не се използва като хипервръзка, бихте могли да премахнете target=_blank."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "Потребителите се объркват или нямат доверие на сайтове, които искат да узнаят местоположението им без контекст. Вместо това бихте могли да обвържете заявката към действие на потребителя. [Научете повече](https://web.dev/geolocation-on-start/)."
820
805
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "Evita una mida excessiva de DOM"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "Àncora amb errors"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "Afegeix `rel=\"noopener\"` o `rel=\"noreferrer\"` a qualsevol enllaç extern per millorar-ne el rendiment i evitar vulnerabilitats de seguretat. [Obtén més informació](https://web.dev/external-anchors-use-rel-noopener/)."
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "Els enllaços a destinacions de diversos orígens no són segurs"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "Els enllaços a destinacions de diversos orígens són segurs"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "No es pot determinar la destinació de l'ancoratge ({anchorHTML}). Si no s'utilitza com a enllaç, et recomanem que suprimeixis target=_blank."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "Els usuaris reaccionen amb desconfiança i desconcert davant dels llocs web que els sol·liciten la ubicació sense context. Et recomanem que vinculis la sol·licitud a una acció de l'usuari. [Obtén més informació](https://web.dev/geolocation-on-start/)."
820
805
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "Nepoužívá příliš velký model DOM"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "Ukotvení, která neprošla"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "Ke všem externím odkazům přidejte atribut `rel=\"noopener\"` nebo `rel=\"noreferrer\"`. Stránku tím zrychlíte a předejdete ohrožení zabezpečení. [Další informace](https://web.dev/external-anchors-use-rel-noopener/)"
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "Odkazy na cíle v jiných doménách nejsou bezpečné"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "Odkazy na cíle v jiných doménách jsou bezpečné"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "Nepodařilo se určit cíl ukotvení ({anchorHTML}). Pokud tento prvek nepoužíváte jako hypertextový odkaz, zvažte odstranění atributu target=_blank."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "Vůči webům, které bez kontextu žádají o polohu, mohou být uživatelé nedůvěřiví nebo z nich mohou být zmateni. Zvažte možnost spojit tuto žádost s akcí uživatele. [Další informace](https://web.dev/geolocation-on-start/)"
820
805
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "Undgår en overdreven DOM-størrelse"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "Ankere, der ikke bestod gennemgangen"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "Føj `rel=\"noopener\"` eller `rel=\"noreferrer\"` til alle eksterne links for at forbedre ydeevnen og forhindre sikkerhedssårbarheder. [Få flere oplysninger](https://web.dev/external-anchors-use-rel-noopener/)."
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "Links til destinationer af anden oprindelse er ikke sikre"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "Links til destinationer af anden oprindelse er sikre"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "Destinationen for ankeret ({anchorHTML}) kunne ikke identificeres. Hvis det ikke bruges som hyperlink, bør du overveje at fjerne target=_blank."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "Brugere er mistænksomme over for eller forvirres af websites, der anmoder om deres placering uden sammenhæng. Overvej at knytte anmodningen til en brugerhandling i stedet for. [Få flere oplysninger](https://web.dev/geolocation-on-start/)."
820
805
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "Vermeidet eine übermäßige DOM-Größe"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "Fehlerhafte Anker"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "Fügen Sie beliebigen externen Links `rel=\"noopener\"` oder `rel=\"noreferrer\"` hinzu, um die Leistung zu verbessern und Sicherheitslücken zu vermeiden. [Weitere Informationen.](https://web.dev/external-anchors-use-rel-noopener/)"
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "Links zu ursprungsübergreifenden Zielen sind unsicher"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "Links zu ursprungsübergreifenden Zielen sind sicher"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "Ziel für Anker ({anchorHTML}) kann nicht bestimmt werden. Wenn dies nicht als Hyperlink genutzt wird, sollten Sie target=_blank entfernen."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "Nutzer sind misstrauisch oder verwirrt, wenn Websites den Standort ohne Begründung anfordern. Versuchen Sie stattdessen, die Anforderung mit einer Nutzeraktion zu verbinden. [Weitere Informationen.](https://web.dev/geolocation-on-start/)"
820
805
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "Αποφεύγει τα υπερβολικά μεγάλα μεγέθη DOM"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "Αγκυρώσεις που αποτυγχάνουν"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "Προσθέστε ένα στοιχείο `rel=\"noopener\"` ή `rel=\"noreferrer\"` στους εξωτερικούς συνδέσμους για να βελτιώσετε την απόδοση και να αποφύγετε τις ευπάθειες ασφάλειας. [Μάθετε περισσότερα](https://web.dev/external-anchors-use-rel-noopener/)."
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "Οι σύνδεσμοι με προορισμούς διασταυρούμενων προελεύσεων δεν είναι ασφαλείς"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "Οι σύνδεσμοι με προορισμούς διασταυρούμενων προελεύσεων είναι ασφαλείς"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "Δεν ήταν δυνατός ο προσδιορισμός του προορισμού για την αγκύρωση ({anchorHTML}). Εάν δεν χρησιμοποιείται ως υπερσύνδεσμος, εξετάστε το ενδεχόμενο να καταργήσετε το χαρακτηριστικό target=_blank."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "Οι ιστότοποι που απαιτούν τη γνωστοποίηση τοποθεσίας χωρίς προφανή αιτία προκαλούν σύγχυση ή φαίνονται ύποπτοι στους χρήστες. Συνιστάται τα αιτήματα να συνδέονται με τις ενέργειες των χρηστών. [Μάθετε περισσότερα](https://web.dev/geolocation-on-start/)."
820
805
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "Avoids an excessive DOM size"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "Failing anchors"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "Add `rel=\"noopener\"` or `rel=\"noreferrer\"` to any external links to improve performance and prevent security vulnerabilities. [Learn more](https://web.dev/external-anchors-use-rel-noopener/)."
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "Links to cross-origin destinations are unsafe"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "Links to cross-origin destinations are safe"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "Unable to determine the destination for anchor ({anchorHTML}). If not used as a hyperlink, consider removing target=_blank."
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to a user action instead. [Learn more](https://web.dev/geolocation-on-start/)."
820
805
  },
@@ -821,21 +821,6 @@
821
821
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
822
822
  "message": "Avoids an excessive DOM size"
823
823
  },
824
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
825
- "message": "Failing Anchors"
826
- },
827
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
828
- "message": "Add `rel=\"noopener\"` or `rel=\"noreferrer\"` to any external links to improve performance and prevent security vulnerabilities. [Learn more](https://web.dev/external-anchors-use-rel-noopener/)."
829
- },
830
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
831
- "message": "Links to cross-origin destinations are unsafe"
832
- },
833
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
834
- "message": "Links to cross-origin destinations are safe"
835
- },
836
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
837
- "message": "Unable to determine the destination for anchor ({anchorHTML}). If not used as a hyperlink, consider removing target=_blank."
838
- },
839
824
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
840
825
  "message": "Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to a user action instead. [Learn more](https://web.dev/geolocation-on-start/)."
841
826
  },
@@ -2345,6 +2330,9 @@
2345
2330
  "report/renderer/util.js | calculatorLink": {
2346
2331
  "message": "See calculator."
2347
2332
  },
2333
+ "report/renderer/util.js | collapseView": {
2334
+ "message": "Collapse view"
2335
+ },
2348
2336
  "report/renderer/util.js | crcInitialNavigation": {
2349
2337
  "message": "Initial Navigation"
2350
2338
  },
@@ -2381,9 +2369,15 @@
2381
2369
  "report/renderer/util.js | errorMissingAuditInfo": {
2382
2370
  "message": "Report error: no audit information"
2383
2371
  },
2372
+ "report/renderer/util.js | expandView": {
2373
+ "message": "Expand view"
2374
+ },
2384
2375
  "report/renderer/util.js | footerIssue": {
2385
2376
  "message": "File an issue"
2386
2377
  },
2378
+ "report/renderer/util.js | hide": {
2379
+ "message": "Hide"
2380
+ },
2387
2381
  "report/renderer/util.js | labDataTitle": {
2388
2382
  "message": "Lab Data"
2389
2383
  },
@@ -2408,6 +2402,9 @@
2408
2402
  "report/renderer/util.js | runtimeAnalysisWindow": {
2409
2403
  "message": "Initial page load"
2410
2404
  },
2405
+ "report/renderer/util.js | runtimeCustom": {
2406
+ "message": "Custom throttling"
2407
+ },
2411
2408
  "report/renderer/util.js | runtimeDesktopEmulation": {
2412
2409
  "message": "Emulated Desktop"
2413
2410
  },
@@ -2441,9 +2438,15 @@
2441
2438
  "report/renderer/util.js | runtimeSingleLoadTooltip": {
2442
2439
  "message": "This data is taken from a single page load, as opposed to field data summarizing many sessions."
2443
2440
  },
2441
+ "report/renderer/util.js | runtimeSlow4g": {
2442
+ "message": "Slow 4G throttling"
2443
+ },
2444
2444
  "report/renderer/util.js | runtimeUnknown": {
2445
2445
  "message": "Unknown"
2446
2446
  },
2447
+ "report/renderer/util.js | show": {
2448
+ "message": "Show"
2449
+ },
2447
2450
  "report/renderer/util.js | showRelevantAudits": {
2448
2451
  "message": "Show audits relevant to:"
2449
2452
  },
@@ -800,21 +800,6 @@
800
800
  "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
801
801
  "message": "[Åvöîðš åñ éxçéššîvé ÐÖM šîžé one two three four five six]"
802
802
  },
803
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
804
- "message": "[Fåîļîñĝ Åñçĥöŕš one two]"
805
- },
806
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
807
- "message": "[Åðð ᐅ`rel=\"noopener\"`ᐊ öŕ ᐅ`rel=\"noreferrer\"`ᐊ ţö åñý éxţéŕñåļ ļîñķš ţö îmþŕövé þéŕƒöŕmåñçé åñð þŕévéñţ šéçûŕîţý vûļñéŕåбîļîţîéš. ᐅ[ᐊĻéåŕñ möŕéᐅ](https://web.dev/external-anchors-use-rel-noopener/)ᐊ. one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen]"
808
- },
809
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | failureTitle": {
810
- "message": "[Ļîñķš ţö çŕöšš-öŕîĝîñ ðéšţîñåţîöñš åŕé ûñšåƒé one two three four five six seven eight nine]"
811
- },
812
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | title": {
813
- "message": "[Ļîñķš ţö çŕöšš-öŕîĝîñ ðéšţîñåţîöñš åŕé šåƒé one two three four five six seven eight nine]"
814
- },
815
- "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | warning": {
816
- "message": "[Ûñåбļé ţö ðéţéŕmîñé ţĥé ðéšţîñåţîöñ ƒöŕ åñçĥöŕ (ᐅ{anchorHTML}ᐊ). ΃ ñöţ ûšéð åš å ĥýþéŕļîñķ, çöñšîðéŕ ŕémövîñĝ ţåŕĝéţ=_бļåñķ. one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen]"
817
- },
818
803
  "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | description": {
819
804
  "message": "[Ûšéŕš åŕé mîšţŕûšţƒûļ öƒ öŕ çöñƒûšéð бý šîţéš ţĥåţ ŕéqûéšţ ţĥéîŕ ļöçåţîöñ ŵîţĥöûţ çöñţéxţ. Çöñšîðéŕ ţýîñĝ ţĥé ŕéqûéšţ ţö å ûšéŕ åçţîöñ îñšţéåð. ᐅ[ᐊĻéåŕñ möŕéᐅ](https://web.dev/geolocation-on-start/)ᐊ. one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree]"
820
805
  },