chrome-devtools-frontend 1.0.1536371 → 1.0.1537860

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 (231) hide show
  1. package/.env.template +9 -0
  2. package/docs/get_the_code.md +27 -0
  3. package/front_end/core/common/SettingRegistration.ts +10 -7
  4. package/front_end/core/common/Settings.ts +3 -0
  5. package/front_end/core/host/AidaClient.ts +64 -5
  6. package/front_end/core/host/DispatchHttpRequestClient.ts +62 -0
  7. package/front_end/core/host/GdpClient.ts +8 -57
  8. package/front_end/core/host/host.ts +2 -0
  9. package/front_end/core/protocol_client/CDPConnection.ts +10 -8
  10. package/front_end/core/protocol_client/InspectorBackend.ts +36 -42
  11. package/front_end/core/sdk/EnhancedTracesParser.ts +20 -5
  12. package/front_end/core/sdk/RehydratingConnection.ts +112 -4
  13. package/front_end/core/sdk/RehydratingObject.ts +8 -0
  14. package/front_end/core/sdk/TraceObject.ts +5 -1
  15. package/front_end/core/sdk/sdk-meta.ts +8 -2
  16. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +4 -3
  17. package/front_end/generated/SupportedCSSProperties.js +1 -0
  18. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +23 -7
  19. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +110 -5
  20. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +50 -45
  21. package/front_end/models/cpu_profile/ProfileTreeModel.ts +7 -7
  22. package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
  23. package/front_end/models/trace/types/File.ts +9 -0
  24. package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +1 -1
  25. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +5 -9
  26. package/front_end/panels/ai_assistance/components/ChatView.ts +58 -70
  27. package/front_end/panels/application/BackForwardCacheTreeElement.ts +2 -6
  28. package/front_end/panels/application/StorageView.ts +3 -2
  29. package/front_end/panels/application/components/BackForwardCacheView.ts +96 -108
  30. package/front_end/panels/application/components/FrameDetailsView.ts +8 -11
  31. package/front_end/panels/application/components/OriginTrialTreeView.ts +136 -137
  32. package/front_end/panels/application/components/backForwardCacheView.css +8 -0
  33. package/front_end/panels/application/components/badge.css +9 -1
  34. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +2 -2
  35. package/front_end/panels/application/preloading/components/PreloadingString.ts +27 -0
  36. package/front_end/panels/autofill/AutofillView.ts +1 -1
  37. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +44 -53
  38. package/front_end/panels/console/ConsoleView.ts +11 -9
  39. package/front_end/panels/coverage/CoverageView.ts +1 -2
  40. package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +1 -1
  41. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +1 -1
  42. package/front_end/panels/elements/ElementStatePaneWidget.ts +1 -1
  43. package/front_end/panels/elements/EventListenersWidget.ts +1 -2
  44. package/front_end/panels/elements/PropertiesWidget.ts +1 -1
  45. package/front_end/panels/network/NetworkConfigView.ts +2 -1
  46. package/front_end/panels/network/NetworkPanel.ts +5 -4
  47. package/front_end/panels/network/RequestCookiesView.ts +2 -1
  48. package/front_end/panels/profiler/HeapSnapshotView.ts +3 -2
  49. package/front_end/panels/recorder/RecorderController.ts +1 -2
  50. package/front_end/panels/recorder/components/CreateRecordingView.ts +153 -129
  51. package/front_end/panels/sensors/SensorsView.ts +4 -3
  52. package/front_end/panels/settings/AISettingsTab.ts +162 -171
  53. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +8 -6
  54. package/front_end/panels/settings/KeybindsSettingsTab.ts +3 -2
  55. package/front_end/panels/settings/SettingsScreen.ts +5 -8
  56. package/front_end/panels/settings/WorkspaceSettingsTab.ts +1 -1
  57. package/front_end/panels/settings/aiSettingsTab.css +151 -148
  58. package/front_end/panels/settings/settings-meta.ts +1 -2
  59. package/front_end/panels/sources/AddSourceMapURLDialog.ts +23 -26
  60. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +2 -1
  61. package/front_end/panels/sources/SourcesPanel.ts +2 -1
  62. package/front_end/panels/sources/sources-meta.ts +8 -1
  63. package/front_end/panels/timeline/TimelinePanel.ts +64 -14
  64. package/front_end/panels/timeline/TimelineUIUtils.ts +4 -20
  65. package/front_end/panels/timeline/components/ExportTraceOptions.ts +33 -34
  66. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -0
  67. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +2 -0
  68. package/front_end/third_party/chromium/README.chromium +2 -2
  69. package/front_end/third_party/puppeteer/README.chromium +2 -2
  70. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +9 -1
  71. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  72. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.d.ts +2 -2
  74. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.d.ts.map +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.js.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +13 -1
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts +2 -2
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js +5 -2
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js.map +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +2 -2
  84. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  85. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +3 -1
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Realm.d.ts +1 -12
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Realm.d.ts.map +1 -1
  89. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.d.ts +6 -0
  90. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  91. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js +1 -0
  92. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js.map +1 -1
  93. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +2 -2
  94. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +6 -1
  96. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  97. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts +2 -1
  98. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js +2 -2
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js.map +1 -1
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +2 -2
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +3 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.d.ts +2 -2
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.d.ts.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.js +3 -1
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.js.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.d.ts +1 -0
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.d.ts.map +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.js +1 -0
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.js.map +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +28 -3
  121. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +21 -10
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +9 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.d.ts +2 -2
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.d.ts.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.js.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +13 -1
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts +2 -2
  134. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js +5 -2
  136. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +2 -2
  138. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +3 -1
  140. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Realm.d.ts +1 -12
  142. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Realm.d.ts.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.d.ts +6 -0
  144. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js +1 -0
  146. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +2 -2
  148. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +6 -1
  150. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts +2 -1
  152. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  153. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js +2 -2
  154. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js.map +1 -1
  155. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +2 -2
  156. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  157. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +3 -1
  158. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  159. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  160. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  161. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.d.ts +2 -2
  163. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.d.ts.map +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.js +2 -2
  165. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.js.map +1 -1
  166. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.d.ts +1 -0
  167. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.d.ts.map +1 -1
  168. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.js +1 -0
  169. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.js.map +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  171. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  172. package/front_end/third_party/puppeteer/package/lib/types.d.ts +28 -3
  173. package/front_end/third_party/puppeteer/package/package.json +2 -2
  174. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +13 -1
  175. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +7 -2
  176. package/front_end/third_party/puppeteer/package/src/api/Page.ts +14 -1
  177. package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +8 -5
  178. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +5 -2
  179. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +8 -0
  180. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +11 -2
  181. package/front_end/third_party/puppeteer/package/src/cdp/BrowserContext.ts +3 -2
  182. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +5 -5
  183. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  184. package/front_end/third_party/puppeteer/package/src/util/disposable.ts +2 -2
  185. package/front_end/third_party/puppeteer/package/src/util/util.ts +1 -0
  186. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  187. package/front_end/ui/components/adorners/Adorner.ts +2 -1
  188. package/front_end/ui/components/buttons/Button.docs.ts +195 -0
  189. package/front_end/ui/components/settings/SettingCheckbox.ts +49 -14
  190. package/front_end/ui/components/settings/settingCheckbox.css +6 -1
  191. package/front_end/ui/components/spinners/Spinners.docs.ts +13 -0
  192. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +280 -0
  193. package/front_end/ui/components/text_editor/text_editor.ts +1 -0
  194. package/front_end/ui/components/tooltips/Tooltip.docs.ts +76 -0
  195. package/front_end/ui/components/tooltips/Tooltip.ts +1 -1
  196. package/front_end/ui/legacy/Dialog.ts +0 -1
  197. package/front_end/ui/legacy/FilterBar.ts +1 -2
  198. package/front_end/ui/legacy/RadioButton.docs.ts +41 -0
  199. package/front_end/ui/legacy/SelectMenu.docs.ts +98 -0
  200. package/front_end/ui/legacy/Toolbar.ts +4 -6
  201. package/front_end/ui/legacy/UIUtils.ts +114 -1
  202. package/front_end/ui/legacy/Widget.ts +62 -34
  203. package/front_end/ui/legacy/XLink.ts +0 -3
  204. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +9 -0
  205. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +125 -0
  206. package/front_end/ui/legacy/components/settings_ui/settings_ui.ts +8 -0
  207. package/front_end/ui/legacy/components/utils/Linkifier.ts +9 -3
  208. package/front_end/ui/legacy/legacy.ts +0 -2
  209. package/front_end/ui/visual_logging/KnownContextValues.ts +4 -1
  210. package/mcp/mcp.ts +5 -0
  211. package/package.json +1 -1
  212. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatterBounds.snapshot.txt +0 -4
  213. package/front_end/models/trace/lantern/testing/MetricTestUtils.ts +0 -62
  214. package/front_end/models/trace/lantern/testing/testing.ts +0 -5
  215. package/front_end/ui/components/docs/breadcrumbs_perf/initial-breadcrumb-perf.html +0 -20
  216. package/front_end/ui/components/docs/breadcrumbs_perf/initial-breadcrumb-perf.ts +0 -25
  217. package/front_end/ui/components/docs/breadcrumbs_perf/nested-breadcrumbs-perf.html +0 -20
  218. package/front_end/ui/components/docs/breadcrumbs_perf/nested-breadcrumbs-perf.ts +0 -36
  219. package/front_end/ui/components/docs/button/basic.html +0 -44
  220. package/front_end/ui/components/docs/button/basic.ts +0 -175
  221. package/front_end/ui/components/docs/radio_button/basic.html +0 -23
  222. package/front_end/ui/components/docs/radio_button/basic.ts +0 -50
  223. package/front_end/ui/components/docs/select_menu/basic.html +0 -19
  224. package/front_end/ui/components/docs/select_menu/basic.ts +0 -95
  225. package/front_end/ui/components/docs/select_menu/wide-option.html +0 -38
  226. package/front_end/ui/components/docs/select_menu/wide-option.ts +0 -43
  227. package/front_end/ui/components/docs/spinners/basic.html +0 -17
  228. package/front_end/ui/components/docs/spinners/basic.ts +0 -22
  229. package/front_end/ui/components/docs/tooltip/basic.html +0 -20
  230. package/front_end/ui/components/docs/tooltip/basic.ts +0 -82
  231. package/front_end/ui/legacy/SettingsUI.ts +0 -254
@@ -0,0 +1,125 @@
1
+ // Copyright 2014 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ /* eslint-disable @devtools/no-imperative-dom-api */
6
+
7
+ import * as Common from '../../../../core/common/common.js';
8
+ import * as i18n from '../../../../core/i18n/i18n.js';
9
+ import * as Platform from '../../../../core/platform/platform.js';
10
+ import * as Settings from '../../../components/settings/settings.js';
11
+ import * as VisualLogging from '../../../visual_logging/visual_logging.js';
12
+ import * as UI from '../../legacy.js';
13
+
14
+ const UIStrings = {
15
+ /**
16
+ * @description Note when a setting change will require the user to reload DevTools
17
+ */
18
+ srequiresReload: '*Requires reload',
19
+ /**
20
+ * @description Message to display if a setting change requires a reload of DevTools
21
+ */
22
+ oneOrMoreSettingsHaveChanged: 'One or more settings have changed which requires a reload to take effect',
23
+ } as const;
24
+ const str_ = i18n.i18n.registerUIStrings('ui/legacy/components/settings_ui/SettingsUI.ts', UIStrings);
25
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
26
+
27
+ export function createSettingCheckbox(
28
+ name: Common.UIString.LocalizedString, setting: Common.Settings.Setting<boolean>,
29
+ tooltip?: string): UI.UIUtils.CheckboxLabel {
30
+ const label = UI.UIUtils.CheckboxLabel.create(name, undefined, undefined, setting.name);
31
+ label.name = name;
32
+ UI.UIUtils.bindCheckbox(label, setting);
33
+ if (tooltip) {
34
+ UI.Tooltip.Tooltip.install(label, tooltip);
35
+ }
36
+ return label;
37
+ }
38
+
39
+ const createSettingSelect = function(
40
+ name: string, options: Common.Settings.SimpleSettingOption[], requiresReload: boolean|null,
41
+ setting: Common.Settings.Setting<unknown>, subtitle?: string): HTMLElement {
42
+ const container = document.createElement('div');
43
+ const settingSelectElement = container.createChild('p');
44
+ settingSelectElement.classList.add('settings-select');
45
+ const label = settingSelectElement.createChild('label');
46
+ const select = settingSelectElement.createChild('select');
47
+ label.textContent = name;
48
+ if (subtitle) {
49
+ container.classList.add('chrome-select-label');
50
+ label.createChild('p').textContent = subtitle;
51
+ }
52
+ select.setAttribute('jslog', `${VisualLogging.dropDown().track({change: true}).context(setting.name)}`);
53
+ UI.ARIAUtils.bindLabelToControl(label, select);
54
+
55
+ for (const option of options) {
56
+ if (option.text && typeof option.value === 'string') {
57
+ select.add(
58
+ UI.UIUtils.createOption(option.text, option.value, Platform.StringUtilities.toKebabCase(option.value)));
59
+ }
60
+ }
61
+
62
+ let reloadWarning: HTMLElement|(Element | null) = (null as Element | null);
63
+ if (requiresReload) {
64
+ reloadWarning = container.createChild('p', 'reload-warning hidden');
65
+ reloadWarning.textContent = i18nString(UIStrings.srequiresReload);
66
+ UI.ARIAUtils.markAsAlert(reloadWarning);
67
+ }
68
+
69
+ const {deprecation} = setting;
70
+ if (deprecation) {
71
+ const warning = new Settings.SettingDeprecationWarning.SettingDeprecationWarning();
72
+ warning.data = deprecation;
73
+ label.appendChild(warning);
74
+ }
75
+
76
+ setting.addChangeListener(settingChanged);
77
+ settingChanged();
78
+ select.addEventListener('change', selectChanged, false);
79
+ return container;
80
+
81
+ function settingChanged(): void {
82
+ const newValue = setting.get();
83
+ for (let i = 0; i < options.length; i++) {
84
+ if (options[i].value === newValue) {
85
+ select.selectedIndex = i;
86
+ }
87
+ }
88
+ select.disabled = setting.disabled();
89
+ }
90
+
91
+ function selectChanged(): void {
92
+ // Don't use event.target.value to avoid conversion of the value to string.
93
+ setting.set(options[select.selectedIndex].value);
94
+ if (reloadWarning) {
95
+ reloadWarning.classList.remove('hidden');
96
+ UI.InspectorView.InspectorView.instance().displayReloadRequiredWarning(
97
+ i18nString(UIStrings.oneOrMoreSettingsHaveChanged));
98
+ }
99
+ }
100
+ };
101
+
102
+ export const createControlForSetting = function(
103
+ setting: Common.Settings.Setting<unknown>, subtitle?: string): HTMLElement|null {
104
+ const uiTitle = setting.title();
105
+ switch (setting.type()) {
106
+ case Common.Settings.SettingType.BOOLEAN: {
107
+ const component = new Settings.SettingCheckbox.SettingCheckbox();
108
+ component.data = {
109
+ setting: setting as Common.Settings.Setting<boolean>,
110
+ };
111
+ component.onchange = () => {
112
+ if (setting.reloadRequired()) {
113
+ UI.InspectorView.InspectorView.instance().displayReloadRequiredWarning(
114
+ i18nString(UIStrings.oneOrMoreSettingsHaveChanged));
115
+ }
116
+ };
117
+ return component;
118
+ }
119
+ case Common.Settings.SettingType.ENUM:
120
+ return createSettingSelect(uiTitle, setting.options(), setting.reloadRequired(), setting, subtitle);
121
+ default:
122
+ console.error('Invalid setting type: ' + setting.type());
123
+ return null;
124
+ }
125
+ };
@@ -0,0 +1,8 @@
1
+
2
+ // Copyright 2025 The Chromium Authors
3
+ // Use of this source code is governed by a BSD-style license that can be
4
+ // found in the LICENSE file.
5
+
6
+ import * as SettingsUI from './SettingsUI.js';
7
+
8
+ export {SettingsUI};
@@ -919,7 +919,7 @@ export class LinkContextMenuProvider implements UI.ContextMenu.Provider<Node> {
919
919
 
920
920
  let linkHandlerSettingUIInstance: LinkHandlerSettingUI;
921
921
 
922
- export class LinkHandlerSettingUI implements UI.SettingsUI.SettingUI {
922
+ export class LinkHandlerSettingUI {
923
923
  private element: HTMLSelectElement;
924
924
 
925
925
  private constructor() {
@@ -960,8 +960,14 @@ export class LinkHandlerSettingUI implements UI.SettingsUI.SettingUI {
960
960
  Linkifier.linkHandlerSetting().set(value);
961
961
  }
962
962
 
963
- settingElement(): Element|null {
964
- return UI.SettingsUI.createCustomSetting(i18nString(UIStrings.linkHandling), this.element);
963
+ settingElement(): Element {
964
+ const p = document.createElement('p');
965
+ p.classList.add('settings-select');
966
+ const label = p.createChild('label');
967
+ label.textContent = i18nString(UIStrings.linkHandling);
968
+ UI.ARIAUtils.bindLabelToControl(label, this.element);
969
+ p.appendChild(this.element);
970
+ return p;
965
971
  }
966
972
  }
967
973
 
@@ -33,7 +33,6 @@ import * as ReportView from './ReportView.js';
33
33
  import * as ResizerWidget from './ResizerWidget.js';
34
34
  import * as RootView from './RootView.js';
35
35
  import * as SearchableView from './SearchableView.js';
36
- import * as SettingsUI from './SettingsUI.js';
37
36
  import * as ShortcutRegistry from './ShortcutRegistry.js';
38
37
  import * as SoftContextMenu from './SoftContextMenu.js';
39
38
  import * as SoftDropDown from './SoftDropDown.js';
@@ -85,7 +84,6 @@ export {
85
84
  ResizerWidget,
86
85
  RootView,
87
86
  SearchableView,
88
- SettingsUI,
89
87
  ShortcutRegistry,
90
88
  SoftContextMenu,
91
89
  SoftDropDown,
@@ -681,6 +681,7 @@ export const knownContextValues = new Set([
681
681
  'ca',
682
682
  'cache-control',
683
683
  'cache-disabled',
684
+ 'cache-disabled-documentation',
684
685
  'cache-disabled-true',
685
686
  'cache-storage',
686
687
  'cache-storage-data',
@@ -2647,6 +2648,7 @@ export const knownContextValues = new Set([
2647
2648
  'network.clear',
2648
2649
  'network.config',
2649
2650
  'network.enable-remote-file-loading',
2651
+ 'network.enable-remote-file-loading-documentation',
2650
2652
  'network.enable-request-blocking',
2651
2653
  'network.group-by-frame',
2652
2654
  'network.group-by-frame-false',
@@ -3839,7 +3841,7 @@ export const knownContextValues = new Set([
3839
3841
  'timeline.enable',
3840
3842
  'timeline.export-trace-options',
3841
3843
  'timeline.export-trace-options.annotations-checkbox',
3842
- 'timeline.export-trace-options.script-content-checkbox',
3844
+ 'timeline.export-trace-options.resource-content-checkbox',
3843
3845
  'timeline.export-trace-options.should-compress-checkbox',
3844
3846
  'timeline.export-trace-options.source-maps-checkbox',
3845
3847
  'timeline.extension',
@@ -4128,6 +4130,7 @@ export const knownContextValues = new Set([
4128
4130
  'warning',
4129
4131
  'wasm',
4130
4132
  'wasm-auto-stepping',
4133
+ 'wasm-auto-stepping-documentation',
4131
4134
  'wasm-auto-stepping-false',
4132
4135
  'watch',
4133
4136
  'watch-test-expression',
package/mcp/mcp.ts CHANGED
@@ -2,6 +2,11 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
+ /**
6
+ * IMPORTANT! Make sure that any class that is exported here has related unit
7
+ * tests added to foundation_unittests. See front_end/core/i18n/BUILD.gn as an
8
+ * example.
9
+ */
5
10
  export * as I18n from '../front_end/core/i18n/i18n.js';
6
11
  export {ConnectionTransport} from '../front_end/core/protocol_client/ConnectionTransport.js';
7
12
  export {
package/package.json CHANGED
@@ -102,5 +102,5 @@
102
102
  "flat-cache": "6.1.12"
103
103
  }
104
104
  },
105
- "version": "1.0.1536371"
105
+ "version": "1.0.1537860"
106
106
  }
@@ -1,4 +0,0 @@
1
- Title: PerformanceTraceFormatterBounds serializeBounds works
2
- Content:
3
- {min: 1, max: 2}
4
- === end content
@@ -1,62 +0,0 @@
1
- // Copyright 2024 The Chromium Authors
2
- // Use of this source code is governed by a BSD-style license that can be
3
- // found in the LICENSE file.
4
-
5
- // Unsure why this lint is failing, given `lantern/metrics/SpeedIndex.test.ts` does the same
6
- // and is fine. Maybe `*.test.*` files are excluded from this rule?
7
- // eslint-disable-next-line @devtools/es-modules-import
8
- import * as TraceLoader from '../../../../testing/TraceLoader.js';
9
- import * as Trace from '../../trace.js';
10
- import * as Lantern from '../lantern.js';
11
-
12
- function toLanternTrace(traceEvents: readonly Trace.Types.Events.Event[]): Lantern.Types.Trace {
13
- return {
14
- traceEvents: traceEvents as unknown as Lantern.Types.TraceEvent[],
15
- };
16
- }
17
-
18
- async function runTraceProcessor(context: Mocha.Suite|Mocha.Context, trace: Lantern.Types.Trace) {
19
- TraceLoader.TraceLoader.setTestTimeout(context);
20
-
21
- const processor = Trace.Processor.TraceProcessor.createWithAllHandlers();
22
- await processor.parse(trace.traceEvents as Trace.Types.Events.Event[], {isCPUProfile: false, isFreshRecording: true});
23
- if (!processor.data) {
24
- throw new Error('No data');
25
- }
26
- return processor.data;
27
- }
28
-
29
- async function getComputationDataFromFixture(context: Mocha.Suite|Mocha.Context, {trace, settings, url}: {
30
- trace: Lantern.Types.Trace,
31
- settings?: Lantern.Types.Simulation.Settings,
32
- url?: Lantern.Types.Simulation.URL,
33
- }) {
34
- settings = settings ?? {} as Lantern.Types.Simulation.Settings;
35
- if (!settings.throttlingMethod) {
36
- settings.throttlingMethod = 'simulate';
37
- }
38
- const data = await runTraceProcessor(context, trace);
39
- const requests = Trace.LanternComputationData.createNetworkRequests(trace, data);
40
- const networkAnalysis = Lantern.Core.NetworkAnalyzer.analyze(requests);
41
- if (!networkAnalysis) {
42
- throw new Error('no networkAnalysis');
43
- }
44
-
45
- const frameId = data.Meta.mainFrameId;
46
- const navigationId = data.Meta.mainFrameNavigations[0].args.data?.navigationId;
47
- if (!navigationId) {
48
- throw new Error('no navigation id found');
49
- }
50
-
51
- return {
52
- simulator: Lantern.Simulation.Simulator.createSimulator({...settings, networkAnalysis}),
53
- graph: Trace.LanternComputationData.createGraph(requests, trace, data, url),
54
- processedNavigation: Trace.LanternComputationData.createProcessedNavigation(data, frameId, navigationId),
55
- };
56
- }
57
-
58
- export {
59
- getComputationDataFromFixture,
60
- runTraceProcessor as runTrace,
61
- toLanternTrace,
62
- };
@@ -1,5 +0,0 @@
1
- // Copyright 2024 The Chromium Authors
2
- // Use of this source code is governed by a BSD-style license that can be
3
- // found in the LICENSE file.
4
-
5
- export * from './MetricTestUtils.js';
@@ -1,20 +0,0 @@
1
- <!--
2
- Copyright 2020 The Chromium Authors
3
- Use of this source code is governed by a BSD-style license that can be
4
- found in the LICENSE file.
5
- -->
6
- <!DOCTYPE html>
7
- <html>
8
- <head>
9
- <meta charset="UTF-8" />
10
- <meta name="viewport" content="width=device-width" />
11
- <title>Breadcrumb example</title>
12
- </head>
13
- <body>
14
-
15
- <div id="container">
16
- </div>
17
-
18
- <script type="module" src="./initial-breadcrumb-perf.js"></script>
19
- </body>
20
- </html>
@@ -1,25 +0,0 @@
1
- // Copyright 2023 The Chromium Authors
2
- // Use of this source code is governed by a BSD-style license that can be
3
- // found in the LICENSE file.
4
-
5
- import * as Trace from '../../../../../front_end/models/trace/trace.js';
6
- import * as TimelineComponents from '../../../../../front_end/panels/timeline/components/components.js';
7
-
8
- const breadcrumbsUI = new TimelineComponents.BreadcrumbsUI.BreadcrumbsUI();
9
- document.getElementById('container')?.appendChild(breadcrumbsUI);
10
-
11
- const traceWindow: Trace.Types.Timing.TraceWindowMicro = {
12
- min: Trace.Types.Timing.Micro(3),
13
- max: Trace.Types.Timing.Micro(9),
14
- range: Trace.Types.Timing.Micro(6),
15
- };
16
-
17
- const breadcrumb: Trace.Types.File.Breadcrumb = {
18
- window: traceWindow,
19
- child: null,
20
- };
21
-
22
- breadcrumbsUI.data = {
23
- initialBreadcrumb: breadcrumb,
24
- activeBreadcrumb: breadcrumb,
25
- };
@@ -1,20 +0,0 @@
1
- <!--
2
- Copyright 2020 The Chromium Authors
3
- Use of this source code is governed by a BSD-style license that can be
4
- found in the LICENSE file.
5
- -->
6
- <!DOCTYPE html>
7
- <html>
8
- <head>
9
- <meta charset="UTF-8" />
10
- <meta name="viewport" content="width=device-width" />
11
- <title>Breadcrumb example</title>
12
- </head>
13
- <body>
14
-
15
- <div id="container">
16
- </div>
17
-
18
- <script type="module" src="./nested-breadcrumbs-perf.js"></script>
19
- </body>
20
- </html>
@@ -1,36 +0,0 @@
1
- // Copyright 2023 The Chromium Authors
2
- // Use of this source code is governed by a BSD-style license that can be
3
- // found in the LICENSE file.
4
-
5
- import * as Trace from '../../../../../front_end/models/trace/trace.js';
6
- import * as TimelineComponents from '../../../../../front_end/panels/timeline/components/components.js';
7
-
8
- const breadcrumbsUI = new TimelineComponents.BreadcrumbsUI.BreadcrumbsUI();
9
- document.getElementById('container')?.appendChild(breadcrumbsUI);
10
-
11
- const traceWindow2: Trace.Types.Timing.TraceWindowMicro = {
12
- min: Trace.Types.Timing.Micro(4),
13
- max: Trace.Types.Timing.Micro(8),
14
- range: Trace.Types.Timing.Micro(4),
15
- };
16
-
17
- const traceWindow: Trace.Types.Timing.TraceWindowMicro = {
18
- min: Trace.Types.Timing.Micro(3),
19
- max: Trace.Types.Timing.Micro(9),
20
- range: Trace.Types.Timing.Micro(6),
21
- };
22
-
23
- const breadcrumb2: Trace.Types.File.Breadcrumb = {
24
- window: traceWindow2,
25
- child: null,
26
- };
27
-
28
- const breadcrumb: Trace.Types.File.Breadcrumb = {
29
- window: traceWindow,
30
- child: breadcrumb2,
31
- };
32
-
33
- breadcrumbsUI.data = {
34
- initialBreadcrumb: breadcrumb,
35
- activeBreadcrumb: breadcrumb,
36
- };
@@ -1,44 +0,0 @@
1
- <!--
2
- Copyright 2021 The Chromium Authors
3
- Use of this source code is governed by a BSD-style license that can be
4
- found in the LICENSE file.
5
- -->
6
- <!DOCTYPE html>
7
- <html>
8
- <head>
9
- <meta charset="UTF-8" />
10
- <meta name="viewport" content="width=device-width" />
11
- <title>Button example</title>
12
- <style>
13
- body {
14
- overflow: auto !important; /* stylelint-disable-line declaration-no-important */
15
- }
16
-
17
- div {
18
- width: 500px;
19
- padding: 25px;
20
- display: flex;
21
- align-items: center;
22
- flex-wrap: wrap;
23
- gap: 10px;
24
- }
25
- </style>
26
- </head>
27
- <body>
28
- <header>Buttons</header>
29
- <div id="buttons"></div>
30
- <header>Primary buttons</header>
31
- <div id="primary-buttons"></div>
32
- <header>Tonal buttons</header>
33
- <div id="tonal-buttons"></div>
34
- <header>Outlined buttons</header>
35
- <div id="outlined-buttons"></div>
36
- <header>Text buttons</header>
37
- <div id="text-buttons"></div>
38
- <header>Icon buttons</header>
39
- <div id="icon-buttons"></div>
40
- <header>Floating buttons</header>
41
- <div id="floating-buttons"></div>
42
- <script type="module" src="./basic.js"></script>
43
- </body>
44
- </html>
@@ -1,175 +0,0 @@
1
- // Copyright 2021 The Chromium Authors
2
- // Use of this source code is governed by a BSD-style license that can be
3
- // found in the LICENSE file.
4
-
5
- import * as FrontendHelpers from '../../../../testing/EnvironmentHelpers.js';
6
- import * as Buttons from '../../buttons/buttons.js';
7
- import * as ComponentHelpers from '../../helpers/helpers.js';
8
-
9
- await ComponentHelpers.ComponentServerSetup.setup();
10
- await FrontendHelpers.initializeGlobalVars();
11
-
12
- const BUTTONS_SECTION = '#buttons';
13
- const PRIMARY_SECTION = '#primary-buttons';
14
- const TONAL_SECTION = '#tonal-buttons';
15
- const OUTLINED_SECTION = '#outlined-buttons';
16
- const TEXT_SECTION = '#text-buttons';
17
- const ICON_SECTION = '#icon-buttons';
18
- const FLOATING_SECTION = '#floating-buttons';
19
-
20
- const DEFAULT_TEXT = 'Default';
21
- const WITH_ICON_TEXT = 'With icon';
22
- const MICRO_TEXT = 'Micro';
23
-
24
- function append(section: string, element: HTMLElement): void {
25
- document.querySelector(section)?.appendChild(element);
26
- }
27
-
28
- // Buttons
29
- {
30
- const primaryButton = new Buttons.Button.Button();
31
- primaryButton.data = {
32
- variant: Buttons.Button.Variant.PRIMARY,
33
- };
34
- primaryButton.innerText = 'Primary button';
35
- append(BUTTONS_SECTION, primaryButton);
36
-
37
- const tonalButton = new Buttons.Button.Button();
38
- tonalButton.data = {
39
- variant: Buttons.Button.Variant.TONAL,
40
- };
41
- tonalButton.innerText = 'Tonal button';
42
- append(BUTTONS_SECTION, tonalButton);
43
-
44
- const outlinedButton = new Buttons.Button.Button();
45
- outlinedButton.data = {
46
- variant: Buttons.Button.Variant.OUTLINED,
47
- };
48
- outlinedButton.innerText = 'Outlined button';
49
- append(BUTTONS_SECTION, outlinedButton);
50
-
51
- const textButton = new Buttons.Button.Button();
52
- textButton.data = {
53
- variant: Buttons.Button.Variant.TEXT,
54
- };
55
- textButton.innerText = 'Text button';
56
- append(BUTTONS_SECTION, textButton);
57
-
58
- const iconButton = new Buttons.Button.Button();
59
- iconButton.data = {
60
- variant: Buttons.Button.Variant.ICON,
61
- iconName: 'gear',
62
- };
63
- append(BUTTONS_SECTION, iconButton);
64
- }
65
-
66
- // Primary buttons
67
- {
68
- const primaryDefault = new Buttons.Button.Button();
69
- primaryDefault.data = {
70
- variant: Buttons.Button.Variant.PRIMARY,
71
- };
72
- primaryDefault.innerText = DEFAULT_TEXT;
73
- append(PRIMARY_SECTION, primaryDefault);
74
-
75
- const primaryWithIcon = new Buttons.Button.Button();
76
- primaryWithIcon.innerText = WITH_ICON_TEXT;
77
- primaryWithIcon.data = {
78
- variant: Buttons.Button.Variant.PRIMARY,
79
- iconName: 'plus',
80
- };
81
- append(PRIMARY_SECTION, primaryWithIcon);
82
- }
83
-
84
- // Tonal buttons
85
- {
86
- const tonalDefault = new Buttons.Button.Button();
87
- tonalDefault.data = {
88
- variant: Buttons.Button.Variant.TONAL,
89
- };
90
- tonalDefault.innerText = DEFAULT_TEXT;
91
- append(TONAL_SECTION, tonalDefault);
92
-
93
- const tonalWithIcon = new Buttons.Button.Button();
94
- tonalWithIcon.innerText = WITH_ICON_TEXT;
95
-
96
- tonalWithIcon.data = {
97
- variant: Buttons.Button.Variant.PRIMARY,
98
- iconName: 'plus',
99
- };
100
- append(TONAL_SECTION, tonalWithIcon);
101
- }
102
-
103
- // Outlined buttons
104
- {
105
- const outlinedDefault = new Buttons.Button.Button();
106
- outlinedDefault.data = {
107
- variant: Buttons.Button.Variant.OUTLINED,
108
- };
109
- outlinedDefault.innerText = DEFAULT_TEXT;
110
- append(OUTLINED_SECTION, outlinedDefault);
111
-
112
- const outlinedWithIcon = new Buttons.Button.Button();
113
- outlinedWithIcon.innerText = WITH_ICON_TEXT;
114
- outlinedWithIcon.data = {
115
- variant: Buttons.Button.Variant.OUTLINED,
116
- iconName: 'plus',
117
- };
118
- append(OUTLINED_SECTION, outlinedWithIcon);
119
-
120
- const outlinedMicro = new Buttons.Button.Button();
121
- outlinedMicro.innerText = MICRO_TEXT;
122
- outlinedMicro.data = {
123
- variant: Buttons.Button.Variant.OUTLINED,
124
- size: Buttons.Button.Size.MICRO,
125
- };
126
- append(OUTLINED_SECTION, outlinedMicro);
127
- }
128
-
129
- // Text buttons
130
- {
131
- const textDefault = new Buttons.Button.Button();
132
- textDefault.innerText = DEFAULT_TEXT;
133
- textDefault.data = {
134
- variant: Buttons.Button.Variant.TEXT,
135
- };
136
- append(TEXT_SECTION, textDefault);
137
-
138
- const textWithIcon = new Buttons.Button.Button();
139
- textWithIcon.innerText = WITH_ICON_TEXT;
140
-
141
- textWithIcon.data = {
142
- variant: Buttons.Button.Variant.TEXT,
143
- iconName: 'plus',
144
- };
145
- append(TEXT_SECTION, textWithIcon);
146
- }
147
-
148
- // Icon buttons
149
- {
150
- const iconDefault = new Buttons.Button.Button();
151
- iconDefault.data = {
152
- variant: Buttons.Button.Variant.ICON,
153
- iconName: 'gear',
154
- };
155
- append(ICON_SECTION, iconDefault);
156
-
157
- const iconToggle = new Buttons.Button.Button();
158
- iconToggle.data = {
159
- variant: Buttons.Button.Variant.ICON_TOGGLE,
160
- iconName: 'gear',
161
- toggledIconName: 'gear',
162
- toggled: true,
163
- toggleType: Buttons.Button.ToggleType.PRIMARY,
164
- };
165
- const toggledWithLabel = document.createElement('span');
166
- toggledWithLabel.textContent = '(Toggle)';
167
- append(ICON_SECTION, iconToggle);
168
- append(ICON_SECTION, toggledWithLabel);
169
- }
170
-
171
- // Floating buttons
172
- {
173
- const floatingButton = Buttons.FloatingButton.create('smart-assistant', 'Ask AI!');
174
- append(FLOATING_SECTION, floatingButton);
175
- }
@@ -1,23 +0,0 @@
1
- <!--
2
- Copyright 2024 The Chromium Authors
3
- Use of this source code is governed by a BSD-style license that can be
4
- found in the LICENSE file.
5
- -->
6
- <!DOCTYPE html>
7
- <html>
8
- <head>
9
- <meta charset="UTF-8" />
10
- <meta name="viewport" content="width=device-width" />
11
- <title>Basic Radio Button example</title>
12
- </head>
13
- <body>
14
-
15
- <div id="container">
16
- </div>
17
-
18
- <script type="module" src="./basic.js"></script>
19
- <style>
20
- fieldset { label { display: block; } }
21
- </style>
22
- </body>
23
- </html>