chrome-devtools-frontend 1.0.964440 → 1.0.966086

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 (195) hide show
  1. package/config/gni/devtools_grd_files.gni +11 -5
  2. package/front_end/core/common/ResolverBase.ts +2 -2
  3. package/front_end/core/i18n/locales/af.json +55 -22
  4. package/front_end/core/i18n/locales/am.json +55 -22
  5. package/front_end/core/i18n/locales/ar.json +55 -22
  6. package/front_end/core/i18n/locales/as.json +55 -22
  7. package/front_end/core/i18n/locales/az.json +55 -22
  8. package/front_end/core/i18n/locales/be.json +55 -22
  9. package/front_end/core/i18n/locales/bg.json +55 -22
  10. package/front_end/core/i18n/locales/bn.json +33 -0
  11. package/front_end/core/i18n/locales/bs.json +53 -20
  12. package/front_end/core/i18n/locales/ca.json +55 -22
  13. package/front_end/core/i18n/locales/cs.json +54 -21
  14. package/front_end/core/i18n/locales/cy.json +55 -22
  15. package/front_end/core/i18n/locales/da.json +54 -21
  16. package/front_end/core/i18n/locales/de.json +55 -22
  17. package/front_end/core/i18n/locales/el.json +55 -22
  18. package/front_end/core/i18n/locales/en-GB.json +33 -0
  19. package/front_end/core/i18n/locales/en-US.json +21 -0
  20. package/front_end/core/i18n/locales/en-XL.json +21 -0
  21. package/front_end/core/i18n/locales/es-419.json +55 -22
  22. package/front_end/core/i18n/locales/es.json +55 -22
  23. package/front_end/core/i18n/locales/et.json +55 -22
  24. package/front_end/core/i18n/locales/eu.json +33 -0
  25. package/front_end/core/i18n/locales/fa.json +56 -23
  26. package/front_end/core/i18n/locales/fi.json +55 -22
  27. package/front_end/core/i18n/locales/fil.json +55 -22
  28. package/front_end/core/i18n/locales/fr-CA.json +55 -22
  29. package/front_end/core/i18n/locales/fr.json +55 -22
  30. package/front_end/core/i18n/locales/gl.json +55 -22
  31. package/front_end/core/i18n/locales/gu.json +33 -0
  32. package/front_end/core/i18n/locales/he.json +55 -22
  33. package/front_end/core/i18n/locales/hi.json +33 -0
  34. package/front_end/core/i18n/locales/hr.json +33 -0
  35. package/front_end/core/i18n/locales/hu.json +55 -22
  36. package/front_end/core/i18n/locales/hy.json +55 -22
  37. package/front_end/core/i18n/locales/id.json +55 -22
  38. package/front_end/core/i18n/locales/is.json +55 -22
  39. package/front_end/core/i18n/locales/it.json +55 -22
  40. package/front_end/core/i18n/locales/ja.json +63 -30
  41. package/front_end/core/i18n/locales/ka.json +55 -22
  42. package/front_end/core/i18n/locales/kk.json +55 -22
  43. package/front_end/core/i18n/locales/km.json +55 -22
  44. package/front_end/core/i18n/locales/kn.json +55 -22
  45. package/front_end/core/i18n/locales/ko.json +55 -22
  46. package/front_end/core/i18n/locales/ky.json +55 -22
  47. package/front_end/core/i18n/locales/lo.json +55 -22
  48. package/front_end/core/i18n/locales/lt.json +55 -22
  49. package/front_end/core/i18n/locales/lv.json +55 -22
  50. package/front_end/core/i18n/locales/mk.json +55 -22
  51. package/front_end/core/i18n/locales/ml.json +33 -0
  52. package/front_end/core/i18n/locales/mn.json +33 -0
  53. package/front_end/core/i18n/locales/mr.json +54 -21
  54. package/front_end/core/i18n/locales/ms.json +55 -22
  55. package/front_end/core/i18n/locales/my.json +55 -22
  56. package/front_end/core/i18n/locales/ne.json +54 -21
  57. package/front_end/core/i18n/locales/nl.json +55 -22
  58. package/front_end/core/i18n/locales/no.json +55 -22
  59. package/front_end/core/i18n/locales/or.json +55 -22
  60. package/front_end/core/i18n/locales/pa.json +55 -22
  61. package/front_end/core/i18n/locales/pl.json +33 -0
  62. package/front_end/core/i18n/locales/pt-PT.json +55 -22
  63. package/front_end/core/i18n/locales/pt.json +55 -22
  64. package/front_end/core/i18n/locales/ro.json +33 -0
  65. package/front_end/core/i18n/locales/ru.json +55 -22
  66. package/front_end/core/i18n/locales/si.json +55 -22
  67. package/front_end/core/i18n/locales/sk.json +55 -22
  68. package/front_end/core/i18n/locales/sl.json +55 -22
  69. package/front_end/core/i18n/locales/sq.json +55 -22
  70. package/front_end/core/i18n/locales/sr-Latn.json +55 -22
  71. package/front_end/core/i18n/locales/sr.json +55 -22
  72. package/front_end/core/i18n/locales/sv.json +55 -22
  73. package/front_end/core/i18n/locales/sw.json +55 -22
  74. package/front_end/core/i18n/locales/ta.json +55 -22
  75. package/front_end/core/i18n/locales/te.json +42 -9
  76. package/front_end/core/i18n/locales/th.json +33 -0
  77. package/front_end/core/i18n/locales/tr.json +55 -22
  78. package/front_end/core/i18n/locales/uk.json +55 -22
  79. package/front_end/core/i18n/locales/ur.json +55 -22
  80. package/front_end/core/i18n/locales/uz.json +55 -22
  81. package/front_end/core/i18n/locales/vi.json +54 -21
  82. package/front_end/core/i18n/locales/zh-HK.json +55 -22
  83. package/front_end/core/i18n/locales/zh-TW.json +54 -21
  84. package/front_end/core/i18n/locales/zh.json +55 -22
  85. package/front_end/core/i18n/locales/zu.json +55 -22
  86. package/front_end/core/protocol_client/InspectorBackend.ts +8 -0
  87. package/front_end/core/sdk/CSSProperty.ts +8 -8
  88. package/front_end/core/sdk/NetworkManager.ts +58 -70
  89. package/front_end/core/sdk/RemoteObject.ts +1 -1
  90. package/front_end/core/sdk/Resource.ts +5 -2
  91. package/front_end/core/sdk/RuntimeModel.ts +10 -0
  92. package/front_end/entrypoints/formatter_worker/formatter_worker.ts +4 -4
  93. package/front_end/legacy_test_runner/bindings_test_runner/PersistenceTestRunner.js +2 -2
  94. package/front_end/legacy_test_runner/console_test_runner/console_test_runner.js +9 -3
  95. package/front_end/legacy_test_runner/heap_profiler_test_runner/heap_profiler_test_runner.js +1 -2
  96. package/front_end/legacy_test_runner/sources_test_runner/DebuggerTestRunner.js +5 -5
  97. package/front_end/models/bindings/ContentProviderBasedProject.ts +2 -3
  98. package/front_end/models/persistence/FileSystemWorkspaceBinding.ts +1 -1
  99. package/front_end/models/persistence/IsolatedFileSystem.ts +2 -2
  100. package/front_end/models/persistence/NetworkPersistenceManager.ts +7 -4
  101. package/front_end/models/workspace/WorkspaceImpl.ts +62 -37
  102. package/front_end/panels/application/ApplicationPanelSidebar.ts +41 -1
  103. package/front_end/panels/application/InterestGroupStorageModel.ts +87 -0
  104. package/front_end/panels/application/InterestGroupStorageView.ts +112 -0
  105. package/front_end/panels/application/InterestGroupTreeElement.ts +61 -0
  106. package/front_end/panels/application/application.ts +4 -0
  107. package/front_end/panels/application/components/InterestGroupAccessGrid.ts +149 -0
  108. package/front_end/panels/application/components/components.ts +2 -0
  109. package/front_end/panels/application/components/interestGroupAccessGrid.css +26 -0
  110. package/front_end/panels/application/interestGroupStorageView.css +13 -0
  111. package/front_end/panels/console/ConsoleViewMessage.ts +33 -6
  112. package/front_end/panels/console/ErrorStackParser.ts +34 -0
  113. package/front_end/panels/emulation/DeviceModeView.ts +6 -2
  114. package/front_end/panels/event_listeners/EventListenersUtils.ts +3 -2
  115. package/front_end/panels/event_listeners/EventListenersView.ts +3 -3
  116. package/front_end/panels/lighthouse/lighthouse.ts +1 -1
  117. package/front_end/panels/sources/DebuggerPausedMessage.ts +2 -2
  118. package/front_end/panels/sources/SourcesPanel.ts +7 -10
  119. package/front_end/panels/sources/UISourceCodeFrame.ts +11 -4
  120. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +1 -2
  121. package/front_end/panels/sources/debuggerPausedMessage.css +5 -1
  122. package/front_end/third_party/codemirror/README.chromium +5 -0
  123. package/front_end/third_party/codemirror/codemirror-tsconfig.json +4 -4
  124. package/front_end/third_party/codemirror/package/addon/runmode/{runmode-standalone.js → runmode-standalone.mjs} +0 -0
  125. package/front_end/third_party/codemirror/package/addon/runmode/{runmode-standalone.d.ts → runmode-standalone.mjs.d.ts} +0 -0
  126. package/front_end/third_party/codemirror/package/mode/css/{css.js → css.mjs} +0 -0
  127. package/front_end/third_party/codemirror/package/mode/css/{css.d.ts → css.mjs.d.ts} +0 -0
  128. package/front_end/third_party/codemirror/package/mode/javascript/{javascript.js → javascript.mjs} +0 -0
  129. package/front_end/third_party/codemirror/package/mode/javascript/{javascript.d.ts → javascript.mjs.d.ts} +0 -0
  130. package/front_end/third_party/codemirror/package/mode/xml/{xml.js → xml.mjs} +0 -0
  131. package/front_end/third_party/codemirror/package/mode/xml/{xml.d.ts → xml.mjs.d.ts} +0 -0
  132. package/front_end/third_party/lighthouse/README.chromium +2 -0
  133. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +954 -885
  134. package/front_end/third_party/lighthouse/lighthouse-tsconfig.json +1 -1
  135. package/front_end/third_party/lighthouse/locales/ar-XB.json +40 -4
  136. package/front_end/third_party/lighthouse/locales/ar.json +59 -23
  137. package/front_end/third_party/lighthouse/locales/bg.json +40 -4
  138. package/front_end/third_party/lighthouse/locales/ca.json +45 -9
  139. package/front_end/third_party/lighthouse/locales/cs.json +39 -3
  140. package/front_end/third_party/lighthouse/locales/da.json +43 -7
  141. package/front_end/third_party/lighthouse/locales/de.json +42 -6
  142. package/front_end/third_party/lighthouse/locales/el.json +59 -23
  143. package/front_end/third_party/lighthouse/locales/en-GB.json +43 -7
  144. package/front_end/third_party/lighthouse/locales/en-US.json +48 -6
  145. package/front_end/third_party/lighthouse/locales/en-XA.json +40 -4
  146. package/front_end/third_party/lighthouse/locales/en-XL.json +48 -6
  147. package/front_end/third_party/lighthouse/locales/es-419.json +39 -3
  148. package/front_end/third_party/lighthouse/locales/es.json +46 -10
  149. package/front_end/third_party/lighthouse/locales/fi.json +57 -21
  150. package/front_end/third_party/lighthouse/locales/fil.json +40 -4
  151. package/front_end/third_party/lighthouse/locales/fr.json +45 -9
  152. package/front_end/third_party/lighthouse/locales/he.json +41 -5
  153. package/front_end/third_party/lighthouse/locales/hi.json +59 -23
  154. package/front_end/third_party/lighthouse/locales/hr.json +57 -21
  155. package/front_end/third_party/lighthouse/locales/hu.json +39 -3
  156. package/front_end/third_party/lighthouse/locales/id.json +40 -4
  157. package/front_end/third_party/lighthouse/locales/it.json +40 -4
  158. package/front_end/third_party/lighthouse/locales/ja.json +39 -3
  159. package/front_end/third_party/lighthouse/locales/ko.json +40 -4
  160. package/front_end/third_party/lighthouse/locales/lt.json +40 -4
  161. package/front_end/third_party/lighthouse/locales/lv.json +56 -20
  162. package/front_end/third_party/lighthouse/locales/nl.json +40 -4
  163. package/front_end/third_party/lighthouse/locales/no.json +56 -20
  164. package/front_end/third_party/lighthouse/locales/pl.json +56 -20
  165. package/front_end/third_party/lighthouse/locales/pt-PT.json +57 -21
  166. package/front_end/third_party/lighthouse/locales/pt.json +41 -5
  167. package/front_end/third_party/lighthouse/locales/ro.json +39 -3
  168. package/front_end/third_party/lighthouse/locales/ru.json +40 -4
  169. package/front_end/third_party/lighthouse/locales/sk.json +39 -3
  170. package/front_end/third_party/lighthouse/locales/sl.json +39 -3
  171. package/front_end/third_party/lighthouse/locales/sr-Latn.json +40 -4
  172. package/front_end/third_party/lighthouse/locales/sr.json +40 -4
  173. package/front_end/third_party/lighthouse/locales/sv.json +39 -3
  174. package/front_end/third_party/lighthouse/locales/ta.json +47 -11
  175. package/front_end/third_party/lighthouse/locales/te.json +61 -25
  176. package/front_end/third_party/lighthouse/locales/th.json +39 -3
  177. package/front_end/third_party/lighthouse/locales/tr.json +40 -4
  178. package/front_end/third_party/lighthouse/locales/uk.json +40 -4
  179. package/front_end/third_party/lighthouse/locales/vi.json +63 -27
  180. package/front_end/third_party/lighthouse/locales/zh-HK.json +40 -4
  181. package/front_end/third_party/lighthouse/locales/zh-TW.json +45 -9
  182. package/front_end/third_party/lighthouse/locales/zh.json +41 -5
  183. package/front_end/third_party/lighthouse/report/bundle.d.ts +1 -0
  184. package/front_end/third_party/lighthouse/report/bundle.js +23 -11
  185. package/front_end/third_party/lighthouse/report-assets/{report-generator.js → report-generator.mjs} +1 -1
  186. package/front_end/third_party/lighthouse/report-assets/{report-generator.d.ts → report-generator.mjs.d.ts} +0 -0
  187. package/front_end/ui/components/docs/tree_outline/custom-renderers.ts +3 -3
  188. package/front_end/ui/legacy/Icon.ts +2 -2
  189. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +4 -4
  190. package/front_end/ui/legacy/components/perf_ui/LiveHeapProfile.ts +2 -2
  191. package/front_end/ui/legacy/themeColors.css +1 -1
  192. package/package.json +1 -1
  193. package/scripts/build/devtools_plugin.js +10 -0
  194. package/scripts/build/esbuild.js +62 -0
  195. package/scripts/build/ninja/bundle.gni +77 -32
@@ -417,10 +417,10 @@
417
417
  "message": "将图片用作 `<input>` 按钮时,提供替代文字有助于屏幕阅读器用户了解该按钮的用途。[了解详情](https://web.dev/input-image-alt/)。"
418
418
  },
419
419
  "lighthouse-core/audits/accessibility/input-image-alt.js | failureTitle": {
420
- "message": "`<input type=\"image\">` 元素缺少 `[alt]` 文字"
420
+ "message": "`<input type=\"image\">` 元素无对应的 `[alt]` 文字"
421
421
  },
422
422
  "lighthouse-core/audits/accessibility/input-image-alt.js | title": {
423
- "message": "`<input type=\"image\">` 元素包含 `[alt]` 文字"
423
+ "message": "`<input type=\"image\">` 元素有对应的 `[alt]` 文字"
424
424
  },
425
425
  "lighthouse-core/audits/accessibility/label.js | description": {
426
426
  "message": "标签可确保辅助技术(如屏幕阅读器)正确读出表单控件。[了解详情](https://web.dev/label/)。"
@@ -480,10 +480,10 @@
480
480
  "message": "屏幕阅读器无法转换非文字内容。向 `<object>` 元素添加替代文字可帮助屏幕阅读器将含义传达给用户。[了解详情](https://web.dev/object-alt/)。"
481
481
  },
482
482
  "lighthouse-core/audits/accessibility/object-alt.js | failureTitle": {
483
- "message": "`<object>` 元素缺少 `[alt]` 文字"
483
+ "message": "`<object>` 元素无对应的替代文字"
484
484
  },
485
485
  "lighthouse-core/audits/accessibility/object-alt.js | title": {
486
- "message": "`<object>` 元素包含 `[alt]` 文字"
486
+ "message": "`<object>` 元素有对应的替代文字"
487
487
  },
488
488
  "lighthouse-core/audits/accessibility/tabindex.js | description": {
489
489
  "message": "值大于 0 意味着明确的导航顺序。尽管这在技术上可行,但往往会让依赖辅助技术的用户感到沮丧。[了解详情](https://web.dev/tabindex/)。"
@@ -1052,6 +1052,9 @@
1052
1052
  "lighthouse-core/audits/installable-manifest.js | not-offline-capable": {
1053
1053
  "message": "该网页无法离线使用"
1054
1054
  },
1055
+ "lighthouse-core/audits/installable-manifest.js | pipeline-restarted": {
1056
+ "message": "PWA 已卸载完毕,正在重置可安装性检查。"
1057
+ },
1055
1058
  "lighthouse-core/audits/installable-manifest.js | platform-not-supported-on-android": {
1056
1059
  "message": "指定的应用平台在 Android 设备上不受支持"
1057
1060
  },
@@ -1061,6 +1064,9 @@
1061
1064
  "lighthouse-core/audits/installable-manifest.js | prefer-related-applications-only-beta-stable": {
1062
1065
  "message": "prefer_related_applications 仅适用于 Android 设备上的 Chrome Beta 版和稳定版。"
1063
1066
  },
1067
+ "lighthouse-core/audits/installable-manifest.js | protocol-timeout": {
1068
+ "message": "Lighthouse 无法确定是否有 Service Worker。请在更新版本的 Chrome 中重试。"
1069
+ },
1064
1070
  "lighthouse-core/audits/installable-manifest.js | start-url-not-valid": {
1065
1071
  "message": "清单起始网址无效"
1066
1072
  },
@@ -1212,7 +1218,7 @@
1212
1218
  "message": "服务器后端延迟"
1213
1219
  },
1214
1220
  "lighthouse-core/audits/no-unload-listeners.js | description": {
1215
- "message": "“`unload`”事件不会可靠地触发,而且监听该事件可能会妨碍系统实施“往返缓存”之类的浏览器优化策略。建议您改用“`pagehide`”或“`visibilitychange`”事件。[了解详情](https://developers.google.com/web/updates/2018/07/page-lifecycle-api#the-unload-event)"
1221
+ "message": "“`unload`”事件不会可靠地触发,而且监听该事件可能会妨碍系统实施“往返缓存”之类的浏览器优化策略。请改用“`pagehide`”或“`visibilitychange`”事件。[了解详情](https://web.dev/bfcache/#never-use-the-unload-event)"
1216
1222
  },
1217
1223
  "lighthouse-core/audits/no-unload-listeners.js | failureTitle": {
1218
1224
  "message": "注册“`unload`”事件监听器"
@@ -2219,6 +2225,36 @@
2219
2225
  "node_modules/lighthouse-stack-packs/packs/magento.js | uses-rel-preload": {
2220
2226
  "message": "您可以通过[修改主题背景的布局](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html)来添加 `<link rel=preload>` 标记。"
2221
2227
  },
2228
+ "node_modules/lighthouse-stack-packs/packs/next.js | modern-image-formats": {
2229
+ "message": "请使用 `Next.js` Image Optimization API 提供现代格式,例如 `WebP` 和 `AVIF`。[了解详情](https://nextjs.org/docs/api-reference/next/image#acceptable-formats)。"
2230
+ },
2231
+ "node_modules/lighthouse-stack-packs/packs/next.js | offscreen-images": {
2232
+ "message": "请使用 `next/image` 组件,该组件的默认设置是 `loading=\"lazy\"`。[了解详情](https://nextjs.org/docs/api-reference/next/image#loading)。"
2233
+ },
2234
+ "node_modules/lighthouse-stack-packs/packs/next.js | render-blocking-resources": {
2235
+ "message": "请使用 `next/script` 组件推迟加载非关键第三方脚本。[了解详情](https://nextjs.org/docs/basic-features/script)。"
2236
+ },
2237
+ "node_modules/lighthouse-stack-packs/packs/next.js | unused-css-rules": {
2238
+ "message": "建议您在 `Next.js` 配置中设置 `PurgeCSS` 以从样式表中移除未使用的规则。[了解详情](https://purgecss.com/guides/next.html)。"
2239
+ },
2240
+ "node_modules/lighthouse-stack-packs/packs/next.js | unused-javascript": {
2241
+ "message": "请使用 `Webpack Bundle Analyzer` 检测未使用的 JavaScript 代码。[了解详情](https://github.com/vercel/next.js/tree/canary/packages/next-bundle-analyzer)。"
2242
+ },
2243
+ "node_modules/lighthouse-stack-packs/packs/next.js | user-timings": {
2244
+ "message": "建议您使用 `Next.js Analytics` 衡量应用的实际性能。[了解详情](https://nextjs.org/docs/advanced-features/measuring-performance)。"
2245
+ },
2246
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-long-cache-ttl": {
2247
+ "message": "请为不可变资源和`Server-side Rendered` (SSR) 网页配置缓存。[了解详情](https://nextjs.org/docs/going-to-production#caching)。"
2248
+ },
2249
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-optimized-images": {
2250
+ "message": "请使用 `next/image` 组件(而非 `<img>`)优化图片。[了解详情](https://nextjs.org/docs/basic-features/image-optimization)。"
2251
+ },
2252
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-responsive-images": {
2253
+ "message": "请使用 `next/image` 组件设置适当的 `sizes`。[了解详情](https://nextjs.org/docs/api-reference/next/image#sizes)。"
2254
+ },
2255
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-text-compression": {
2256
+ "message": "请在您的 Next.js 服务器上启用压缩功能。[了解详情](https://nextjs.org/docs/api-reference/next.config.js/compression)。"
2257
+ },
2222
2258
  "node_modules/lighthouse-stack-packs/packs/octobercms.js | efficient-animated-content": {
2223
2259
  "message": "[将 GIF 动画替换为视频](https://web.dev/replace-gifs-with-videos/)以提高网页加载速度,并考虑使用现代文件格式(例如 [WebM](https://web.dev/replace-gifs-with-videos/#create-webm-videos) 或 [AV1](https://developers.google.com/web/updates/2018/09/chrome-70-media-updates#av1-decoder)),通过目前最先进的 VP9 视频编解码器将压缩效率提高 30% 以上。"
2224
2260
  },
@@ -257,6 +257,7 @@ export class ReportUIFeatures {
257
257
  icon?: string;
258
258
  onClick: () => void;
259
259
  }): HTMLElementByTagName;
260
+ resetUIState(): void;
260
261
  /**
261
262
  * Returns the html that recreates this report.
262
263
  * @return {string}
@@ -1398,7 +1398,7 @@ function createTopbarComponent(dom) {
1398
1398
  el40.setAttribute('href', '#');
1399
1399
  el40.setAttribute('data-i18n', 'dropdownCopyJSON');
1400
1400
  el40.setAttribute('data-action', 'copy');
1401
- const el41 = dom.createElement('a', 'lh-report-icon lh-report-icon--download');
1401
+ const el41 = dom.createElement('a', 'lh-report-icon lh-report-icon--download lh-hidden');
1402
1402
  el41.setAttribute('role', 'menuitem');
1403
1403
  el41.setAttribute('tabindex', '-1');
1404
1404
  el41.setAttribute('href', '#');
@@ -1428,7 +1428,7 @@ function createTopbarComponent(dom) {
1428
1428
  el45.setAttribute('href', '#');
1429
1429
  el45.setAttribute('data-i18n', 'dropdownDarkTheme');
1430
1430
  el45.setAttribute('data-action', 'toggle-dark');
1431
- el37.append(' ', el38, ' ', el39, ' ', el40, ' ', el41, ' ', el42, ' ', el43, ' ', el44, ' ', el45, ' ');
1431
+ el37.append(' ', el38, ' ', el39, ' ', el40, ' ', ' ', el41, ' ', el42, ' ', el43, ' ', el44, ' ', el45, ' ');
1432
1432
  el26.append(' ', el27, ' ', el33, ' ', el37, ' ');
1433
1433
  el2.append(' ', ' ', el3, ' ', el25, ' ', el26, ' ');
1434
1434
  el0.append(el2);
@@ -2260,7 +2260,7 @@ class CategoryRenderer {
2260
2260
  * @return {boolean}
2261
2261
  */
2262
2262
  _auditHasWarning(audit) {
2263
- return Boolean(audit.result.warnings && audit.result.warnings.length);
2263
+ return Boolean(audit.result.warnings?.length);
2264
2264
  }
2265
2265
 
2266
2266
  /**
@@ -4176,8 +4176,8 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
4176
4176
  // Filmstrip
4177
4177
  const timelineEl = this.dom.createChildOf(element, 'div', 'lh-filmstrip-container');
4178
4178
  const thumbnailAudit = category.auditRefs.find(audit => audit.id === 'screenshot-thumbnails');
4179
- const thumbnailResult = thumbnailAudit && thumbnailAudit.result;
4180
- if (thumbnailResult && thumbnailResult.details) {
4179
+ const thumbnailResult = thumbnailAudit?.result;
4180
+ if (thumbnailResult?.details) {
4181
4181
  timelineEl.id = thumbnailResult.id;
4182
4182
  const filmstripEl = this.detailsRenderer.render(thumbnailResult.details);
4183
4183
  filmstripEl && timelineEl.appendChild(filmstripEl);
@@ -4252,7 +4252,7 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
4252
4252
  const budgetTableEls = [];
4253
4253
  ['performance-budget', 'timing-budget'].forEach((id) => {
4254
4254
  const audit = category.auditRefs.find(audit => audit.id === id);
4255
- if (audit && audit.result.details) {
4255
+ if (audit?.result.details) {
4256
4256
  const table = this.detailsRenderer.render(audit.result.details);
4257
4257
  if (table) {
4258
4258
  table.id = id;
@@ -4298,7 +4298,7 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
4298
4298
 
4299
4299
  const labelEl = this.dom.createChildOf(metricFilterEl, 'label', 'lh-metricfilter__label');
4300
4300
  labelEl.htmlFor = elemId;
4301
- labelEl.title = metric.result && metric.result.title;
4301
+ labelEl.title = metric.result?.title;
4302
4302
  labelEl.textContent = metric.acronym || metric.id;
4303
4303
 
4304
4304
  if (metric.acronym === 'All') {
@@ -4773,7 +4773,7 @@ class ReportRenderer {
4773
4773
  Util.reportJson = report;
4774
4774
 
4775
4775
  const fullPageScreenshot =
4776
- report.audits['full-page-screenshot'] && report.audits['full-page-screenshot'].details &&
4776
+ report.audits['full-page-screenshot']?.details &&
4777
4777
  report.audits['full-page-screenshot'].details.type === 'full-page-screenshot' ?
4778
4778
  report.audits['full-page-screenshot'].details : undefined;
4779
4779
  const detailsRenderer = new DetailsRenderer(this._dom, {
@@ -5767,6 +5767,10 @@ class ReportUIFeatures {
5767
5767
  });
5768
5768
  }
5769
5769
 
5770
+ if (this._opts.getStandaloneReportHTML) {
5771
+ this._dom.find('a[data-action="save-html"]', this._dom.rootEl).classList.remove('lh-hidden');
5772
+ }
5773
+
5770
5774
  // Fill in all i18n data.
5771
5775
  for (const node of this._dom.findAll('[data-i18n]', this._dom.rootEl)) {
5772
5776
  // These strings are guaranteed to (at least) have a default English string in Util.UIStrings,
@@ -5801,15 +5805,23 @@ class ReportUIFeatures {
5801
5805
  return buttonEl;
5802
5806
  }
5803
5807
 
5808
+ resetUIState() {
5809
+ if (this._topbar) {
5810
+ this._topbar.resetUIState();
5811
+ }
5812
+ }
5813
+
5804
5814
  /**
5805
5815
  * Returns the html that recreates this report.
5806
5816
  * @return {string}
5807
5817
  */
5808
5818
  getReportHtml() {
5809
- if (this._topbar) {
5810
- this._topbar.resetUIState();
5819
+ if (!this._opts.getStandaloneReportHTML) {
5820
+ throw new Error('`getStandaloneReportHTML` is not set');
5811
5821
  }
5812
- return `<!doctype html><body style="margin: 0">${this._dom.rootEl.outerHTML}`;
5822
+
5823
+ this.resetUIState();
5824
+ return this._opts.getStandaloneReportHTML();
5813
5825
  }
5814
5826
 
5815
5827
  /**