chrome-devtools-frontend 1.0.1539728 → 1.0.1541169

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 (196) hide show
  1. package/eslint.config.mjs +167 -151
  2. package/front_end/core/common/Debouncer.ts +2 -2
  3. package/front_end/core/common/Gzip.ts +1 -1
  4. package/front_end/core/common/Revealer.ts +5 -0
  5. package/front_end/core/common/Throttler.ts +3 -3
  6. package/front_end/core/host/GdpClient.ts +4 -0
  7. package/front_end/core/host/InspectorFrontendHost.ts +10 -10
  8. package/front_end/core/protocol_client/DevToolsCDPConnection.ts +181 -0
  9. package/front_end/core/protocol_client/InspectorBackend.ts +36 -203
  10. package/front_end/core/protocol_client/protocol_client.ts +2 -2
  11. package/front_end/core/sdk/DebuggerModel.ts +3 -16
  12. package/front_end/core/sdk/NetworkManager.ts +16 -11
  13. package/front_end/core/sdk/RemoteObject.ts +4 -0
  14. package/front_end/core/sdk/Target.ts +3 -6
  15. package/front_end/core/sdk/TargetManager.ts +1 -2
  16. package/front_end/core/sdk/sdk-meta.ts +0 -35
  17. package/front_end/entrypoints/lighthouse_worker/LighthouseWorkerService.ts +1 -3
  18. package/front_end/entrypoints/node_app/app/NodeMain.ts +3 -2
  19. package/front_end/entrypoints/shell/shell.ts +1 -0
  20. package/front_end/entrypoints/trace_app/trace_app.ts +1 -0
  21. package/front_end/generated/Deprecation.ts +8 -0
  22. package/front_end/generated/InspectorBackendCommands.ts +8 -5
  23. package/front_end/generated/SupportedCSSProperties.js +58 -4
  24. package/front_end/generated/protocol.ts +60 -4
  25. package/front_end/models/ai_assistance/EvaluateAction.ts +88 -5
  26. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +121 -56
  27. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +104 -62
  28. package/front_end/models/ai_assistance/injected.ts +15 -2
  29. package/front_end/models/ai_assistance/performance/AIQueries.ts +56 -2
  30. package/front_end/{panels/issues → models/issues_manager}/IssueAggregator.ts +83 -65
  31. package/front_end/models/issues_manager/issues_manager.ts +2 -0
  32. package/front_end/models/live-metrics/web-vitals-injected/README.md +1 -1
  33. package/front_end/models/trace/Processor.ts +5 -4
  34. package/front_end/models/trace/Styles.ts +1 -1
  35. package/front_end/models/trace/insights/types.ts +1 -1
  36. package/front_end/models/trace/types/TraceEvents.ts +1 -1
  37. package/front_end/models/workspace/IgnoreListManager.ts +41 -47
  38. package/front_end/models/workspace/workspace-meta.ts +40 -0
  39. package/front_end/panels/ai_assistance/PatchWidget.ts +22 -12
  40. package/front_end/panels/ai_assistance/components/ChatView.ts +1 -1
  41. package/front_end/panels/animation/AnimationTimeline.ts +4 -4
  42. package/front_end/panels/animation/AnimationUI.ts +28 -34
  43. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +4 -4
  44. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +2 -2
  45. package/front_end/panels/elements/ElementsTreeElement.ts +37 -9
  46. package/front_end/panels/elements/LayoutPane.ts +2 -2
  47. package/front_end/panels/elements/PropertiesWidget.ts +3 -2
  48. package/front_end/panels/elements/components/AdornerManager.ts +9 -9
  49. package/front_end/panels/elements/layoutPane.css +5 -9
  50. package/front_end/panels/event_listeners/EventListenersView.ts +10 -6
  51. package/front_end/panels/explain/components/ConsoleInsight.ts +498 -449
  52. package/front_end/panels/issues/AffectedResourcesView.ts +3 -4
  53. package/front_end/panels/issues/CorsIssueDetailsView.ts +1 -2
  54. package/front_end/panels/issues/IssueView.ts +1 -1
  55. package/front_end/panels/issues/IssuesPane.ts +12 -15
  56. package/front_end/panels/issues/issues.ts +0 -2
  57. package/front_end/panels/lighthouse/LighthouseProtocolService.ts +3 -3
  58. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +2 -2
  59. package/front_end/panels/network/NetworkDataGridNode.ts +2 -1
  60. package/front_end/panels/network/RequestConditionsDrawer.ts +149 -46
  61. package/front_end/panels/network/RequestPayloadView.ts +2 -1
  62. package/front_end/panels/network/RequestTimingView.ts +17 -10
  63. package/front_end/panels/network/components/RequestHeadersView.ts +24 -17
  64. package/front_end/panels/network/network-meta.ts +11 -0
  65. package/front_end/panels/protocol_monitor/JSONEditor.ts +2 -2
  66. package/front_end/panels/recorder/RecorderController.ts +6 -7
  67. package/front_end/panels/recorder/models/RecordingPlayer.ts +3 -3
  68. package/front_end/panels/settings/components/SyncSection.ts +1 -1
  69. package/front_end/panels/settings/emulation/components/userAgentClientHintsForm.css +1 -1
  70. package/front_end/panels/sources/BreakpointsView.ts +3 -3
  71. package/front_end/panels/sources/DebuggerPlugin.ts +1 -1
  72. package/front_end/panels/sources/ScopeChainSidebarPane.ts +4 -3
  73. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +4 -3
  74. package/front_end/panels/sources/breakpointsView.css +1 -1
  75. package/front_end/panels/sources/sourcesPanel.css +2 -2
  76. package/front_end/panels/timeline/TimelineFlameChartView.ts +3 -3
  77. package/front_end/panels/timeline/TimelinePanel.ts +3 -3
  78. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +9 -5
  79. package/front_end/panels/timeline/components/LayoutShiftDetails.ts +16 -10
  80. package/front_end/panels/timeline/components/LiveMetricsView.ts +20 -9
  81. package/front_end/panels/timeline/components/MetricCard.ts +4 -2
  82. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +2 -0
  83. package/front_end/services/puppeteer/PuppeteerConnection.ts +2 -1
  84. package/front_end/third_party/chromium/README.chromium +1 -1
  85. package/front_end/third_party/puppeteer/README.chromium +2 -2
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +5 -0
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  89. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +1 -0
  90. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  91. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +3 -0
  92. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  93. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +1 -0
  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 +21 -0
  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/ExtensionTransport.d.ts.map +1 -1
  98. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ExtensionTransport.js +5 -1
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ExtensionTransport.js.map +1 -1
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +1 -0
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +6 -0
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.d.ts +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.js +29 -27
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/TargetManager.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +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/version.d.ts +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +5 -0
  113. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +61 -26
  114. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +5 -0
  115. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +1 -0
  118. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +3 -0
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +1 -0
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +21 -0
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ExtensionTransport.d.ts.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ExtensionTransport.js +5 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ExtensionTransport.js.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +1 -0
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +6 -0
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.d.ts +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.js +30 -28
  135. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/TargetManager.js.map +1 -1
  136. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  138. package/front_end/third_party/puppeteer/package/lib/types.d.ts +5 -0
  139. package/front_end/third_party/puppeteer/package/package.json +1 -1
  140. package/front_end/third_party/puppeteer/package/src/api/Page.ts +6 -0
  141. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +4 -0
  142. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +32 -0
  143. package/front_end/third_party/puppeteer/package/src/cdp/ExtensionTransport.ts +5 -1
  144. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +8 -0
  145. package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +36 -43
  146. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  147. package/front_end/ui/components/dialogs/ButtonDialog.ts +15 -5
  148. package/front_end/ui/components/expandable_list/ExpandableList.ts +1 -1
  149. package/front_end/ui/components/helpers/helpers.ts +0 -2
  150. package/front_end/ui/components/markdown_view/MarkdownView.ts +1 -0
  151. package/front_end/ui/components/menus/Menu.ts +5 -3
  152. package/front_end/ui/components/snackbars/Snackbars.docs.ts +46 -0
  153. package/front_end/ui/components/survey_link/SurveyLink.docs.ts +22 -0
  154. package/front_end/ui/components/tree_outline/TreeOutline.ts +1 -2
  155. package/front_end/ui/{components/docs/context_menu/basic.ts → legacy/ContextMenu.docs.ts} +58 -25
  156. package/front_end/ui/legacy/SelectMenu.docs.ts +14 -0
  157. package/front_end/ui/legacy/UIUtils.ts +2 -1
  158. package/front_end/ui/legacy/components/inline_editor/BezierEditor.ts +1 -1
  159. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +3 -1
  160. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +558 -439
  161. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +3 -3
  162. package/front_end/ui/legacy/components/perf_ui/pieChart.css +1 -1
  163. package/front_end/ui/legacy/components/utils/Linkifier.ts +1 -1
  164. package/front_end/ui/legacy/inspectorCommon.css +3 -2
  165. package/mcp/mcp.ts +15 -1
  166. package/package.json +2 -1
  167. package/front_end/core/protocol_client/NodeURL.ts +0 -40
  168. package/front_end/ui/components/docs/combo_box/basic.html +0 -20
  169. package/front_end/ui/components/docs/combo_box/basic.ts +0 -49
  170. package/front_end/ui/components/docs/context_menu/basic.html +0 -45
  171. package/front_end/ui/components/docs/legacy_color_invert/basic.html +0 -77
  172. package/front_end/ui/components/docs/legacy_color_invert/basic.ts +0 -98
  173. package/front_end/ui/components/docs/linkifier/simple-url.html +0 -25
  174. package/front_end/ui/components/docs/linkifier/simple-url.ts +0 -25
  175. package/front_end/ui/components/docs/panel_feedback/basic.html +0 -25
  176. package/front_end/ui/components/docs/panel_feedback/basic.ts +0 -21
  177. package/front_end/ui/components/docs/panel_feedback/button.html +0 -25
  178. package/front_end/ui/components/docs/panel_feedback/button.ts +0 -19
  179. package/front_end/ui/components/docs/panel_introduction_steps/basic.html +0 -25
  180. package/front_end/ui/components/docs/panel_introduction_steps/basic.ts +0 -28
  181. package/front_end/ui/components/docs/perf_piechart/basic-with-legend.html +0 -20
  182. package/front_end/ui/components/docs/perf_piechart/basic-with-legend.ts +0 -20
  183. package/front_end/ui/components/docs/perf_piechart/basic-without-legend.html +0 -20
  184. package/front_end/ui/components/docs/perf_piechart/basic-without-legend.ts +0 -18
  185. package/front_end/ui/components/docs/snackbars/basic.html +0 -17
  186. package/front_end/ui/components/docs/snackbars/basic.ts +0 -50
  187. package/front_end/ui/components/docs/survey_link/basic.html +0 -20
  188. package/front_end/ui/components/docs/survey_link/basic.ts +0 -28
  189. package/front_end/ui/components/docs/tree_outline/basic.html +0 -33
  190. package/front_end/ui/components/docs/tree_outline/basic.ts +0 -38
  191. package/front_end/ui/components/docs/tree_outline/custom-renderers.html +0 -32
  192. package/front_end/ui/components/docs/tree_outline/custom-renderers.ts +0 -61
  193. package/front_end/ui/components/docs/tree_outline/lazy-children.html +0 -32
  194. package/front_end/ui/components/docs/tree_outline/lazy-children.ts +0 -91
  195. package/front_end/ui/components/docs/tree_outline/sample-data.ts +0 -67
  196. package/front_end/ui/components/helpers/directives.ts +0 -38
@@ -0,0 +1,22 @@
1
+ // Copyright 2020 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 Common from '../../../core/common/common.js';
6
+ import {SurveyLink} from '../survey_link/survey_link.js';
7
+
8
+ export function render(container: HTMLElement): void {
9
+ const link = new SurveyLink.SurveyLink();
10
+ container.appendChild(link);
11
+
12
+ link.data = {
13
+ trigger: 'test trigger',
14
+ promptText: Common.UIString.LocalizedEmptyString,
15
+ canShowSurvey: (_trigger, callback) => {
16
+ setTimeout(callback.bind(undefined, {canShowSurvey: true}), 500);
17
+ },
18
+ showSurvey: (_trigger, callback) => {
19
+ setTimeout(callback.bind(undefined, {surveyShown: true}), 1500);
20
+ },
21
+ };
22
+ }
@@ -9,7 +9,6 @@ import * as Lit from '../../lit/lit.js';
9
9
  import * as VisualLogging from '../../visual_logging/visual_logging.js';
10
10
  import * as Buttons from '../buttons/buttons.js';
11
11
  import * as CodeHighlighter from '../code_highlighter/code_highlighter.js';
12
- import * as ComponentHelpers from '../helpers/helpers.js';
13
12
  import * as RenderCoordinator from '../render_coordinator/render_coordinator.js';
14
13
 
15
14
  import treeOutlineStyles from './treeOutline.css.js';
@@ -479,7 +478,7 @@ export class TreeOutline<TreeNodeDataType> extends HTMLElement {
479
478
  jslog=${VisualLogging.treeItem(node.jslogContext).track({click: true, keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter|Space|Home|End'})}
480
479
  @click=${this.#onNodeClick}
481
480
  track-dom-node-to-tree-node=${trackDOMNodeToTreeNode(this.#domNodeToTreeNodeMap, node)}
482
- on-render=${ComponentHelpers.Directives.nodeRenderedCallback(domNode => {
481
+ ${Lit.Directives.ref(domNode => {
483
482
  /**
484
483
  * Because TreeNodes are lazily rendered, you can call
485
484
  * `outline.expandToAndSelect(NodeX)`, but `NodeX` will be rendered at some
@@ -2,23 +2,44 @@
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
- import * as FrontendHelpers from '../../../../testing/EnvironmentHelpers.js';
6
- import * as UI from '../../../legacy/legacy.js';
7
- import * as Lit from '../../../lit/lit.js';
8
- import * as ComponentHelpers from '../../helpers/helpers.js';
5
+ import * as Lit from '../lit/lit.js';
6
+
7
+ import {ContextMenu} from './legacy.js';
9
8
 
10
9
  const {html} = Lit;
11
10
 
12
- await ComponentHelpers.ComponentServerSetup.setup();
13
- await FrontendHelpers.initializeGlobalVars();
11
+ export async function render(container: HTMLElement) {
12
+ const style = document.createElement('style');
13
+ style.textContent = `
14
+ #container > div {
15
+ width: var(--sys-size-34);
16
+ padding: var(--sys-size-11);
17
+ display: flex;
18
+ align-items: center;
19
+ flex-wrap: wrap;
20
+ gap: var(--sys-size-5);
21
+ background-color: var(--sys-color-neutral-container);
22
+ border-radius: var(--sys-shape-corner-medium);
23
+ text-align: center;
24
+
25
+ p {
26
+ vertical-align: middle;
27
+ }
28
+ }
29
+ `;
30
+ container.appendChild(style);
31
+
32
+ const menuButtonSection = document.createElement('div');
33
+ const menuButtonHeader = document.createElement('header');
34
+ menuButtonHeader.textContent = 'DevTools menu button (lit-html)';
35
+ container.appendChild(menuButtonHeader);
36
+ container.appendChild(menuButtonSection);
14
37
 
15
- {
16
- const menuButtonSection = document.querySelector('#menu-button') as HTMLElement;
17
38
  Lit.render(
18
39
  html`
19
40
  <devtools-menu-button
20
41
  icon-name="bin"
21
- .populateMenuCall=${(menu: UI.ContextMenu.ContextMenu) => {
42
+ .populateMenuCall=${(menu: ContextMenu.ContextMenu) => {
22
43
  menu.defaultSection().appendItem('Item', () => {
23
44
  alert('Item clicked');
24
45
  }, {jslogContext: 'item'});
@@ -27,15 +48,19 @@ await FrontendHelpers.initializeGlobalVars();
27
48
  ></devtools-menu-button>
28
49
  `,
29
50
  menuButtonSection);
30
- }
31
51
 
32
- {
52
+ const simpleItemsSection = document.createElement('div');
53
+ simpleItemsSection.innerHTML = '<p>Right-click here</p>';
54
+ const simpleItemsHeader = document.createElement('header');
55
+ simpleItemsHeader.textContent = 'Various simple menu items (imperative API)';
56
+ container.appendChild(simpleItemsHeader);
57
+ container.appendChild(simpleItemsSection);
58
+
33
59
  let checked = true;
34
- const simpleItemMenuSection = document.querySelector('#simple-items');
35
- simpleItemMenuSection?.addEventListener('contextmenu', onSimpleMenu.bind(this));
60
+ simpleItemsSection.addEventListener('contextmenu', onSimpleMenu);
36
61
 
37
62
  function onSimpleMenu(event: Event) {
38
- const simpleMenu = new UI.ContextMenu.ContextMenu(event);
63
+ const simpleMenu = new ContextMenu.ContextMenu(event);
39
64
 
40
65
  // Regular item
41
66
  simpleMenu.defaultSection().appendItem('Regular item', () => {
@@ -63,14 +88,18 @@ await FrontendHelpers.initializeGlobalVars();
63
88
 
64
89
  void simpleMenu.show();
65
90
  }
66
- }
67
91
 
68
- {
69
- const customSectionMenuSection = document.querySelector('#custom-section');
70
- customSectionMenuSection?.addEventListener('contextmenu', onCustomSectionMenu.bind(this));
92
+ const customSection = document.createElement('div');
93
+ customSection.innerHTML = '<p>Right-click here</p>';
94
+ const customSectionHeader = document.createElement('header');
95
+ customSectionHeader.textContent = 'Custom sections (imperative API)';
96
+ container.appendChild(customSectionHeader);
97
+ container.appendChild(customSection);
98
+
99
+ customSection.addEventListener('contextmenu', onCustomSectionMenu);
71
100
 
72
101
  function onCustomSectionMenu(event: Event) {
73
- const customSectionMenu = new UI.ContextMenu.ContextMenu(event);
102
+ const customSectionMenu = new ContextMenu.ContextMenu(event);
74
103
 
75
104
  // First custom section
76
105
  const customSection = customSectionMenu.section('Custom section');
@@ -83,14 +112,18 @@ await FrontendHelpers.initializeGlobalVars();
83
112
 
84
113
  void customSectionMenu.show();
85
114
  }
86
- }
87
115
 
88
- {
89
- const subMenuSection = document.querySelector('#sub-menu');
90
- subMenuSection?.addEventListener('contextmenu', onCustomSectionMenu.bind(this));
116
+ const subMenuSection = document.createElement('div');
117
+ subMenuSection.innerHTML = '<p>Right-click here</p>';
118
+ const subMenuHeader = document.createElement('header');
119
+ subMenuHeader.textContent = 'Sub menu (imperative API)';
120
+ container.appendChild(subMenuHeader);
121
+ container.appendChild(subMenuSection);
91
122
 
92
- function onCustomSectionMenu(event: Event) {
93
- const subMenuMenu = new UI.ContextMenu.ContextMenu(event);
123
+ subMenuSection.addEventListener('contextmenu', onSubMenu);
124
+
125
+ function onSubMenu(event: Event) {
126
+ const subMenuMenu = new ContextMenu.ContextMenu(event);
94
127
 
95
128
  const subMenu =
96
129
  subMenuMenu.defaultSection().appendSubMenuItem('Item to open sub menu', /* disabled */ false, 'my-sub-menu');
@@ -51,6 +51,20 @@ export async function render(container: HTMLElement) {
51
51
  simpleMenuHTML);
52
52
  }
53
53
 
54
+ {
55
+ const disabledMenuHTML = createDivWithP('Disabled select with lit-html');
56
+ // clang-format off
57
+ Lit.render(
58
+ html`<select disabled aria-label="Select an option" @change=${onChange}>
59
+ <option hidden>Select an option</option>
60
+ <option jslog=${VisualLogging.item('option-1').track({
61
+ click: true
62
+ })} value="Option1">Option 1</option>
63
+ </select>`,
64
+ disabledMenuHTML);
65
+ // clang-format on
66
+ }
67
+
54
68
  {
55
69
  const groupMenuHTML = createDivWithP('Select with groups with lit-html');
56
70
  Lit.render(
@@ -1820,7 +1820,8 @@ export const isScrolledToBottom = (element: Element): boolean => {
1820
1820
  return Math.abs(element.scrollTop + element.clientHeight - element.scrollHeight) <= 2;
1821
1821
  };
1822
1822
 
1823
- export function createSVGChild(element: Element, childType: string, className?: string): Element {
1823
+ export function createSVGChild<K extends keyof SVGElementTagNameMap>(
1824
+ element: Element, childType: K, className?: string): SVGElementTagNameMap[K] {
1824
1825
  const child = element.ownerDocument.createElementNS('http://www.w3.org/2000/svg', childType);
1825
1826
  if (className) {
1826
1827
  child.setAttribute('class', className);
@@ -147,7 +147,7 @@ export class BezierEditor extends Common.ObjectWrapper.eventMixin<EventTypes, ty
147
147
  return category;
148
148
  }
149
149
 
150
- private createPresetModifyIcon(parentElement: Element, className: string, drawPath: string): Element {
150
+ private createPresetModifyIcon(parentElement: Element, className: string, drawPath: string): SVGElement {
151
151
  const icon = UI.UIUtils.createSVGChild(parentElement, 'svg', 'bezier-preset-modify ' + className);
152
152
  icon.setAttribute('width', '20');
153
153
  icon.setAttribute('height', '20');
@@ -15,6 +15,7 @@ import {
15
15
  ObjectPropertiesSection,
16
16
  ObjectPropertiesSectionsTreeOutline,
17
17
  ObjectPropertyTreeElement,
18
+ ObjectTree,
18
19
  } from './ObjectPropertiesSection.js';
19
20
 
20
21
  const UIStrings = {
@@ -169,7 +170,8 @@ export class CustomPreviewSection {
169
170
  this.defaultBodyTreeOutline = new ObjectPropertiesSectionsTreeOutline({readOnly: true});
170
171
  this.defaultBodyTreeOutline.setShowSelectionOnKeyboardFocus(/* show */ true, /* preventTabOrder */ false);
171
172
  this.defaultBodyTreeOutline.element.classList.add('custom-expandable-section-default-body');
172
- void ObjectPropertyTreeElement.populate(this.defaultBodyTreeOutline.rootElement(), this.object, false, false);
173
+ void ObjectPropertyTreeElement.populate(
174
+ this.defaultBodyTreeOutline.rootElement(), new ObjectTree(this.object), false, false);
173
175
 
174
176
  this.cachedContent = this.defaultBodyTreeOutline.element;
175
177
  } else {