chrome-devtools-frontend 1.0.1578729 → 1.0.1579812

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 (72) hide show
  1. package/docs/cookbook/devtools_on_devtools.md +2 -2
  2. package/docs/feature-specs/elements-gutter-decorators.md +40 -0
  3. package/docs/feature-specs/elements-tree-selection-and-hover.md +31 -0
  4. package/docs/feature-specs/images/elements-gutter-decorators-multiple.png +0 -0
  5. package/docs/get_the_code.md +3 -3
  6. package/front_end/generated/ARIAProperties.js +0 -6
  7. package/front_end/generated/InspectorBackendCommands.ts +1 -1
  8. package/front_end/generated/protocol.ts +1 -0
  9. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.snapshot.txt +30 -0
  10. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +79 -0
  11. package/front_end/models/javascript_metadata/NativeFunctions.js +4 -0
  12. package/front_end/panels/accessibility/AXBreadcrumbsPane.ts +5 -3
  13. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +18 -4
  14. package/front_end/panels/ai_assistance/components/ChatInput.ts +38 -18
  15. package/front_end/panels/ai_assistance/components/ChatMessage.ts +7 -4
  16. package/front_end/panels/ai_assistance/components/ChatView.ts +2 -0
  17. package/front_end/panels/ai_assistance/components/chatInput.css +10 -3
  18. package/front_end/panels/animation/AnimationGroupPreviewUI.ts +1 -1
  19. package/front_end/panels/application/DeviceBoundSessionsView.ts +51 -76
  20. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +1 -0
  21. package/front_end/panels/application/components/BackForwardCacheView.ts +4 -2
  22. package/front_end/panels/autofill/AutofillView.ts +1 -1
  23. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +1 -0
  24. package/front_end/panels/common/AiCodeGenerationTeaser.ts +2 -2
  25. package/front_end/panels/common/AiCodeGenerationUpgradeDialog.ts +4 -4
  26. package/front_end/panels/console/ConsoleViewMessage.ts +1 -0
  27. package/front_end/panels/elements/AdoptedStyleSheetTreeElement.ts +78 -0
  28. package/front_end/panels/elements/ElementsTreeElement.ts +93 -121
  29. package/front_end/panels/elements/ElementsTreeOutline.ts +1 -0
  30. package/front_end/panels/elements/LayoutPane.ts +8 -7
  31. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +1 -1
  32. package/front_end/panels/elements/components/StylePropertyEditor.ts +2 -1
  33. package/front_end/panels/elements/elements.ts +3 -0
  34. package/front_end/panels/elements/elementsTreeOutline.css +16 -5
  35. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +1 -1
  36. package/front_end/panels/lighthouse/LighthouseStartView.ts +1 -1
  37. package/front_end/panels/lighthouse/lighthouseStartView.css +6 -0
  38. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +1 -1
  39. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +1 -1
  40. package/front_end/panels/media/PlayerListView.ts +1 -1
  41. package/front_end/panels/network/NetworkLogView.ts +2 -5
  42. package/front_end/panels/network/NetworkLogViewColumns.ts +2 -1
  43. package/front_end/panels/network/components/RequestHeaderSection.ts +1 -1
  44. package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
  45. package/front_end/panels/recorder/components/RecordingListView.ts +1 -1
  46. package/front_end/panels/recorder/components/StepEditor.ts +3 -3
  47. package/front_end/panels/settings/EditFileSystemView.ts +8 -8
  48. package/front_end/panels/settings/KeybindsSettingsTab.ts +2 -1
  49. package/front_end/panels/settings/SettingsScreen.ts +4 -4
  50. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  51. package/front_end/panels/timeline/components/BreadcrumbsUI.ts +1 -1
  52. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +1 -1
  53. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +47 -26
  54. package/front_end/panels/timeline/overlays/components/TimespanBreakdownOverlay.ts +121 -39
  55. package/front_end/panels/timeline/overlays/components/timespanBreakdownOverlay.css +106 -101
  56. package/front_end/third_party/chromium/README.chromium +1 -1
  57. package/front_end/ui/components/suggestion_input/SuggestionInput.ts +7 -12
  58. package/front_end/ui/components/tree_outline/TreeOutline.ts +1 -1
  59. package/front_end/ui/legacy/InplaceEditor.ts +1 -1
  60. package/front_end/ui/legacy/ListControl.ts +2 -1
  61. package/front_end/ui/legacy/ListWidget.ts +1 -1
  62. package/front_end/ui/legacy/SoftContextMenu.ts +2 -1
  63. package/front_end/ui/legacy/Treeoutline.ts +1 -0
  64. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +4 -2
  65. package/front_end/ui/legacy/components/data_grid/SortableDataGrid.ts +59 -9
  66. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +28 -15
  67. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +2 -2
  68. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +1 -1
  69. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +3 -3
  70. package/front_end/ui/legacy/components/source_frame/JSONView.ts +2 -3
  71. package/front_end/ui/visual_logging/Debugging.ts +1 -1
  72. package/package.json +1 -1
@@ -582,27 +582,25 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
582
582
  <devtools-report>
583
583
  <devtools-report-section-header role="heading" aria-level="2">${
584
584
  i18nString(UIStrings.sessionConfig)}</devtools-report-section-header>
585
- ${renderKeyValue(i18nString(UIStrings.keySite), key.site, 'dbsc-site')}
586
- ${renderKeyValue(i18nString(UIStrings.keyId), key.id, 'dbsc-id')}
587
- ${renderKeyValue(i18nString(UIStrings.refreshUrl), sessionAndEvents.session.refreshUrl, 'dbsc-refresh-url')}
588
- ${
589
- renderKeyValue(
590
- i18nString(UIStrings.expiryDate), new Date(sessionAndEvents.session.expiryDate * 1000).toLocaleString(),
591
- 'dbsc-expiry-date')}
592
- ${
593
- renderKeyValue(
594
- i18nString(UIStrings.cachedChallenge), sessionAndEvents.session.cachedChallenge || '',
595
- 'dbsc-cached-challenge')}
596
- ${
597
- renderKeyValue(
598
- i18nString(UIStrings.allowedRefreshInitiators),
599
- sessionAndEvents.session.allowedRefreshInitiators.join(', '), 'dbsc-allowed-refresh-initiators')}
585
+ <devtools-report-key>${i18nString(UIStrings.keySite)}</devtools-report-key>
586
+ <devtools-report-value>${key.site}</devtools-report-value>
587
+ <devtools-report-key>${i18nString(UIStrings.keyId)}</devtools-report-key>
588
+ <devtools-report-value>${key.id}</devtools-report-value>
589
+ <devtools-report-key>${i18nString(UIStrings.refreshUrl)}</devtools-report-key>
590
+ <devtools-report-value>${sessionAndEvents.session.refreshUrl}</devtools-report-value>
591
+ <devtools-report-key>${i18nString(UIStrings.expiryDate)}</devtools-report-key>
592
+ <devtools-report-value>${
593
+ new Date(sessionAndEvents.session.expiryDate * 1000).toLocaleString()}</devtools-report-value>
594
+ <devtools-report-key>${i18nString(UIStrings.cachedChallenge)}</devtools-report-key>
595
+ <devtools-report-value>${sessionAndEvents.session.cachedChallenge || ''}</devtools-report-value>
596
+ <devtools-report-key>${i18nString(UIStrings.allowedRefreshInitiators)}</devtools-report-key>
597
+ <devtools-report-value>${sessionAndEvents.session.allowedRefreshInitiators.join(', ')}</devtools-report-value>
600
598
  <devtools-report-section-header role="heading" aria-level="2">${
601
599
  i18nString(UIStrings.scope)}</devtools-report-section-header>
602
- ${renderKeyValue(i18nString(UIStrings.origin), inclusionRules.origin, 'dbsc-origin')}
603
- ${
604
- renderKeyValue(
605
- i18nString(UIStrings.includeSite), boolToString(inclusionRules.includeSite), 'dbsc-include-site')}
600
+ <devtools-report-key>${i18nString(UIStrings.origin)}</devtools-report-key>
601
+ <devtools-report-value>${inclusionRules.origin}</devtools-report-value>
602
+ <devtools-report-key>${i18nString(UIStrings.includeSite)}</devtools-report-key>
603
+ <devtools-report-value>${boolToString(inclusionRules.includeSite)}</devtools-report-value>
606
604
  </devtools-report>
607
605
  ${
608
606
  inclusionRules.urlRules.length > 0 ? html`
@@ -710,78 +708,62 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
710
708
  const creationEventDetails =
711
709
  selectedEvent?.creationEventDetails &&
712
710
  html`
713
- ${
714
- renderKeyValue(
715
- i18nString(UIStrings.fetchResult), fetchResultToString(selectedEvent.creationEventDetails.fetchResult),
716
- 'dbsc-creation-fetch-result')}
717
- ${
718
- selectedEvent.creationEventDetails.newSession &&
719
- html`
720
- ${
721
- renderKeyValue(
722
- i18nString(UIStrings.updatedSessionConfig), i18nString(UIStrings.yes),
723
- 'dbsc-creation-updated-session-config')}
711
+ <devtools-report-key>${i18nString(UIStrings.fetchResult)}</devtools-report-key>
712
+ <devtools-report-value>${
713
+ fetchResultToString(selectedEvent.creationEventDetails.fetchResult)}</devtools-report-value>
714
+ ${selectedEvent.creationEventDetails.newSession && html`
715
+ <devtools-report-key>${i18nString(UIStrings.updatedSessionConfig)}</devtools-report-key>
716
+ <devtools-report-value>${i18nString(UIStrings.yes)}</devtools-report-value>
724
717
  `}
725
718
  `;
726
719
  const refreshEventDetails =
727
720
  selectedEvent?.refreshEventDetails &&
728
721
  html`
729
- ${
730
- renderKeyValue(
731
- i18nString(UIStrings.refreshResult),
732
- refreshResultToString(selectedEvent.refreshEventDetails.refreshResult), 'dbsc-refresh-result')}
733
- ${
734
- renderKeyValue(
735
- i18nString(UIStrings.causedAnyRequestDeferrals),
736
- boolToString(!selectedEvent.refreshEventDetails.wasFullyProactiveRefresh),
737
- 'dbsc-refresh-was-fully-proactive-refresh')}
722
+ <devtools-report-key>${i18nString(UIStrings.refreshResult)}</devtools-report-key>
723
+ <devtools-report-value>${
724
+ refreshResultToString(selectedEvent.refreshEventDetails.refreshResult)}</devtools-report-value>
725
+ <devtools-report-key>${i18nString(UIStrings.causedAnyRequestDeferrals)}</devtools-report-key>
726
+ <devtools-report-value>${
727
+ boolToString(!selectedEvent.refreshEventDetails.wasFullyProactiveRefresh)}</devtools-report-value>
738
728
  ${
739
729
  selectedEvent.refreshEventDetails.fetchResult &&
740
730
  html`
741
- ${
742
- renderKeyValue(
743
- i18nString(UIStrings.fetchResult), fetchResultToString(selectedEvent.refreshEventDetails.fetchResult),
744
- 'dbsc-refresh-fetch-result')}
731
+ <devtools-report-key>${i18nString(UIStrings.fetchResult)}</devtools-report-key>
732
+ <devtools-report-value>${
733
+ fetchResultToString(selectedEvent.refreshEventDetails.fetchResult)}</devtools-report-value>
745
734
  `}
746
- ${
747
- selectedEvent.refreshEventDetails.newSession &&
748
- html`
749
- ${
750
- renderKeyValue(
751
- i18nString(UIStrings.updatedSessionConfig), i18nString(UIStrings.yes),
752
- 'dbsc-refresh-updated-session-config')}
735
+ ${selectedEvent.refreshEventDetails.newSession && html`
736
+ <devtools-report-key>${i18nString(UIStrings.updatedSessionConfig)}</devtools-report-key>
737
+ <devtools-report-value>${i18nString(UIStrings.yes)}</devtools-report-value>
753
738
  `}
754
739
  `;
755
740
  const challengeEventDetails =
756
741
  selectedEvent?.challengeEventDetails &&
757
742
  html`
758
- ${
759
- renderKeyValue(
760
- i18nString(UIStrings.challengeResult),
761
- challengeResultToString(selectedEvent.challengeEventDetails.challengeResult), 'dbsc-challenge-result')}
762
- ${
763
- renderKeyValue(
764
- i18nString(UIStrings.challenge), selectedEvent.challengeEventDetails.challenge, 'dbsc-challenge')}
743
+ <devtools-report-key>${i18nString(UIStrings.challengeResult)}</devtools-report-key>
744
+ <devtools-report-value>${
745
+ challengeResultToString(selectedEvent.challengeEventDetails.challengeResult)}</devtools-report-value>
746
+ <devtools-report-key>${i18nString(UIStrings.challenge)}</devtools-report-key>
747
+ <devtools-report-value>${selectedEvent.challengeEventDetails.challenge}</devtools-report-value>
765
748
  `;
766
749
  const terminationEventDetails =
767
750
  selectedEvent?.terminationEventDetails &&
768
751
  html`
769
- ${
770
- renderKeyValue(
771
- i18nString(UIStrings.deletionReason),
772
- deletionReasonToString(selectedEvent.terminationEventDetails.deletionReason), 'dbsc-termination-reason')}
752
+ <devtools-report-key>${i18nString(UIStrings.deletionReason)}</devtools-report-key>
753
+ <devtools-report-value>${
754
+ deletionReasonToString(selectedEvent.terminationEventDetails.deletionReason)}</devtools-report-value>
773
755
  `;
774
756
  const eventDetailsContentHtml = selectedEvent ?
775
757
  html`
776
758
  <devtools-report>
777
- ${renderKeyValue(i18nString(UIStrings.keySite), selectedEvent.site, 'dbsc-event-site')}
778
- ${
779
- selectedEvent.sessionId &&
780
- renderKeyValue(i18nString(UIStrings.sessionId), selectedEvent.sessionId, 'dbsc-event-session-id')}
781
- ${renderKeyValue(i18nString(UIStrings.type), getEventTypeString(selectedEvent), 'dbsc-event-type')}
782
- ${
783
- renderKeyValue(
784
- i18nString(UIStrings.eventResult), succeededToString(selectedEvent.succeeded), 'dbsc-event-result')}
759
+ <devtools-report-key>${i18nString(UIStrings.keySite)}</devtools-report-key>
760
+ <devtools-report-value>${selectedEvent.site}</devtools-report-value>
761
+ <devtools-report-key>${i18nString(UIStrings.sessionId)}</devtools-report-key>
762
+ <devtools-report-value>${selectedEvent.sessionId}</devtools-report-value>
763
+ <devtools-report-key>${i18nString(UIStrings.type)}</devtools-report-key>
764
+ <devtools-report-value>${getEventTypeString(selectedEvent)}</devtools-report-value>
765
+ <devtools-report-key>${i18nString(UIStrings.eventResult)}</devtools-report-key>
766
+ <devtools-report-value>${succeededToString(selectedEvent.succeeded)}</devtools-report-value>
785
767
  ${creationEventDetails}
786
768
  ${refreshEventDetails}
787
769
  ${challengeEventDetails}
@@ -888,13 +870,6 @@ export class DeviceBoundSessionsView extends UI.Widget.VBox {
888
870
  }
889
871
  }
890
872
 
891
- function renderKeyValue(key: string, value: string, id: string): TemplateResult {
892
- return html`
893
- <devtools-report-key id=${id}>${key}</devtools-report-key>
894
- <devtools-report-value role="text" aria-describedby=${id}>${value}</devtools-report-value>
895
- `;
896
- }
897
-
898
873
  function ruleTypeToString(ruleType: Protocol.Network.DeviceBoundSessionUrlRuleRuleType): string {
899
874
  switch (ruleType) {
900
875
  case Protocol.Network.DeviceBoundSessionUrlRuleRuleType.Exclude:
@@ -180,6 +180,7 @@ export class ServiceWorkerUpdateCycleView {
180
180
  const tr = this.tableElement.createChild('tr', 'service-worker-update-timeline');
181
181
  tr.setAttribute('jslog', `${VisualLogging.treeItem('update-timeline').track({
182
182
  click: true,
183
+ resize: true,
183
184
  keydown: 'ArrowLeft|ArrowRight|ArrowUp|ArrowDown|Enter|Space',
184
185
  })}`);
185
186
  this.rows.push(tr);
@@ -353,7 +353,7 @@ function renderFramesPerReason(frames: string[]|undefined): LitTemplate {
353
353
  }
354
354
  const rows = [html`<div>${i18nString(UIStrings.framesPerIssue, {n: frames.length})}</div>`];
355
355
  rows.push(...frames.map(url => html`<div class="text-ellipsis" title=${url}
356
- jslog=${VisualLogging.treeItem()}>${url}</div>`));
356
+ jslog=${VisualLogging.treeItem().track({resize: true})}>${url}</div>`));
357
357
  return html`
358
358
  <div class="details-list"
359
359
  jslog=${VisualLogging.tree('frames-per-issue')}>
@@ -361,7 +361,9 @@ function renderFramesPerReason(frames: string[]|undefined): LitTemplate {
361
361
  rows,
362
362
  title: i18nString(UIStrings.framesPerIssue, {n: frames.length}),
363
363
  } as ExpandableList.ExpandableList.ExpandableListData}
364
- jslog=${VisualLogging.treeItem()}></devtools-expandable-list>
364
+ jslog=${VisualLogging.treeItem().track({
365
+ resize: true
366
+ })}></devtools-expandable-list>
365
367
  </div>
366
368
  `;
367
369
  }
@@ -144,7 +144,7 @@ const DEFAULT_VIEW: View = (input: ViewInput, _output: ViewOutput, target: HTMLE
144
144
  // clang-format off
145
145
  return html`
146
146
  <span class=${spanClasses}
147
- jslog=${VisualLogging.item('matched-address-item').track({hover: true})}
147
+ jslog=${VisualLogging.item('matched-address-item').track({hover: true, resize: true})}
148
148
  @mouseenter=${() => input.onHighlightMatchesInAddress(startIndex)}
149
149
  @mouseleave=${input.onClearHighlightedMatches}>
150
150
  ${templateLines}
@@ -238,6 +238,7 @@ export class XHRBreakpointsSidebarPane extends UI.Widget.VBox implements UI.Cont
238
238
  listItemElement.setAttribute('jslog', `${VisualLogging.item().track({
239
239
  click: true,
240
240
  dblclick: true,
241
+ resize: true,
241
242
  keydown: 'ArrowUp|ArrowDown|PageUp|PageDown|Enter|Space',
242
243
  })}`);
243
244
  return listItemElement;
@@ -18,11 +18,11 @@ const UIStringsNotTranslate = {
18
18
  /**
19
19
  * @description Text for teaser to generate code.
20
20
  */
21
- ctrlItoGenerateCode: 'Ctrl+I to generate code',
21
+ ctrlItoGenerateCode: 'ctrl+i to generate code',
22
22
  /**
23
23
  * @description Text for teaser to generate code in Mac.
24
24
  */
25
- cmdItoGenerateCode: 'Cmd+I to generate code',
25
+ cmdItoGenerateCode: 'cmd+i to generate code',
26
26
  /**
27
27
  * @description Aria label for teaser to generate code.
28
28
  */
@@ -22,16 +22,16 @@ const UIStringsNotTranslate = {
22
22
  * @description First item in the description.
23
23
  */
24
24
  describeCodeInComment:
25
- 'Pressing Ctrl+I on a comment in the Console and Sources panels now generates entire code blocks based on the instructions in the comment.',
25
+ 'Pressing ctrl+i on a comment in the Console and Sources panels now generates entire code blocks based on the instructions in the comment',
26
26
  /**
27
27
  * @description First item in the description.
28
28
  */
29
29
  describeCodeInCommentForMacOs:
30
- 'Pressing Cmd+I on a comment in the Console and Sources panels now generates entire code blocks based on the instructions in the comment.',
30
+ 'Pressing cmd+i on a comment in the Console and Sources panels now generates entire code blocks based on the instructions in the comment',
31
31
  /**
32
32
  * @description Second item in the description.
33
33
  */
34
- asYouType: 'You will still receive the real-time, as-you-type suggestions to help you code faster.',
34
+ asYouType: 'You will still receive the real-time, as-you-type suggestions to help you code faster',
35
35
  /**
36
36
  * @description Third item in the description.
37
37
  */
@@ -97,7 +97,7 @@ export class AiCodeGenerationUpgradeDialog {
97
97
  <div class="right-buttons">
98
98
  <devtools-button
99
99
  @click=${() => {
100
- result.resolve(true);
100
+ result.resolve(false);
101
101
  void UI.ViewManager.ViewManager.instance().showView('chrome-ai');
102
102
  }}
103
103
  jslogcontext="ai-code-generation-upgrade-dialog.manage-in-settings"
@@ -1425,6 +1425,7 @@ export class ConsoleViewMessage implements ConsoleViewportElement {
1425
1425
  this.elementInternal.className = 'console-message-wrapper';
1426
1426
  this.elementInternal.setAttribute('jslog', `${VisualLogging.item('console-message').track({
1427
1427
  click: true,
1428
+ resize: true,
1428
1429
  keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter|Space|Home|End',
1429
1430
  })}`);
1430
1431
  this.elementInternal.removeChildren();
@@ -11,6 +11,8 @@ import * as UI from '../../ui/legacy/legacy.js';
11
11
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
12
12
  import {PanelUtils} from '../utils/utils.js';
13
13
 
14
+ import type {EditorHandles} from './ElementsTreeElement.js';
15
+
14
16
  export class AdoptedStyleSheetTreeElement extends UI.TreeOutline.TreeElement {
15
17
  private eventListener: Common.EventTarget.EventDescriptor|null = null;
16
18
 
@@ -58,6 +60,8 @@ export class AdoptedStyleSheetTreeElement extends UI.TreeOutline.TreeElement {
58
60
  }
59
61
 
60
62
  export class AdoptedStyleSheetContentsTreeElement extends UI.TreeOutline.TreeElement {
63
+ private editing: EditorHandles|null = null;
64
+
61
65
  constructor(private readonly styleSheetHeader: SDK.CSSStyleSheetHeader.CSSStyleSheetHeader) {
62
66
  super('');
63
67
  }
@@ -69,6 +73,9 @@ export class AdoptedStyleSheetContentsTreeElement extends UI.TreeOutline.TreeEle
69
73
  }
70
74
 
71
75
  override onunbind(): void {
76
+ if (this.editing) {
77
+ this.editing.cancel();
78
+ }
72
79
  this.styleSheetHeader.cssModel().removeEventListener(
73
80
  SDK.CSSModel.Events.StyleSheetChanged, this.onStyleSheetChanged, this);
74
81
  }
@@ -91,4 +98,75 @@ export class AdoptedStyleSheetContentsTreeElement extends UI.TreeOutline.TreeEle
91
98
  void this.onpopulate();
92
99
  }
93
100
  }
101
+
102
+ override ondblclick(event: Event): boolean {
103
+ if (this.editing) {
104
+ return false;
105
+ }
106
+ void this.startEditing(event.target as Element);
107
+ return false;
108
+ }
109
+
110
+ override onenter(): boolean {
111
+ if (this.editing) {
112
+ return false;
113
+ }
114
+ const target = this.listItemElement.querySelector('.webkit-html-text-node');
115
+ if (target) {
116
+ void this.startEditing(target);
117
+ return true;
118
+ }
119
+ return false;
120
+ }
121
+
122
+ private async startEditing(target: Element): Promise<void> {
123
+ if (this.editing || UI.UIUtils.isBeingEdited(target)) {
124
+ return;
125
+ }
126
+
127
+ const textNode = target.enclosingNodeOrSelfWithClass('webkit-html-text-node');
128
+ if (!textNode) {
129
+ return;
130
+ }
131
+
132
+ const data = await this.styleSheetHeader.requestContentData();
133
+ textNode.textContent = (TextUtils.ContentData.ContentData.isError(data) || !data.isTextContent) ? '' : data.text;
134
+
135
+ const config =
136
+ new UI.InplaceEditor.Config(this.editingCommitted.bind(this), () => this.editingCancelled(), undefined);
137
+
138
+ const editorHandles = UI.InplaceEditor.InplaceEditor.startEditing(textNode, config);
139
+ if (!editorHandles) {
140
+ return;
141
+ }
142
+
143
+ this.editing = {
144
+ commit: editorHandles.commit,
145
+ cancel: editorHandles.cancel,
146
+ editor: undefined,
147
+ resize: () => {},
148
+ };
149
+
150
+ const componentSelection = this.listItemElement.getComponentSelection();
151
+ componentSelection?.selectAllChildren(textNode);
152
+ }
153
+
154
+ private async editingCommitted(element: Element, newText: string, oldText: string|null): Promise<void> {
155
+ this.editing = null;
156
+
157
+ if (newText !== oldText) {
158
+ await this.styleSheetHeader.cssModel().setStyleSheetText(this.styleSheetHeader.id, newText, false);
159
+ }
160
+
161
+ this.editingCancelled();
162
+ }
163
+
164
+ private editingCancelled(): void {
165
+ this.editing = null;
166
+ void this.onpopulate();
167
+ }
168
+
169
+ isEditing(): boolean {
170
+ return this.editing !== null;
171
+ }
94
172
  }