chrome-devtools-frontend 1.0.1555174 → 1.0.1556696

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 (156) hide show
  1. package/front_end/core/protocol_client/InspectorBackend.ts +1 -1
  2. package/front_end/core/root/Runtime.ts +0 -4
  3. package/front_end/core/sdk/DOMModel.ts +101 -7
  4. package/front_end/entrypoints/formatter_worker/FormatterActions.ts +2 -0
  5. package/front_end/entrypoints/formatter_worker/ScopeParser.ts +75 -7
  6. package/front_end/entrypoints/formatter_worker/Substitute.ts +1 -1
  7. package/front_end/generated/InspectorBackendCommands.ts +1 -1
  8. package/front_end/generated/protocol.ts +0 -1
  9. package/front_end/models/ai_assistance/AiConversation.ts +71 -10
  10. package/front_end/models/ai_assistance/ArtifactsManager.ts +67 -0
  11. package/front_end/models/ai_assistance/ConversationHandler.ts +3 -2
  12. package/front_end/models/ai_assistance/agents/AiAgent.ts +17 -27
  13. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +152 -4
  14. package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -2
  15. package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
  16. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +1 -1
  17. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +0 -2
  18. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -1
  19. package/front_end/{ui/components → models}/annotations/AnnotationRepository.ts +4 -4
  20. package/front_end/models/annotations/README.md +7 -0
  21. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
  22. package/front_end/models/greendev/Prototypes.ts +56 -0
  23. package/front_end/models/greendev/README.md +5 -0
  24. package/front_end/models/greendev/greendev.ts +5 -0
  25. package/front_end/models/stack_trace/StackTrace.ts +13 -2
  26. package/front_end/models/stack_trace/StackTraceImpl.ts +81 -6
  27. package/front_end/models/stack_trace/StackTraceModel.ts +35 -3
  28. package/front_end/models/trace/extras/TraceTree.ts +4 -2
  29. package/front_end/models/trace/insights/LCPDiscovery.ts +0 -2
  30. package/front_end/models/trace/types/TraceEvents.ts +0 -1
  31. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +116 -70
  32. package/front_end/panels/ai_assistance/aiAssistancePanel.css +16 -0
  33. package/front_end/panels/ai_assistance/components/ArtifactsViewer.ts +159 -0
  34. package/front_end/panels/ai_assistance/components/ChatView.ts +3 -2
  35. package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +7 -8
  36. package/front_end/panels/ai_assistance/components/PerformanceAgentFlameChart.ts +15 -8
  37. package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +9 -9
  38. package/front_end/panels/ai_assistance/components/artifactsViewer.css +15 -0
  39. package/front_end/panels/ai_assistance/components/collapsibleAssistanceContentWidget.css +5 -6
  40. package/front_end/panels/application/AppManifestView.ts +263 -205
  41. package/front_end/panels/application/ApplicationPanelSidebar.ts +24 -57
  42. package/front_end/panels/application/OpenedWindowDetailsView.ts +2 -0
  43. package/front_end/panels/application/ServiceWorkersView.ts +2 -0
  44. package/front_end/panels/application/StorageView.ts +1 -0
  45. package/front_end/panels/application/appManifestView.css +48 -0
  46. package/front_end/panels/application/components/ProtocolHandlersView.ts +2 -2
  47. package/front_end/panels/application/preloading/PreloadingView.ts +12 -6
  48. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +230 -237
  49. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +96 -79
  50. package/front_end/panels/application/preloading/components/preloadingGrid.css +26 -29
  51. package/front_end/panels/application/preloading/preloadingView.css +6 -0
  52. package/front_end/panels/common/Annotation.ts +1 -1
  53. package/front_end/panels/common/AnnotationManager.ts +1 -1
  54. package/front_end/panels/common/ExtensionView.ts +1 -0
  55. package/front_end/panels/console/ConsoleContextSelector.ts +74 -9
  56. package/front_end/panels/console/consoleContextSelector.css +31 -29
  57. package/front_end/panels/coverage/coverageListView.css +59 -57
  58. package/front_end/panels/elements/ElementsPanel.ts +1 -1
  59. package/front_end/panels/elements/ElementsTreeElement.ts +39 -1
  60. package/front_end/panels/elements/ElementsTreeOutline.ts +23 -21
  61. package/front_end/panels/elements/TopLayerContainer.ts +26 -91
  62. package/front_end/panels/explain/components/ConsoleInsight.ts +3 -3
  63. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +4 -8
  64. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +148 -97
  65. package/front_end/panels/linear_memory_inspector/components/LinearMemoryViewer.ts +1 -1
  66. package/front_end/panels/linear_memory_inspector/components/linearMemoryValueInterpreter.css +37 -35
  67. package/front_end/panels/network/NetworkItemView.ts +1 -1
  68. package/front_end/panels/network/NetworkLogView.ts +1 -1
  69. package/front_end/panels/network/NetworkPanel.ts +1 -1
  70. package/front_end/panels/recorder/RecorderController.ts +0 -1
  71. package/front_end/panels/security/SecurityPanelSidebar.ts +5 -0
  72. package/front_end/panels/settings/SettingsScreen.ts +133 -1
  73. package/front_end/panels/settings/settings-meta.ts +24 -0
  74. package/front_end/panels/settings/settingsScreen.css +4 -0
  75. package/front_end/panels/sources/UISourceCodeFrame.ts +3 -17
  76. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -8
  77. package/front_end/panels/timeline/components/TimelineSummary.ts +75 -54
  78. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +18 -26
  79. package/front_end/panels/timeline/components/insights/Cache.ts +12 -8
  80. package/front_end/panels/timeline/components/insights/DOMSize.ts +25 -21
  81. package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +7 -7
  82. package/front_end/panels/timeline/components/insights/FontDisplay.ts +7 -5
  83. package/front_end/panels/timeline/components/insights/ForcedReflow.ts +11 -9
  84. package/front_end/panels/timeline/components/insights/INPBreakdown.ts +7 -6
  85. package/front_end/panels/timeline/components/insights/ImageDelivery.ts +7 -5
  86. package/front_end/panels/timeline/components/insights/InsightRenderer.ts +20 -18
  87. package/front_end/panels/timeline/components/insights/LCPBreakdown.ts +12 -12
  88. package/front_end/panels/timeline/components/insights/LegacyJavaScript.ts +7 -7
  89. package/front_end/panels/timeline/components/insights/ModernHTTP.ts +7 -5
  90. package/front_end/panels/timeline/components/insights/NetworkDependencyTree.ts +15 -13
  91. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +2 -2
  92. package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +15 -14
  93. package/front_end/panels/timeline/components/insights/Table.ts +152 -130
  94. package/front_end/panels/timeline/components/insights/ThirdParties.ts +11 -9
  95. package/front_end/panels/timeline/components/timelineSummary.css +58 -57
  96. package/front_end/panels/timeline/thirdPartyTreeView.css +109 -0
  97. package/front_end/panels/timeline/timelineDetailsView.css +2 -4
  98. package/front_end/panels/timeline/timelinePanel.css +0 -110
  99. package/front_end/third_party/acorn/estree-legacy.d.ts +2 -0
  100. package/front_end/third_party/chromium/README.chromium +1 -1
  101. package/front_end/third_party/puppeteer/README.chromium +2 -2
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/CDPSession.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/CDPSession.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.d.ts.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Connection.d.ts.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js +21 -7
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/EventEmitter.d.ts.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +15 -6
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/CDPSession.d.ts.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/CDPSession.js.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.d.ts.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Connection.d.ts.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js +21 -7
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/EventEmitter.d.ts.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  133. package/front_end/third_party/puppeteer/package/package.json +2 -2
  134. package/front_end/third_party/puppeteer/package/src/api/CDPSession.ts +1 -2
  135. package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +2 -4
  136. package/front_end/third_party/puppeteer/package/src/api/Frame.ts +2 -4
  137. package/front_end/third_party/puppeteer/package/src/api/Page.ts +2 -4
  138. package/front_end/third_party/puppeteer/package/src/bidi/core/Connection.ts +3 -2
  139. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +29 -10
  140. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +3 -3
  141. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  142. package/front_end/ui/components/report_view/ReportView.docs.ts +37 -0
  143. package/front_end/ui/components/report_view/ReportView.ts +1 -4
  144. package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
  145. package/front_end/ui/legacy/Floaty.ts +5 -9
  146. package/front_end/ui/legacy/InspectorView.ts +2 -1
  147. package/front_end/ui/legacy/ReportView.ts +5 -4
  148. package/front_end/ui/legacy/TabbedPane.ts +1 -1
  149. package/front_end/ui/legacy/ViewManager.ts +2 -32
  150. package/front_end/ui/legacy/Widget.ts +7 -0
  151. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +0 -1
  152. package/front_end/ui/legacy/reportView.css +0 -24
  153. package/front_end/ui/visual_logging/KnownContextValues.ts +7 -0
  154. package/package.json +1 -1
  155. /package/front_end/{ui/components → models}/annotations/AnnotationType.ts +0 -0
  156. /package/front_end/{ui/components → models}/annotations/annotations.ts +0 -0
@@ -1,7 +1,6 @@
1
1
  // Copyright 2020 The Chromium Authors
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
- /* eslint-disable @devtools/no-lit-render-outside-of-view */
5
4
 
6
5
  import '../../../ui/kit/kit.js';
7
6
 
@@ -35,42 +34,149 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
35
34
  const {render, html} = Lit;
36
35
  const {widgetConfig} = UI.Widget;
37
36
 
38
- export interface LinearMemoryValueInterpreterData {
39
- value: ArrayBuffer;
40
- valueTypes: Set<ValueType>;
37
+ export interface ViewInput {
41
38
  endianness: Endianness;
42
- valueTypeModes?: Map<ValueType, ValueTypeMode>;
39
+ buffer: ArrayBuffer;
40
+ valueTypes: Set<ValueType>;
41
+ valueTypeModes: Map<ValueType, ValueTypeMode>;
43
42
  memoryLength: number;
43
+ showSettings: boolean;
44
44
  onValueTypeModeChange: (type: ValueType, mode: ValueTypeMode) => void;
45
45
  onJumpToAddressClicked: (address: number) => void;
46
46
  onEndiannessChanged: (endianness: Endianness) => void;
47
47
  onValueTypeToggled: (type: ValueType, checked: boolean) => void;
48
+ onSettingsToggle: () => void;
48
49
  }
49
50
 
50
- export class LinearMemoryValueInterpreter extends HTMLElement {
51
- readonly #shadow = this.attachShadow({mode: 'open'});
52
- #onValueTypeModeChange: (type: ValueType, mode: ValueTypeMode) => void = () => {};
53
- #onJumpToAddressClicked: (address: number) => void = () => {};
54
- #onEndiannessChanged: (endianness: Endianness) => void = () => {};
55
- #onValueTypeToggled: (type: ValueType, checked: boolean) => void = () => {};
51
+ function renderEndiannessSetting(
52
+ onEndiannessChanged: (endianness: Endianness) => void, currentEndiannes: Endianness): Lit.TemplateResult {
53
+ // Disabled until https://crbug.com/1079231 is fixed.
54
+ // clang-format off
55
+ return html`
56
+ <label data-endianness-setting="true" title=${i18nString(UIStrings.changeEndianness)}>
57
+ <select
58
+ jslog=${VisualLogging.dropDown('linear-memory-inspector.endianess').track({change: true})}
59
+ style="border: none;"
60
+ data-endianness="true" @change=${(e: Event) => onEndiannessChanged((e.target as HTMLSelectElement).value as Endianness)}>
61
+ ${[Endianness.LITTLE, Endianness.BIG].map(endianness => {
62
+ return html`<option value=${endianness} .selected=${currentEndiannes === endianness}
63
+ jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(endianness)).track({click: true})}>${
64
+ i18n.i18n.lockedString(endianness)}</option>`;
65
+ })}
66
+ </select>
67
+ </label>
68
+ `;
69
+ // clang-format on
70
+ }
71
+
72
+ export const DEFAULT_VIEW = (input: ViewInput, _output: undefined, target: HTMLElement): void => {
73
+ // Disabled until https://crbug.com/1079231 is fixed.
74
+ // clang-format off
75
+ render(html`
76
+ <style>${UI.inspectorCommonStyles}</style>
77
+ <style>${linearMemoryValueInterpreterStyles}</style>
78
+ <div class="value-interpreter">
79
+ <div class="settings-toolbar">
80
+ ${renderEndiannessSetting(input.onEndiannessChanged, input.endianness)}
81
+ <devtools-button data-settings="true" class="toolbar-button ${input.showSettings ? '' : 'disabled'}"
82
+ title=${i18nString(UIStrings.toggleValueTypeSettings)} @click=${input.onSettingsToggle}
83
+ jslog=${VisualLogging.toggleSubpane('linear-memory-inspector.toggle-value-settings').track({ click: true })}
84
+ .iconName=${'gear'}
85
+ .toggledIconName=${'gear-filled'}
86
+ .toggleType=${Buttons.Button.ToggleType.PRIMARY}
87
+ .variant=${Buttons.Button.Variant.ICON_TOGGLE}
88
+ ></devtools-button>
89
+ </div>
90
+ <span class="divider"></span>
91
+ <div>
92
+ ${input.showSettings ?
93
+ html`
94
+ <devtools-widget .widgetConfig=${widgetConfig(ValueInterpreterSettings, {
95
+ valueTypes: input.valueTypes, onToggle: input.onValueTypeToggled
96
+ })}>
97
+ </devtools-widget>` :
98
+ html`
99
+ <devtools-widget .widgetConfig=${widgetConfig(ValueInterpreterDisplay, {
100
+ buffer: input.buffer,
101
+ valueTypes: input.valueTypes,
102
+ endianness: input.endianness,
103
+ valueTypeModes: input.valueTypeModes,
104
+ memoryLength: input.memoryLength,
105
+ onValueTypeModeChange: input.onValueTypeModeChange,
106
+ onJumpToAddressClicked: input.onJumpToAddressClicked,
107
+ })}>
108
+ </devtools-widget>`}
109
+ </div>
110
+ </div>
111
+ `,
112
+ target,
113
+ );
114
+ // clang-format on
115
+ };
116
+
117
+ export type View = typeof DEFAULT_VIEW;
118
+
119
+ export class LinearMemoryValueInterpreter extends UI.Widget.Widget {
120
+ readonly #view: View;
56
121
  #endianness = Endianness.LITTLE;
57
122
  #buffer = new ArrayBuffer(0);
58
123
  #valueTypes = new Set<ValueType>();
59
124
  #valueTypeModeConfig = new Map<ValueType, ValueTypeMode>();
60
125
  #memoryLength = 0;
61
126
  #showSettings = false;
127
+ #onValueTypeModeChange: (type: ValueType, mode: ValueTypeMode) => void = () => {};
128
+ #onJumpToAddressClicked: (address: number) => void = () => {};
129
+ #onEndiannessChanged: (endianness: Endianness) => void = () => {};
130
+ #onValueTypeToggled: (type: ValueType, checked: boolean) => void = () => {};
131
+
132
+ constructor(element?: HTMLElement, view: View = DEFAULT_VIEW) {
133
+ super(element);
134
+ this.#view = view;
135
+ }
136
+
137
+ set buffer(value: ArrayBuffer) {
138
+ this.#buffer = value;
139
+ this.requestUpdate();
140
+ }
62
141
 
63
- set data(data: LinearMemoryValueInterpreterData) {
64
- this.#endianness = data.endianness;
65
- this.#buffer = data.value;
66
- this.#valueTypes = data.valueTypes;
67
- this.#valueTypeModeConfig = data.valueTypeModes || new Map();
68
- this.#memoryLength = data.memoryLength;
69
- this.#onValueTypeModeChange = data.onValueTypeModeChange;
70
- this.#onJumpToAddressClicked = data.onJumpToAddressClicked;
71
- this.#onEndiannessChanged = data.onEndiannessChanged;
72
- this.#onValueTypeToggled = data.onValueTypeToggled;
73
- this.#render();
142
+ get buffer(): ArrayBuffer {
143
+ return this.#buffer;
144
+ }
145
+
146
+ set valueTypes(value: Set<ValueType>) {
147
+ this.#valueTypes = value;
148
+ this.requestUpdate();
149
+ }
150
+
151
+ get valueTypes(): Set<ValueType> {
152
+ return this.#valueTypes;
153
+ }
154
+
155
+ set valueTypeModes(value: Map<ValueType, ValueTypeMode>) {
156
+ this.#valueTypeModeConfig = value;
157
+ this.requestUpdate();
158
+ }
159
+
160
+ get valueTypeModes(): Map<ValueType, ValueTypeMode> {
161
+ return this.#valueTypeModeConfig;
162
+ }
163
+
164
+ set endianness(value: Endianness) {
165
+ this.#endianness = value;
166
+ this.requestUpdate();
167
+ }
168
+
169
+ get endianness(): Endianness {
170
+ return this.#endianness;
171
+ }
172
+
173
+ set memoryLength(value: number) {
174
+ this.#memoryLength = value;
175
+ this.requestUpdate();
176
+ }
177
+
178
+ get memoryLength(): number {
179
+ return this.#memoryLength;
74
180
  }
75
181
 
76
182
  get onValueTypeModeChange(): (type: ValueType, mode: ValueTypeMode) => void {
@@ -79,7 +185,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
79
185
 
80
186
  set onValueTypeModeChange(value: (type: ValueType, mode: ValueTypeMode) => void) {
81
187
  this.#onValueTypeModeChange = value;
82
- this.#render();
188
+ this.requestUpdate();
83
189
  }
84
190
 
85
191
  get onJumpToAddressClicked(): (address: number) => void {
@@ -88,7 +194,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
88
194
 
89
195
  set onJumpToAddressClicked(value: (address: number) => void) {
90
196
  this.#onJumpToAddressClicked = value;
91
- this.#render();
197
+ this.requestUpdate();
92
198
  }
93
199
 
94
200
  get onEndiannessChanged(): (endianness: Endianness) => void {
@@ -97,7 +203,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
97
203
 
98
204
  set onEndiannessChanged(value: (endianness: Endianness) => void) {
99
205
  this.#onEndiannessChanged = value;
100
- this.#render();
206
+ this.performUpdate();
101
207
  }
102
208
 
103
209
  get onValueTypeToggled(): (type: ValueType, checked: boolean) => void {
@@ -106,83 +212,28 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
106
212
 
107
213
  set onValueTypeToggled(value: (type: ValueType, checked: boolean) => void) {
108
214
  this.#onValueTypeToggled = value;
109
- this.#render();
110
- }
111
-
112
- #render(): void {
113
- // Disabled until https://crbug.com/1079231 is fixed.
114
- // clang-format off
115
- render(html`
116
- <style>${UI.inspectorCommonStyles}</style>
117
- <style>${linearMemoryValueInterpreterStyles}</style>
118
- <div class="value-interpreter">
119
- <div class="settings-toolbar">
120
- ${this.#renderEndiannessSetting()}
121
- <devtools-button data-settings="true" class="toolbar-button ${this.#showSettings ? '' : 'disabled'}"
122
- title=${i18nString(UIStrings.toggleValueTypeSettings)} @click=${this.#onSettingsToggle}
123
- jslog=${VisualLogging.toggleSubpane('linear-memory-inspector.toggle-value-settings').track({click: true})}
124
- .iconName=${'gear'}
125
- .toggledIconName=${'gear-filled'}
126
- .toggleType=${Buttons.Button.ToggleType.PRIMARY}
127
- .variant=${Buttons.Button.Variant.ICON_TOGGLE}
128
- ></devtools-button>
129
- </div>
130
- <span class="divider"></span>
131
- <div>
132
- ${this.#showSettings ?
133
- html`
134
- <devtools-widget .widgetConfig=${widgetConfig(ValueInterpreterSettings, {
135
- valueTypes: this.#valueTypes, onToggle: this.#onValueTypeToggled })}>
136
- </devtools-widget>` :
137
- html`
138
- <devtools-widget .widgetConfig=${widgetConfig(ValueInterpreterDisplay, {
139
- buffer: this.#buffer,
140
- valueTypes: this.#valueTypes,
141
- endianness: this.#endianness,
142
- valueTypeModes: this.#valueTypeModeConfig,
143
- memoryLength: this.#memoryLength,
144
- onValueTypeModeChange: this.#onValueTypeModeChange,
145
- onJumpToAddressClicked: this.#onJumpToAddressClicked,
146
- })}>
147
- </devtools-widget>`}
148
- </div>
149
- </div>
150
- `,
151
- this.#shadow, { host: this },
152
- );
153
- // clang-format on
215
+ this.performUpdate();
154
216
  }
155
217
 
156
- #renderEndiannessSetting(): Lit.TemplateResult {
157
- // Disabled until https://crbug.com/1079231 is fixed.
158
- // clang-format off
159
- return html`
160
- <label data-endianness-setting="true" title=${i18nString(UIStrings.changeEndianness)}>
161
- <select
162
- jslog=${VisualLogging.dropDown('linear-memory-inspector.endianess').track({change: true})}
163
- style="border: none;"
164
- data-endianness="true" @change=${(e: Event) => this.#onEndiannessChanged((e.target as HTMLSelectElement).value as Endianness)}>
165
- ${[Endianness.LITTLE, Endianness.BIG].map(endianness => {
166
- return html`<option value=${endianness} .selected=${this.#endianness === endianness}
167
- jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(endianness)).track({click: true})}>${
168
- i18n.i18n.lockedString(endianness)}</option>`;
169
- })}
170
- </select>
171
- </label>
172
- `;
173
- // clang-format on
218
+ override performUpdate(): void {
219
+ const viewInput: ViewInput = {
220
+ endianness: this.#endianness,
221
+ buffer: this.#buffer,
222
+ valueTypes: this.#valueTypes,
223
+ valueTypeModes: this.#valueTypeModeConfig,
224
+ memoryLength: this.#memoryLength,
225
+ showSettings: this.#showSettings,
226
+ onValueTypeModeChange: this.#onValueTypeModeChange,
227
+ onJumpToAddressClicked: this.#onJumpToAddressClicked,
228
+ onEndiannessChanged: this.#onEndiannessChanged,
229
+ onValueTypeToggled: this.#onValueTypeToggled,
230
+ onSettingsToggle: this.#onSettingsToggle.bind(this),
231
+ };
232
+ this.#view(viewInput, undefined, this.contentElement);
174
233
  }
175
234
 
176
235
  #onSettingsToggle(): void {
177
236
  this.#showSettings = !this.#showSettings;
178
- this.#render();
179
- }
180
- }
181
-
182
- customElements.define('devtools-linear-memory-inspector-interpreter', LinearMemoryValueInterpreter);
183
-
184
- declare global {
185
- interface HTMLElementTagNameMap {
186
- 'devtools-linear-memory-inspector-interpreter': LinearMemoryValueInterpreter;
237
+ this.requestUpdate();
187
238
  }
188
239
  }
@@ -47,7 +47,7 @@ const BYTE_GROUP_SIZE = 4;
47
47
  export class LinearMemoryViewer extends HTMLElement {
48
48
  readonly #shadow = this.attachShadow({mode: 'open'});
49
49
 
50
- readonly #resizeObserver = new ResizeObserver(() => this.#resize());
50
+ readonly #resizeObserver = new ResizeObserver(() => requestAnimationFrame(this.#resize.bind(this)));
51
51
  #isObservingResize = false;
52
52
 
53
53
  #memory = new Uint8Array();
@@ -4,44 +4,46 @@
4
4
  * found in the LICENSE file.
5
5
  */
6
6
 
7
- :host {
8
- flex: auto;
9
- display: flex;
10
- }
7
+ @scope to (devtools-widget > *) {
8
+ :scope {
9
+ flex: auto;
10
+ display: flex;
11
+ }
11
12
 
12
- .value-interpreter {
13
- border: 1px solid var(--sys-color-divider);
14
- background-color: var(--sys-color-cdt-base-container);
15
- overflow: hidden;
16
- width: 400px;
17
- }
13
+ .value-interpreter {
14
+ border: 1px solid var(--sys-color-divider);
15
+ background-color: var(--sys-color-cdt-base-container);
16
+ overflow: hidden;
17
+ width: 400px;
18
+ }
18
19
 
19
- .settings-toolbar {
20
- min-height: 26px;
21
- display: flex;
22
- flex-wrap: nowrap;
23
- justify-content: space-between;
24
- padding-left: var(--sys-size-3);
25
- padding-right: var(--sys-size-3);
26
- align-items: center;
27
- }
20
+ .settings-toolbar {
21
+ min-height: 26px;
22
+ display: flex;
23
+ flex-wrap: nowrap;
24
+ justify-content: space-between;
25
+ padding-left: var(--sys-size-3);
26
+ padding-right: var(--sys-size-3);
27
+ align-items: center;
28
+ }
28
29
 
29
- .settings-toolbar-button {
30
- padding: 0;
31
- width: 20px;
32
- height: 20px;
33
- border: none;
34
- outline: none;
35
- background-color: transparent;
36
- }
30
+ .settings-toolbar-button {
31
+ padding: 0;
32
+ width: 20px;
33
+ height: 20px;
34
+ border: none;
35
+ outline: none;
36
+ background-color: transparent;
37
+ }
37
38
 
38
- .settings-toolbar-button.active devtools-icon {
39
- color: var(--icon-toggled);
40
- }
39
+ .settings-toolbar-button.active devtools-icon {
40
+ color: var(--icon-toggled);
41
+ }
41
42
 
42
- .divider {
43
- display: block;
44
- height: 1px;
45
- margin-bottom: 12px;
46
- background-color: var(--sys-color-divider);
43
+ .divider {
44
+ display: block;
45
+ height: 1px;
46
+ margin-bottom: 12px;
47
+ background-color: var(--sys-color-divider);
48
+ }
47
49
  }
@@ -8,10 +8,10 @@ import * as Common from '../../core/common/common.js';
8
8
  import * as i18n from '../../core/i18n/i18n.js';
9
9
  import * as Platform from '../../core/platform/platform.js';
10
10
  import * as SDK from '../../core/sdk/sdk.js';
11
+ import * as Annotations from '../../models/annotations/annotations.js';
11
12
  import type * as NetworkTimeCalculator from '../../models/network_time_calculator/network_time_calculator.js';
12
13
  import * as PanelCommon from '../../panels/common/common.js';
13
14
  import * as NetworkForward from '../../panels/network/forward/forward.js';
14
- import * as Annotations from '../../ui/components/annotations/annotations.js';
15
15
  import * as LegacyWrapper from '../../ui/components/legacy_wrapper/legacy_wrapper.js';
16
16
  import {Icon} from '../../ui/kit/kit.js';
17
17
  import type * as SourceFrame from '../../ui/legacy/components/source_frame/source_frame.js';
@@ -42,6 +42,7 @@ import * as Platform from '../../core/platform/platform.js';
42
42
  import * as Root from '../../core/root/root.js';
43
43
  import * as SDK from '../../core/sdk/sdk.js';
44
44
  import * as Protocol from '../../generated/protocol.js';
45
+ import * as Annotations from '../../models/annotations/annotations.js';
45
46
  import * as Bindings from '../../models/bindings/bindings.js';
46
47
  import * as HAR from '../../models/har/har.js';
47
48
  import * as Logs from '../../models/logs/logs.js';
@@ -51,7 +52,6 @@ import * as TextUtils from '../../models/text_utils/text_utils.js';
51
52
  import * as NetworkForward from '../../panels/network/forward/forward.js';
52
53
  import * as Sources from '../../panels/sources/sources.js';
53
54
  import * as Adorners from '../../ui/components/adorners/adorners.js';
54
- import * as Annotations from '../../ui/components/annotations/annotations.js';
55
55
  import * as Buttons from '../../ui/components/buttons/buttons.js';
56
56
  import * as RenderCoordinator from '../../ui/components/render_coordinator/render_coordinator.js';
57
57
  import * as DataGrid from '../../ui/legacy/components/data_grid/data_grid.js';
@@ -40,6 +40,7 @@ import * as Host from '../../core/host/host.js';
40
40
  import * as i18n from '../../core/i18n/i18n.js';
41
41
  import * as Platform from '../../core/platform/platform.js';
42
42
  import * as SDK from '../../core/sdk/sdk.js';
43
+ import * as Annotations from '../../models/annotations/annotations.js';
43
44
  import * as Logs from '../../models/logs/logs.js';
44
45
  import * as NetworkTimeCalculator from '../../models/network_time_calculator/network_time_calculator.js';
45
46
  import * as Trace from '../../models/trace/trace.js';
@@ -47,7 +48,6 @@ import * as Workspace from '../../models/workspace/workspace.js';
47
48
  import * as PanelCommon from '../../panels/common/common.js';
48
49
  import * as NetworkForward from '../../panels/network/forward/forward.js';
49
50
  import * as Tracing from '../../services/tracing/tracing.js';
50
- import * as Annotations from '../../ui/components/annotations/annotations.js';
51
51
  import * as PerfUI from '../../ui/legacy/components/perf_ui/perf_ui.js';
52
52
  import * as SettingsUI from '../../ui/legacy/components/settings_ui/settings_ui.js';
53
53
  import * as UI from '../../ui/legacy/legacy.js';
@@ -30,7 +30,6 @@ import * as Actions from './recorder-actions/recorder-actions.js';
30
30
  import recorderControllerStyles from './recorderController.css.js';
31
31
  import * as Events from './RecorderEvents.js';
32
32
 
33
- // TODO(crbug.com/391381439): Fully migrate off of Constructable Stylesheets.
34
33
  const {html, Decorators, Directives: {ref}, LitElement} = Lit;
35
34
  const {customElement, state} = Decorators;
36
35
 
@@ -171,6 +171,11 @@ export class SecurityPanelSidebar extends UI.Widget.VBox {
171
171
  this.showLastSelectedElement();
172
172
  }
173
173
 
174
+ // Used in web tests
175
+ elementsByOrigin(): Map<string, OriginTreeElement> {
176
+ return this.#elementsByOrigin;
177
+ }
178
+
174
179
  showLastSelectedElement(): void {
175
180
  if (this.#cookieControlsTreeElement &&
176
181
  this.#securitySidebarLastItemSetting.get() === this.#cookieControlsTreeElement.elemId) {
@@ -11,13 +11,14 @@ import * as Common from '../../core/common/common.js';
11
11
  import * as Host from '../../core/host/host.js';
12
12
  import * as i18n from '../../core/i18n/i18n.js';
13
13
  import * as Root from '../../core/root/root.js';
14
+ import * as GreenDev from '../../models/greendev/greendev.js';
14
15
  import * as Buttons from '../../ui/components/buttons/buttons.js';
15
16
  import * as UIHelpers from '../../ui/helpers/helpers.js';
16
17
  import {type Card, createIcon} from '../../ui/kit/kit.js';
17
18
  import * as SettingsUI from '../../ui/legacy/components/settings_ui/settings_ui.js';
18
19
  import * as Components from '../../ui/legacy/components/utils/utils.js';
19
20
  import * as UI from '../../ui/legacy/legacy.js';
20
- import {html, render} from '../../ui/lit/lit.js';
21
+ import {html, nothing, render, type TemplateResult} from '../../ui/lit/lit.js';
21
22
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
22
23
  import {PanelUtils} from '../utils/utils.js';
23
24
 
@@ -51,6 +52,11 @@ const UIStrings = {
51
52
  * @description Message shown in the experiments panel to warn users about any possible unstable features.
52
53
  */
53
54
  theseExperimentsCouldBeUnstable: 'Warning: These experiments could be unstable or unreliable.',
55
+ /**
56
+ * @description Message shown in the GreenDev prototypes panel to warn users about any possible unstable features.
57
+ */
58
+ greenDevUnstable:
59
+ 'Warning: All these features are prototype and very unstable. They exist for user testing and are not designed to be relied on.',
54
60
  /**
55
61
  * @description Message text content in Settings Screen of the Settings
56
62
  */
@@ -603,3 +609,129 @@ export interface ShowSettingsScreenOptions {
603
609
  name?: string;
604
610
  focusTabHeader?: boolean;
605
611
  }
612
+
613
+ export class GreenDevSettingsTab extends UI.Widget.VBox implements SettingsTab {
614
+ #view: View;
615
+
616
+ constructor(view = GREENDEV_VIEW) {
617
+ super({jslog: `${VisualLogging.pane('greendev-prototypes')}`});
618
+ this.element.id = 'greendev-prototypes-tab-content';
619
+
620
+ this.#view = view;
621
+
622
+ this.requestUpdate();
623
+ }
624
+
625
+ highlightObject(_object: Object): void {
626
+ }
627
+
628
+ override performUpdate(): Promise<void>|void {
629
+ const settings = GreenDev.Prototypes.instance().settings();
630
+ this.#view({settings}, {}, this.element);
631
+ }
632
+ }
633
+
634
+ interface GreenDevViewInput {
635
+ settings: GreenDev.GreenDevSettings;
636
+ }
637
+
638
+ type View = (input: GreenDevViewInput, output: object, target: HTMLElement) => void;
639
+ const GREENDEV_VIEW: View = (input, _output, target) => {
640
+ // clang-format off
641
+ render(html`
642
+ <div class="settings-card-container">
643
+ <devtools-card .heading=${'GreenDev prototypes'}>
644
+ <div class="experiments-warning-subsection">
645
+ <devtools-icon .name=${'warning'}></devtools-icon>
646
+ <span>${i18nString(UIStrings.greenDevUnstable)}</span>
647
+ </div>
648
+ <div class="settings-experiments-block">
649
+ ${renderPrototypeCheckboxes(input.settings, ['aiAnnotations', 'inDevToolsFloaty'])}
650
+ </div>
651
+ </devtools-card>
652
+
653
+ <devtools-card .heading=${'GreenDev widgets'}>
654
+ <div class="experiments-warning-subsection">
655
+ <devtools-icon .name=${'warning'}></devtools-icon>
656
+ <span>${i18nString(UIStrings.greenDevUnstable)}</span>
657
+ </div>
658
+ <div class="settings-experiments-block greendev-widgets">
659
+ ${renderWidgetOptions(input.settings)}
660
+ </div>
661
+ </devtools-card>
662
+ </div>
663
+ `, target);
664
+ // clang-format on
665
+ };
666
+
667
+ const GREENDEV_PROTOTYPE_NAMES: Record<keyof GreenDev.GreenDevSettings, string> = {
668
+ inDevToolsFloaty: 'In DevTools context picker',
669
+ aiAnnotations: 'AI auto-annotations',
670
+ inlineWidgets: 'Inline widgets in AI Assistance',
671
+ artifactViewer: 'Widgets in the Artifact viewer'
672
+ };
673
+
674
+ function renderWidgetOptions(settings: GreenDev.GreenDevSettings): TemplateResult {
675
+ function onChange(nowActiveRadio: 'inlineWidgets'|'artifactViewer'|'none') {
676
+ return () => {
677
+ switch (nowActiveRadio) {
678
+ case 'inlineWidgets': {
679
+ settings.artifactViewer.set(false);
680
+ settings.inlineWidgets.set(true);
681
+ break;
682
+ }
683
+ case 'artifactViewer': {
684
+ settings.artifactViewer.set(true);
685
+ settings.inlineWidgets.set(false);
686
+ break;
687
+ }
688
+ case 'none': {
689
+ settings.artifactViewer.set(false);
690
+ settings.inlineWidgets.set(false);
691
+ }
692
+ }
693
+
694
+ UI.InspectorView.InspectorView.instance().displayReloadRequiredWarning(
695
+ i18nString(UIStrings.oneOrMoreSettingsHaveChanged));
696
+ };
697
+ }
698
+ // clang-format off
699
+ return html`
700
+ <p class="settings-experiment">
701
+ <label><input type="radio" name="widgets-choice" @change=${onChange('inlineWidgets')}>${GREENDEV_PROTOTYPE_NAMES['inlineWidgets']}</label>
702
+ </p>
703
+ <p class="settings-experiment">
704
+ <label><input type="radio" name="widgets-choice" @change=${onChange('artifactViewer')}>${GREENDEV_PROTOTYPE_NAMES['artifactViewer']}</label>
705
+ </p>
706
+ <p class="settings-experiment">
707
+ <label><input type="radio" name="widgets-choice" @change=${onChange('none')}>None</label>
708
+ </p>
709
+ `;
710
+ // clang-format on
711
+ }
712
+
713
+ function renderPrototypeCheckboxes(
714
+ settings: GreenDev.GreenDevSettings,
715
+ keys: Array<keyof GreenDev.GreenDevSettings>,
716
+ ): TemplateResult {
717
+ const {bindToSetting} = UI.UIUtils;
718
+
719
+ function showChangeWarning(): void {
720
+ UI.InspectorView.InspectorView.instance().displayReloadRequiredWarning(
721
+ i18nString(UIStrings.oneOrMoreSettingsHaveChanged));
722
+ }
723
+ // clang-format off
724
+ const checkboxes = Object.keys(settings).map(name => {
725
+ const settingName = name as keyof GreenDev.GreenDevSettings;
726
+ if(!keys.includes(settingName)) {
727
+ return nothing;
728
+ }
729
+ const setting = settings[settingName];
730
+ const title = GREENDEV_PROTOTYPE_NAMES[settingName];
731
+ return html`<p class="settings-experiment">
732
+ <devtools-checkbox @change=${showChangeWarning} title=${title} ${bindToSetting(setting)}>${title}</devtools-checkbox>
733
+ </p>`;
734
+ });
735
+ return html`${checkboxes}`;
736
+ // clang-format on
737
+ }
@@ -24,6 +24,14 @@ const UIStrings = {
24
24
  * @description Text in Settings Screen of the Settings
25
25
  */
26
26
  experiments: 'Experiments',
27
+ /**
28
+ * @description Text in Settings Screen of the Settings
29
+ */
30
+ greenDevProtoTypes: 'GreenDev',
31
+ /**
32
+ * @description Command for showing the GreenDev tab in the Settings Screen
33
+ */
34
+ showGreenDev: 'Show GreenDev',
27
35
  /**
28
36
  * @description Title of Ignore list settings
29
37
  */
@@ -154,6 +162,22 @@ UI.ViewManager.registerViewExtension({
154
162
  iconName: 'clear-list',
155
163
  });
156
164
 
165
+ UI.ViewManager.registerViewExtension({
166
+ location: UI.ViewManager.ViewLocationValues.SETTINGS_VIEW,
167
+ id: 'greendev-prototypes',
168
+ title: i18nLazyString(UIStrings.greenDevProtoTypes),
169
+ commandPrompt: i18nLazyString(UIStrings.showGreenDev),
170
+ order: 101,
171
+ async loadView() {
172
+ const Settings = await loadSettingsModule();
173
+ return new Settings.SettingsScreen.GreenDevSettingsTab();
174
+ },
175
+ iconName: 'experiment',
176
+ condition: config => {
177
+ return Boolean(config?.devToolsGreenDevUi?.enabled);
178
+ },
179
+ });
180
+
157
181
  UI.ViewManager.registerViewExtension({
158
182
  location: UI.ViewManager.ViewLocationValues.SETTINGS_VIEW,
159
183
  id: 'keybinds',
@@ -195,3 +195,7 @@ devtools-button.link-icon {
195
195
  color: HighlightText;
196
196
  }
197
197
  }
198
+
199
+ .greendev-widgets input[type="radio"] {
200
+ margin: 6px;
201
+ }