lighthouse 11.7.0 → 12.0.0-dev.20240422

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/CONTRIBUTING.md +2 -2
  2. package/cli/bin.js +0 -7
  3. package/cli/cli-flags.d.ts +1 -5
  4. package/cli/cli-flags.js +4 -8
  5. package/cli/test/smokehouse/__snapshots__/report-assert-test.js.snap +14 -14
  6. package/cli/test/smokehouse/config/exclusions.js +3 -0
  7. package/cli/test/smokehouse/core-tests.js +6 -20
  8. package/cli/test/smokehouse/frontends/smokehouse-bin.js +2 -2
  9. package/core/audits/accessibility/accesskeys.js +1 -1
  10. package/core/audits/accessibility/aria-allowed-attr.js +1 -1
  11. package/core/audits/accessibility/aria-allowed-role.js +1 -1
  12. package/core/audits/accessibility/aria-command-name.js +1 -1
  13. package/core/audits/accessibility/aria-conditional-attr.d.ts +10 -0
  14. package/core/audits/accessibility/aria-conditional-attr.js +43 -0
  15. package/core/audits/accessibility/{duplicate-id-active.d.ts → aria-deprecated-role.d.ts} +3 -3
  16. package/core/audits/accessibility/aria-deprecated-role.js +43 -0
  17. package/core/audits/accessibility/aria-dialog-name.js +1 -1
  18. package/core/audits/accessibility/aria-hidden-body.js +1 -1
  19. package/core/audits/accessibility/aria-hidden-focus.js +1 -1
  20. package/core/audits/accessibility/aria-input-field-name.js +1 -1
  21. package/core/audits/accessibility/aria-meter-name.js +1 -1
  22. package/core/audits/accessibility/aria-progressbar-name.js +1 -1
  23. package/core/audits/accessibility/aria-prohibited-attr.d.ts +10 -0
  24. package/core/audits/accessibility/aria-prohibited-attr.js +44 -0
  25. package/core/audits/accessibility/aria-required-attr.js +1 -1
  26. package/core/audits/accessibility/aria-required-children.js +1 -1
  27. package/core/audits/accessibility/aria-required-parent.js +1 -1
  28. package/core/audits/accessibility/aria-roles.js +1 -1
  29. package/core/audits/accessibility/aria-text.js +1 -1
  30. package/core/audits/accessibility/aria-toggle-field-name.js +1 -1
  31. package/core/audits/accessibility/aria-tooltip-name.js +1 -1
  32. package/core/audits/accessibility/aria-treeitem-name.js +1 -1
  33. package/core/audits/accessibility/aria-valid-attr-value.js +1 -1
  34. package/core/audits/accessibility/aria-valid-attr.js +1 -1
  35. package/core/audits/accessibility/button-name.js +1 -1
  36. package/core/audits/accessibility/bypass.js +1 -1
  37. package/core/audits/accessibility/color-contrast.js +1 -1
  38. package/core/audits/accessibility/definition-list.js +1 -1
  39. package/core/audits/accessibility/dlitem.js +1 -1
  40. package/core/audits/accessibility/document-title.js +1 -1
  41. package/core/audits/accessibility/duplicate-id-aria.js +1 -1
  42. package/core/audits/accessibility/empty-heading.js +1 -1
  43. package/core/audits/accessibility/form-field-multiple-labels.js +1 -1
  44. package/core/audits/accessibility/frame-title.js +1 -1
  45. package/core/audits/accessibility/heading-order.js +1 -1
  46. package/core/audits/accessibility/html-has-lang.js +1 -1
  47. package/core/audits/accessibility/html-lang-valid.js +1 -1
  48. package/core/audits/accessibility/html-xml-lang-mismatch.js +1 -1
  49. package/core/audits/accessibility/identical-links-same-purpose.js +1 -1
  50. package/core/audits/accessibility/image-alt.js +1 -1
  51. package/core/audits/accessibility/image-redundant-alt.js +1 -1
  52. package/core/audits/accessibility/input-button-name.js +1 -1
  53. package/core/audits/accessibility/input-image-alt.js +1 -1
  54. package/core/audits/accessibility/label-content-name-mismatch.js +1 -1
  55. package/core/audits/accessibility/label.js +1 -1
  56. package/core/audits/accessibility/landmark-one-main.js +1 -1
  57. package/core/audits/accessibility/link-in-text-block.js +1 -1
  58. package/core/audits/accessibility/link-name.js +1 -1
  59. package/core/audits/accessibility/list.js +1 -1
  60. package/core/audits/accessibility/listitem.js +1 -1
  61. package/core/audits/accessibility/meta-refresh.js +1 -1
  62. package/core/audits/accessibility/meta-viewport.js +1 -1
  63. package/core/audits/accessibility/object-alt.js +1 -1
  64. package/core/audits/accessibility/select-name.js +1 -1
  65. package/core/audits/accessibility/skip-link.js +1 -1
  66. package/core/audits/accessibility/tabindex.js +1 -1
  67. package/core/audits/accessibility/table-duplicate-name.js +1 -1
  68. package/core/audits/accessibility/table-fake-caption.js +1 -1
  69. package/core/audits/accessibility/target-size.js +1 -2
  70. package/core/audits/accessibility/td-has-header.js +1 -1
  71. package/core/audits/accessibility/td-headers-attr.js +1 -1
  72. package/core/audits/accessibility/th-has-data-cells.js +1 -1
  73. package/core/audits/accessibility/valid-lang.js +1 -1
  74. package/core/audits/accessibility/video-caption.js +1 -1
  75. package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +0 -16
  76. package/core/audits/byte-efficiency/byte-efficiency-audit.js +1 -38
  77. package/core/audits/byte-efficiency/offscreen-images.d.ts +0 -11
  78. package/core/audits/byte-efficiency/offscreen-images.js +0 -15
  79. package/core/audits/byte-efficiency/render-blocking-resources.js +27 -26
  80. package/core/audits/byte-efficiency/unminified-css.js +2 -2
  81. package/core/audits/byte-efficiency/unused-css-rules.js +3 -1
  82. package/core/audits/dobetterweb/uses-http2.d.ts +0 -13
  83. package/core/audits/dobetterweb/uses-http2.js +4 -38
  84. package/core/audits/font-display.js +2 -2
  85. package/core/audits/layout-shifts.js +2 -2
  86. package/core/audits/preload-fonts.d.ts +1 -5
  87. package/core/audits/preload-fonts.js +1 -10
  88. package/core/audits/prioritize-lcp-image.js +2 -2
  89. package/core/audits/redirects-http.d.ts +19 -0
  90. package/core/audits/redirects-http.js +75 -0
  91. package/core/audits/resource-summary.d.ts +2 -0
  92. package/core/audits/resource-summary.js +5 -4
  93. package/core/audits/seo/is-crawlable.d.ts +2 -1
  94. package/core/audits/seo/link-text.js +12 -0
  95. package/core/audits/uses-rel-preload.d.ts +1 -5
  96. package/core/audits/uses-rel-preload.js +5 -15
  97. package/core/audits/work-during-interaction.d.ts +2 -2
  98. package/core/audits/work-during-interaction.js +2 -2
  99. package/core/computed/js-bundles.d.ts +1 -1
  100. package/core/computed/metrics/cumulative-layout-shift.js +2 -2
  101. package/core/computed/metrics/lantern-first-contentful-paint.d.ts +13 -82
  102. package/core/computed/metrics/lantern-first-contentful-paint.js +16 -178
  103. package/core/computed/metrics/lantern-first-meaningful-paint.d.ts +13 -12
  104. package/core/computed/metrics/lantern-first-meaningful-paint.js +11 -49
  105. package/core/computed/metrics/lantern-interactive.d.ts +13 -21
  106. package/core/computed/metrics/lantern-interactive.js +12 -84
  107. package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +13 -25
  108. package/core/computed/metrics/lantern-largest-contentful-paint.js +13 -80
  109. package/core/computed/metrics/lantern-max-potential-fid.d.ts +13 -24
  110. package/core/computed/metrics/lantern-max-potential-fid.js +12 -64
  111. package/core/computed/metrics/lantern-metric.d.ts +14 -18
  112. package/core/computed/metrics/lantern-metric.js +34 -30
  113. package/core/computed/metrics/lantern-speed-index.d.ts +13 -32
  114. package/core/computed/metrics/lantern-speed-index.js +13 -116
  115. package/core/computed/metrics/lantern-total-blocking-time.d.ts +13 -25
  116. package/core/computed/metrics/lantern-total-blocking-time.js +10 -94
  117. package/core/computed/metrics/metric.js +1 -3
  118. package/core/computed/module-duplication.d.ts +1 -1
  119. package/core/computed/navigation-insights.d.ts +36 -0
  120. package/core/computed/navigation-insights.js +35 -0
  121. package/core/computed/page-dependency-graph.js +3 -7
  122. package/core/computed/resource-summary.d.ts +10 -12
  123. package/core/computed/resource-summary.js +12 -19
  124. package/core/computed/trace-engine-result.d.ts +16 -3
  125. package/core/computed/trace-engine-result.js +19 -14
  126. package/core/computed/unused-css.d.ts +3 -1
  127. package/core/computed/unused-css.js +6 -5
  128. package/core/config/config-helpers.js +0 -4
  129. package/core/config/constants.js +0 -1
  130. package/core/config/default-config.js +63 -142
  131. package/core/config/experimental-config.js +11 -0
  132. package/core/config/filters.js +0 -1
  133. package/core/gather/driver/navigation.js +4 -1
  134. package/core/gather/driver/prepare.js +1 -1
  135. package/core/gather/driver/target-manager.js +4 -3
  136. package/core/gather/driver/wait-for-condition.js +2 -3
  137. package/core/gather/driver.d.ts +12 -0
  138. package/core/gather/driver.js +27 -0
  139. package/core/gather/gatherers/accessibility.js +4 -6
  140. package/core/gather/gatherers/css-usage.d.ts +0 -21
  141. package/core/gather/gatherers/css-usage.js +9 -119
  142. package/core/gather/gatherers/root-causes.d.ts +2 -2
  143. package/core/gather/gatherers/root-causes.js +6 -5
  144. package/core/gather/gatherers/stylesheets.d.ts +26 -0
  145. package/core/gather/gatherers/stylesheets.js +138 -0
  146. package/core/gather/gatherers/trace-elements.d.ts +4 -13
  147. package/core/gather/gatherers/trace-elements.js +42 -31
  148. package/core/gather/navigation-runner.js +3 -1
  149. package/core/gather/session.d.ts +8 -0
  150. package/core/gather/session.js +14 -1
  151. package/core/lib/emulation.js +2 -2
  152. package/core/lib/i18n/i18n.d.ts +0 -1
  153. package/core/lib/i18n/i18n.js +0 -2
  154. package/core/lib/lantern/cpu-node.d.ts +7 -1
  155. package/core/lib/lantern/cpu-node.js +12 -2
  156. package/core/lib/lantern/lantern-error.d.ts +8 -0
  157. package/core/lib/lantern/lantern-error.js +9 -0
  158. package/core/lib/lantern/metric.js +2 -6
  159. package/core/lib/lantern/metrics/first-contentful-paint.d.ts +79 -0
  160. package/core/lib/lantern/metrics/first-contentful-paint.js +200 -0
  161. package/core/lib/lantern/metrics/first-meaningful-paint.d.ts +6 -0
  162. package/core/lib/lantern/metrics/first-meaningful-paint.js +64 -0
  163. package/core/lib/lantern/metrics/interactive.d.ts +26 -0
  164. package/core/lib/lantern/metrics/interactive.js +112 -0
  165. package/core/lib/lantern/metrics/largest-contentful-paint.d.ts +19 -0
  166. package/core/lib/lantern/metrics/largest-contentful-paint.js +108 -0
  167. package/core/lib/lantern/metrics/max-potential-fid.d.ts +30 -0
  168. package/core/lib/lantern/metrics/max-potential-fid.js +92 -0
  169. package/core/lib/lantern/metrics/speed-index.d.ts +38 -0
  170. package/core/lib/lantern/metrics/speed-index.js +144 -0
  171. package/core/lib/lantern/metrics/total-blocking-time.d.ts +31 -0
  172. package/core/lib/lantern/metrics/total-blocking-time.js +128 -0
  173. package/core/lib/lantern/network-node.js +28 -4
  174. package/core/lib/lantern/page-dependency-graph.d.ts +4 -4
  175. package/core/lib/lantern/page-dependency-graph.js +19 -7
  176. package/core/lib/lantern/simulator/connection-pool.d.ts +2 -12
  177. package/core/lib/lantern/simulator/connection-pool.js +3 -22
  178. package/core/lib/lantern/simulator/network-analyzer.js +1 -12
  179. package/core/lib/lantern/simulator/simulator.d.ts +2 -4
  180. package/core/lib/lantern/simulator/simulator.js +7 -14
  181. package/core/lib/lantern/types/lantern.d.ts +5 -3
  182. package/core/lib/lantern-trace-saver.js +0 -1
  183. package/core/lib/lh-error.d.ts +9 -0
  184. package/core/lib/lh-error.js +13 -3
  185. package/core/lib/lighthouse-compatibility.js +53 -10
  186. package/core/lib/navigation-error.js +3 -0
  187. package/core/lib/network-request.d.ts +1 -0
  188. package/core/lib/network-request.js +29 -1
  189. package/core/lib/proto-preprocessor.js +24 -8
  190. package/core/lib/tracehouse/trace-processor.js +15 -2
  191. package/core/runner.js +18 -25
  192. package/dist/report/bundle.esm.js +11 -112
  193. package/dist/report/flow.js +16 -117
  194. package/dist/report/standalone.js +12 -113
  195. package/flow-report/src/help-dialog.tsx +0 -1
  196. package/flow-report/src/i18n/i18n.d.ts +0 -4
  197. package/flow-report/src/i18n/ui-strings.d.ts +0 -1
  198. package/flow-report/src/i18n/ui-strings.js +0 -2
  199. package/flow-report/src/summary/category.tsx +10 -12
  200. package/package.json +7 -7
  201. package/readme.md +4 -4
  202. package/report/assets/styles.css +1 -60
  203. package/report/assets/templates.html +0 -95
  204. package/report/renderer/category-renderer.js +1 -1
  205. package/report/renderer/components.d.ts +2 -2
  206. package/report/renderer/components.js +2 -103
  207. package/report/renderer/dom.d.ts +1 -1
  208. package/report/renderer/dom.js +1 -1
  209. package/report/renderer/performance-category-renderer.d.ts +0 -7
  210. package/report/renderer/performance-category-renderer.js +1 -32
  211. package/report/renderer/report-renderer.js +3 -13
  212. package/report/renderer/report-ui-features.js +1 -1
  213. package/report/renderer/report-utils.d.ts +0 -1
  214. package/report/renderer/report-utils.js +13 -13
  215. package/shared/localization/locales/ar-XB.json +62 -329
  216. package/shared/localization/locales/ar.json +62 -329
  217. package/shared/localization/locales/bg.json +62 -329
  218. package/shared/localization/locales/ca.json +62 -329
  219. package/shared/localization/locales/cs.json +62 -329
  220. package/shared/localization/locales/da.json +62 -329
  221. package/shared/localization/locales/de.json +62 -329
  222. package/shared/localization/locales/el.json +62 -329
  223. package/shared/localization/locales/en-GB.json +62 -329
  224. package/shared/localization/locales/en-US.json +101 -332
  225. package/shared/localization/locales/en-XA.json +62 -329
  226. package/shared/localization/locales/en-XL.json +101 -332
  227. package/shared/localization/locales/es-419.json +62 -329
  228. package/shared/localization/locales/es.json +62 -329
  229. package/shared/localization/locales/fi.json +62 -329
  230. package/shared/localization/locales/fil.json +61 -328
  231. package/shared/localization/locales/fr.json +62 -329
  232. package/shared/localization/locales/he.json +62 -329
  233. package/shared/localization/locales/hi.json +62 -329
  234. package/shared/localization/locales/hr.json +63 -330
  235. package/shared/localization/locales/hu.json +62 -329
  236. package/shared/localization/locales/id.json +62 -329
  237. package/shared/localization/locales/it.json +62 -329
  238. package/shared/localization/locales/ja.json +62 -329
  239. package/shared/localization/locales/ko.json +62 -329
  240. package/shared/localization/locales/lt.json +62 -329
  241. package/shared/localization/locales/lv.json +62 -329
  242. package/shared/localization/locales/nl.json +62 -329
  243. package/shared/localization/locales/no.json +62 -329
  244. package/shared/localization/locales/pl.json +61 -328
  245. package/shared/localization/locales/pt-PT.json +62 -329
  246. package/shared/localization/locales/pt.json +64 -331
  247. package/shared/localization/locales/ro.json +62 -329
  248. package/shared/localization/locales/ru.json +62 -329
  249. package/shared/localization/locales/sk.json +62 -329
  250. package/shared/localization/locales/sl.json +62 -329
  251. package/shared/localization/locales/sr-Latn.json +62 -329
  252. package/shared/localization/locales/sr.json +62 -329
  253. package/shared/localization/locales/sv.json +62 -329
  254. package/shared/localization/locales/ta.json +61 -328
  255. package/shared/localization/locales/te.json +62 -329
  256. package/shared/localization/locales/th.json +62 -329
  257. package/shared/localization/locales/tr.json +62 -329
  258. package/shared/localization/locales/uk.json +62 -329
  259. package/shared/localization/locales/vi.json +61 -328
  260. package/shared/localization/locales/zh-HK.json +62 -329
  261. package/shared/localization/locales/zh-TW.json +61 -328
  262. package/shared/localization/locales/zh.json +62 -329
  263. package/tsconfig.json +1 -3
  264. package/types/artifacts.d.ts +21 -110
  265. package/types/audit.d.ts +0 -10
  266. package/types/config.d.ts +0 -1
  267. package/types/externs.d.ts +0 -2
  268. package/types/gatherer.d.ts +3 -0
  269. package/types/internal/smokehouse.d.ts +1 -1
  270. package/types/lh.d.ts +0 -2
  271. package/types/lhr/audit-details.d.ts +9 -4
  272. package/types/lhr/lhr.d.ts +0 -4
  273. package/types/lhr/settings.d.ts +0 -4
  274. package/core/audits/accessibility/duplicate-id-active.js +0 -42
  275. package/core/audits/content-width.d.ts +0 -17
  276. package/core/audits/content-width.js +0 -76
  277. package/core/audits/installable-manifest.d.ts +0 -111
  278. package/core/audits/installable-manifest.js +0 -248
  279. package/core/audits/layout-shift-elements.d.ts +0 -16
  280. package/core/audits/layout-shift-elements.js +0 -101
  281. package/core/audits/manual/pwa-cross-browser.d.ts +0 -12
  282. package/core/audits/manual/pwa-cross-browser.js +0 -40
  283. package/core/audits/manual/pwa-each-page-has-url.d.ts +0 -12
  284. package/core/audits/manual/pwa-each-page-has-url.js +0 -38
  285. package/core/audits/manual/pwa-page-transitions.d.ts +0 -12
  286. package/core/audits/manual/pwa-page-transitions.js +0 -38
  287. package/core/audits/maskable-icon.d.ts +0 -25
  288. package/core/audits/maskable-icon.js +0 -70
  289. package/core/audits/multi-check-audit.d.ts +0 -28
  290. package/core/audits/multi-check-audit.js +0 -82
  291. package/core/audits/no-unload-listeners.d.ts +0 -16
  292. package/core/audits/no-unload-listeners.js +0 -86
  293. package/core/audits/performance-budget.d.ts +0 -39
  294. package/core/audits/performance-budget.js +0 -154
  295. package/core/audits/script-elements-test-audit.d.ts +0 -14
  296. package/core/audits/script-elements-test-audit.js +0 -29
  297. package/core/audits/seo/plugins.d.ts +0 -15
  298. package/core/audits/seo/plugins.js +0 -150
  299. package/core/audits/seo/tap-targets.d.ts +0 -50
  300. package/core/audits/seo/tap-targets.js +0 -352
  301. package/core/audits/splash-screen.d.ts +0 -37
  302. package/core/audits/splash-screen.js +0 -98
  303. package/core/audits/themed-omnibox.d.ts +0 -42
  304. package/core/audits/themed-omnibox.js +0 -102
  305. package/core/audits/timing-budget.d.ts +0 -43
  306. package/core/audits/timing-budget.js +0 -175
  307. package/core/computed/manifest-values.d.ts +0 -24
  308. package/core/computed/manifest-values.js +0 -136
  309. package/core/config/budget.d.ts +0 -74
  310. package/core/config/budget.js +0 -340
  311. package/core/config/metrics-to-audits.d.ts +0 -19
  312. package/core/config/metrics-to-audits.js +0 -62
  313. package/core/gather/driver/service-workers.d.ts +0 -16
  314. package/core/gather/driver/service-workers.js +0 -52
  315. package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.d.ts +0 -47
  316. package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.js +0 -233
  317. package/core/gather/gatherers/global-listeners.d.ts +0 -27
  318. package/core/gather/gatherers/global-listeners.js +0 -108
  319. package/core/gather/gatherers/installability-errors.d.ts +0 -17
  320. package/core/gather/gatherers/installability-errors.js +0 -56
  321. package/core/gather/gatherers/script-elements.d.ts +0 -21
  322. package/core/gather/gatherers/script-elements.js +0 -100
  323. package/core/gather/gatherers/seo/embedded-content.d.ts +0 -10
  324. package/core/gather/gatherers/seo/embedded-content.js +0 -63
  325. package/core/gather/gatherers/seo/tap-targets.d.ts +0 -21
  326. package/core/gather/gatherers/seo/tap-targets.js +0 -389
  327. package/core/gather/gatherers/service-worker.d.ts +0 -10
  328. package/core/gather/gatherers/service-worker.js +0 -32
  329. package/core/gather/gatherers/web-app-manifest.d.ts +0 -32
  330. package/core/gather/gatherers/web-app-manifest.js +0 -106
  331. package/report/renderer/pwa-category-renderer.d.ts +0 -55
  332. package/report/renderer/pwa-category-renderer.js +0 -184
  333. package/third-party/chromium-synchronization/installability-errors-test.js +0 -79
  334. package/types/lhr/budget.d.ts +0 -60
@@ -1,184 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2018 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import {CategoryRenderer} from './category-renderer.js';
8
- import {ReportUtils} from './report-utils.js';
9
- import {Globals} from './report-globals.js';
10
-
11
- export class PwaCategoryRenderer extends CategoryRenderer {
12
- /**
13
- * @param {LH.ReportResult.Category} category
14
- * @param {Object<string, LH.Result.ReportGroup>} [groupDefinitions]
15
- * @return {Element}
16
- */
17
- render(category, groupDefinitions = {}) {
18
- const categoryElem = this.dom.createElement('div', 'lh-category');
19
- categoryElem.id = category.id;
20
- // Deprecation warning banner.
21
- const pwaMessageContainer = this.dom.createComponent('warningsToplevel');
22
- const pwaMessageEl = this.dom.find('.lh-warnings__msg', pwaMessageContainer);
23
- pwaMessageEl.append(this.dom.convertMarkdownLinkSnippets(Globals.strings.pwaRemovalMessage));
24
-
25
- categoryElem.append(pwaMessageContainer);
26
- categoryElem.append(this.renderCategoryHeader(category, groupDefinitions));
27
-
28
- const auditRefs = category.auditRefs;
29
-
30
- // Regular audits aren't split up into pass/fail/notApplicable clumps, they're
31
- // all put in a top-level clump that isn't expandable/collapsible.
32
- const regularAuditRefs = auditRefs.filter(ref => ref.result.scoreDisplayMode !== 'manual');
33
- const auditsElem = this._renderAudits(regularAuditRefs, groupDefinitions);
34
- categoryElem.append(auditsElem);
35
-
36
- // Manual audits are still in a manual clump.
37
- const manualAuditRefs = auditRefs.filter(ref => ref.result.scoreDisplayMode === 'manual');
38
- const manualElem = this.renderClump('manual', {
39
- auditRefsOrEls: manualAuditRefs,
40
- description: category.manualDescription,
41
- openByDefault: true,
42
- });
43
- categoryElem.append(manualElem);
44
-
45
- return categoryElem;
46
- }
47
-
48
- /**
49
- * @param {LH.ReportResult.Category} category
50
- * @param {Record<string, LH.Result.ReportGroup>} groupDefinitions
51
- * @return {DocumentFragment}
52
- */
53
- renderCategoryScore(category, groupDefinitions) {
54
- // Defer to parent-gauge style if category error.
55
- if (category.score === null) {
56
- return super.renderScoreGauge(category, groupDefinitions);
57
- }
58
-
59
- const tmpl = this.dom.createComponent('gaugePwa');
60
- const wrapper = this.dom.find('a.lh-gauge--pwa__wrapper', tmpl);
61
-
62
- // Correct IDs in case multiple instances end up in the page.
63
- const svgRoot = tmpl.querySelector('svg');
64
- if (!svgRoot) throw new Error('no SVG element found in PWA score gauge template');
65
- PwaCategoryRenderer._makeSvgReferencesUnique(svgRoot);
66
-
67
- const allGroups = this._getGroupIds(category.auditRefs);
68
- const passingGroupIds = this._getPassingGroupIds(category.auditRefs);
69
-
70
- if (passingGroupIds.size === allGroups.size) {
71
- wrapper.classList.add('lh-badged--all');
72
- } else {
73
- for (const passingGroupId of passingGroupIds) {
74
- wrapper.classList.add(`lh-badged--${passingGroupId}`);
75
- }
76
- }
77
-
78
- this.dom.find('.lh-gauge__label', tmpl).textContent = category.title;
79
- wrapper.title = this._getGaugeTooltip(category.auditRefs, groupDefinitions);
80
- return tmpl;
81
- }
82
-
83
- /**
84
- * Returns the group IDs found in auditRefs.
85
- * @param {Array<LH.ReportResult.AuditRef>} auditRefs
86
- * @return {!Set<string>}
87
- */
88
- _getGroupIds(auditRefs) {
89
- const groupIds = auditRefs.map(ref => ref.group).filter(/** @return {g is string} */ g => !!g);
90
- return new Set(groupIds);
91
- }
92
-
93
- /**
94
- * Returns the group IDs whose audits are all considered passing.
95
- * @param {Array<LH.ReportResult.AuditRef>} auditRefs
96
- * @return {Set<string>}
97
- */
98
- _getPassingGroupIds(auditRefs) {
99
- const uniqueGroupIds = this._getGroupIds(auditRefs);
100
-
101
- // Remove any that have a failing audit.
102
- for (const auditRef of auditRefs) {
103
- if (!ReportUtils.showAsPassed(auditRef.result) && auditRef.group) {
104
- uniqueGroupIds.delete(auditRef.group);
105
- }
106
- }
107
-
108
- return uniqueGroupIds;
109
- }
110
-
111
- /**
112
- * Returns a tooltip string summarizing group pass rates.
113
- * @param {Array<LH.ReportResult.AuditRef>} auditRefs
114
- * @param {Record<string, LH.Result.ReportGroup>} groupDefinitions
115
- * @return {string}
116
- */
117
- _getGaugeTooltip(auditRefs, groupDefinitions) {
118
- const groupIds = this._getGroupIds(auditRefs);
119
-
120
- const tips = [];
121
- for (const groupId of groupIds) {
122
- const groupAuditRefs = auditRefs.filter(ref => ref.group === groupId);
123
- const auditCount = groupAuditRefs.length;
124
- const passedCount = groupAuditRefs.filter(ref => ReportUtils.showAsPassed(ref.result)).length;
125
-
126
- const title = groupDefinitions[groupId].title;
127
- tips.push(`${title}: ${passedCount}/${auditCount}`);
128
- }
129
-
130
- return tips.join(', ');
131
- }
132
-
133
- /**
134
- * Render non-manual audits in groups, giving a badge to any group that has
135
- * all passing audits.
136
- * @param {Array<LH.ReportResult.AuditRef>} auditRefs
137
- * @param {Object<string, LH.Result.ReportGroup>} groupDefinitions
138
- * @return {Element}
139
- */
140
- _renderAudits(auditRefs, groupDefinitions) {
141
- const auditsElem = this.renderUnexpandableClump(auditRefs, groupDefinitions);
142
-
143
- // Add a 'badged' class to group if all audits in that group pass.
144
- const passsingGroupIds = this._getPassingGroupIds(auditRefs);
145
- for (const groupId of passsingGroupIds) {
146
- const groupElem = this.dom.find(`.lh-audit-group--${groupId}`, auditsElem);
147
- groupElem.classList.add('lh-badged');
148
- }
149
-
150
- return auditsElem;
151
- }
152
-
153
- /**
154
- * Alters SVG id references so multiple instances of an SVG element can coexist
155
- * in a single page. If `svgRoot` has a `<defs>` block, gives all elements defined
156
- * in it unique ids, then updates id references (`<use xlink:href="...">`,
157
- * `fill="url(#...)"`) to the altered ids in all descendents of `svgRoot`.
158
- * @param {SVGElement} svgRoot
159
- */
160
- static _makeSvgReferencesUnique(svgRoot) {
161
- const defsEl = svgRoot.querySelector('defs');
162
- if (!defsEl) return;
163
-
164
- const idSuffix = Globals.getUniqueSuffix();
165
- const elementsToUpdate = defsEl.querySelectorAll('[id]');
166
- for (const el of elementsToUpdate) {
167
- const oldId = el.id;
168
- const newId = `${oldId}-${idSuffix}`;
169
- el.id = newId;
170
-
171
- // Update all <use>s.
172
- const useEls = svgRoot.querySelectorAll(`use[href="#${oldId}"]`);
173
- for (const useEl of useEls) {
174
- useEl.setAttribute('href', `#${newId}`);
175
- }
176
-
177
- // Update all fill="url(#...)"s.
178
- const fillEls = svgRoot.querySelectorAll(`[fill="url(#${oldId})"]`);
179
- for (const fillEl of fillEls) {
180
- fillEl.setAttribute('fill', `url(#${newId})`);
181
- }
182
- }
183
- }
184
- }
@@ -1,79 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2020 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- 'use strict';
7
-
8
- import fetch from 'node-fetch';
9
-
10
- import {UIStrings} from '../../core/audits/installable-manifest.js';
11
-
12
- describe('installabilityErrors', () => {
13
- let chromiumErrorIds;
14
-
15
- before(async () => {
16
- const installableLoggingGitTilesUrl =
17
- 'https://chromium.googlesource.com/chromium/src/+/main/components/webapps/browser/installable/installable_logging.cc?format=TEXT';
18
- const resp = await fetch(installableLoggingGitTilesUrl);
19
- if (!resp.ok) {
20
- throw new Error(`Chromium source fetch failed: ${resp.status} ${resp.statusText}`);
21
- }
22
- const base64 = await resp.text();
23
- const buff = Buffer.from(base64, 'base64');
24
- const text = buff.toString('utf-8');
25
-
26
- // Apply some *beautiful* regexes to parse the C++ of https://chromium.googlesource.com/chromium/src/+/main/chrome/browser/installable/installable_logging.cc
27
- const handledErrorConsts = [...text.matchAll(/error_id = (k.*?);/g)].map(([_, match]) => match);
28
- const errorConstsToIdsCode = [...text.matchAll(/static const char k.*?Id\[\](.|\n)*?;/g)].map(
29
- ([match]) => match.replace(/\n/, '')
30
- );
31
- const errorConstsToIds = errorConstsToIdsCode.map(txt => [
32
- txt.match(/char (k.*?)\[/)[1],
33
- txt.match(/ "(.*?)"/)[1],
34
- ]);
35
- const errorConstsToIdsDict = Object.fromEntries(errorConstsToIds);
36
-
37
- chromiumErrorIds = handledErrorConsts.map(varName => {
38
- if (!errorConstsToIdsDict[varName]) throw new Error(`Error const (${varName}) not found!`);
39
- return errorConstsToIdsDict[varName];
40
- }).sort();
41
- });
42
-
43
- it('should notify us if something changed', () => {
44
- expect(chromiumErrorIds).toMatchInlineSnapshot(`
45
- Array [
46
- "already-installed",
47
- "cannot-download-icon",
48
- "ids-do-not-match",
49
- "in-incognito",
50
- "manifest-display-not-supported",
51
- "manifest-display-override-not-supported",
52
- "manifest-location-changed",
53
- "manifest-missing-name-or-short-name",
54
- "manifest-missing-suitable-icon",
55
- "manifest-parsing-or-network-error",
56
- "no-acceptable-icon",
57
- "no-icon-available",
58
- "no-id-specified",
59
- "no-manifest",
60
- "no-url-for-service-worker",
61
- "not-from-secure-origin",
62
- "not-offline-capable",
63
- "pipeline-restarted",
64
- "platform-not-supported-on-android",
65
- "prefer-related-applications",
66
- "prefer-related-applications-only-beta-stable",
67
- "start-url-not-valid",
68
- "url-not-supported-for-webapk",
69
- ]
70
- `);
71
- });
72
-
73
- it('are each handled explicitly in the gatherer', () => {
74
- const errorStrings = Object.keys(UIStrings)
75
- .filter(key => chromiumErrorIds.includes(key))
76
- .sort();
77
- expect(errorStrings).toEqual(chromiumErrorIds);
78
- });
79
- });
@@ -1,60 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2019 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- /**
8
- * The performance budget interface.
9
- * More info: https://github.com/GoogleChrome/budget.json
10
- */
11
- interface Budget {
12
- /** Budget options */
13
- options?: Budget.Options;
14
- /**
15
- * Indicates which pages a budget applies to. Uses the robots.txt format.
16
- * If it is not supplied, the budget applies to all pages.
17
- * More info on robots.txt: https://developers.google.com/search/reference/robots_txt#url-matching-based-on-path-values
18
- */
19
- path?: string;
20
- /** Budgets based on resource count. */
21
- resourceCounts?: Array<Budget.ResourceBudget>;
22
- /** Budgets based on resource size. */
23
- resourceSizes?: Array<Budget.ResourceBudget>;
24
- /** Budgets based on timing metrics. */
25
- timings?: Array<Budget.TimingBudget>;
26
- }
27
-
28
- declare module Budget {
29
- interface ResourceBudget {
30
- /** The resource type that a budget applies to. */
31
- resourceType: ResourceType;
32
- /** Budget for resource. Depending on context, this is either the count or size (KiB) of a resource. */
33
- budget: number;
34
- }
35
-
36
- interface TimingBudget {
37
- /** The type of timing metric. */
38
- metric: TimingMetric;
39
- /** Budget for timing measurement, in milliseconds. */
40
- budget: number;
41
- }
42
-
43
- interface Options {
44
- /**
45
- * List of hostnames used to classify resources as 1st or 3rd party.
46
- * Wildcards can optionally be used to match a hostname and all of its subdomains.
47
- * For example e.g.: "*.news.gov.uk" matches both "news.gov.uk" and "en.news.gov.uk"
48
- * If this property is not set, the root domain and all its subdomains are considered first party.
49
- */
50
- firstPartyHostnames?: Array<string>;
51
- }
52
-
53
- /** Supported timing metrics. */
54
- type TimingMetric = 'first-contentful-paint' | 'interactive' | 'first-meaningful-paint' | 'max-potential-fid' | 'total-blocking-time' | 'speed-index' | 'largest-contentful-paint' | 'cumulative-layout-shift';
55
-
56
- /** Supported values for the resourceType property of a ResourceBudget. */
57
- type ResourceType = 'stylesheet' | 'image' | 'media' | 'font' | 'script' | 'document' | 'other' | 'total' | 'third-party';
58
- }
59
-
60
- export default Budget;