chrome-devtools-frontend 1.0.1697998 → 1.0.1698733

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 (102) hide show
  1. package/.agents/skills/version-control/SKILL.md +21 -9
  2. package/front_end/core/platform/HostRuntime.ts +12 -0
  3. package/front_end/core/platform/api/HostRuntime.ts +13 -0
  4. package/front_end/core/platform/browser/HostRuntime.ts +34 -0
  5. package/front_end/core/platform/node/HostRuntime.ts +40 -0
  6. package/front_end/core/sdk/AnimationModel.ts +12 -98
  7. package/front_end/core/sdk/CSSModel.ts +4 -2
  8. package/front_end/core/sdk/CSSPropertyParser.ts +4 -4
  9. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +4 -44
  10. package/front_end/core/sdk/Connections.ts +6 -1
  11. package/front_end/core/sdk/ConsoleModel.ts +1 -12
  12. package/front_end/core/sdk/DOMModel.ts +3 -51
  13. package/front_end/core/sdk/DebuggerModel.ts +9 -8
  14. package/front_end/core/sdk/NetworkRequest.ts +1 -1
  15. package/front_end/core/sdk/PageFunctions.ts +187 -0
  16. package/front_end/core/sdk/Resource.ts +1 -1
  17. package/front_end/core/sdk/RuntimeModel.ts +1 -20
  18. package/front_end/core/sdk/Script.ts +21 -0
  19. package/front_end/core/sdk/SourceMap.ts +15 -2
  20. package/front_end/core/sdk/SourceMapCache.ts +13 -10
  21. package/front_end/core/sdk/SourceMapManager.ts +11 -9
  22. package/front_end/core/sdk/SourceMapScopeChainEntry.ts +59 -17
  23. package/front_end/core/sdk/SourceMapScopesInfo.ts +8 -2
  24. package/front_end/entrypoints/heap_snapshot_worker/ContextAnalyzer.ts +635 -0
  25. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +26 -12
  26. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshotLoader.ts +16 -2
  27. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.ts +4 -4
  28. package/front_end/entrypoints/heap_snapshot_worker/heap_snapshot_worker.ts +2 -0
  29. package/front_end/entrypoints/shell/shell.ts +1 -1
  30. package/front_end/models/ai_assistance/DOMHelpers.ts +95 -0
  31. package/front_end/models/ai_assistance/EvaluateAction.ts +5 -42
  32. package/front_end/models/ai_assistance/ExtensionScope.ts +2 -31
  33. package/front_end/models/ai_assistance/agents/AiAgent.ts +2 -1
  34. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -4
  35. package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
  36. package/front_end/models/ai_assistance/contexts/DOMNodeContext.ts +10 -7
  37. package/front_end/models/ai_assistance/contexts/FileContext.ts +2 -10
  38. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +3 -2
  39. package/front_end/models/ai_assistance/tools/ListSources.ts +21 -14
  40. package/front_end/models/bindings/CompilerScriptMapping.ts +3 -10
  41. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +48 -17
  42. package/front_end/models/bindings/ResourceScriptMapping.ts +2 -2
  43. package/front_end/models/bindings/StylesSourceMapping.ts +1 -1
  44. package/front_end/models/comment_manager/CD4ABridge.ts +55 -12
  45. package/front_end/models/comment_manager/CommentManager.ts +46 -91
  46. package/front_end/models/comment_manager/CommentThread.ts +145 -0
  47. package/front_end/models/comment_manager/comment_manager.ts +2 -0
  48. package/front_end/models/emulation/DeviceModeModel.ts +53 -0
  49. package/front_end/models/extensions/ExtensionAPI.ts +8 -6
  50. package/front_end/models/extensions/ExtensionEndpoint.ts +11 -8
  51. package/front_end/models/extensions/HostUrlPattern.ts +4 -3
  52. package/front_end/models/extensions/LanguageExtensionEndpoint.ts +3 -2
  53. package/front_end/models/extensions/RecorderExtensionEndpoint.ts +2 -1
  54. package/front_end/models/formatter/FormatterWorkerPool.ts +4 -6
  55. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +55 -0
  56. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +18 -14
  57. package/front_end/models/issues_manager/IssuesManager.ts +5 -0
  58. package/front_end/models/issues_manager/WebInstallIssue.ts +63 -0
  59. package/front_end/models/issues_manager/descriptions/webInstallManifestMissingId.md +3 -0
  60. package/front_end/models/issues_manager/descriptions/webInstallManifestMissingNameOrShortName.md +3 -0
  61. package/front_end/models/issues_manager/descriptions/webInstallManifestParsingOrNetworkError.md +3 -0
  62. package/front_end/models/issues_manager/descriptions/webInstallNoManifest.md +3 -0
  63. package/front_end/models/issues_manager/descriptions/webInstallStartUrlInvalid.md +3 -0
  64. package/front_end/models/issues_manager/issues_manager.ts +2 -0
  65. package/front_end/models/workspace/UISourceCode.ts +20 -0
  66. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +4 -6
  67. package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +4 -10
  68. package/front_end/{ui/comments → panels/common}/CommentThreadWidget.ts +4 -4
  69. package/front_end/{ui/comments → panels/common}/CommentsOverlayWidget.ts +39 -62
  70. package/front_end/{ui/comments → panels/common}/CommentsStatusBarPill.ts +5 -5
  71. package/front_end/panels/common/ExtensionServer.ts +2 -1
  72. package/front_end/{ui/comments → panels/common}/commentsOverlay.css +2 -1
  73. package/front_end/{ui/comments/comments-meta.ts → panels/common/common-meta.ts} +11 -11
  74. package/front_end/panels/common/common.ts +3 -0
  75. package/front_end/panels/elements/AdoptedStyleSheetTreeElement.ts +3 -3
  76. package/front_end/panels/elements/ElementsPanel.ts +5 -1
  77. package/front_end/panels/elements/ElementsTreeElement.ts +4 -1
  78. package/front_end/panels/elements/ElementsTreeOutline.ts +58 -51
  79. package/front_end/panels/elements/PropertiesWidget.ts +11 -10
  80. package/front_end/panels/elements/PropertyRenderer.ts +29 -25
  81. package/front_end/panels/elements/StylePropertyTreeElement.ts +6 -6
  82. package/front_end/panels/elements/elementsTreeOutline.css +7 -1
  83. package/front_end/panels/emulation/DeviceModeToolbar.ts +2 -3
  84. package/front_end/panels/event_listeners/EventListenersView.ts +33 -44
  85. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +6 -7
  86. package/front_end/panels/linear_memory_inspector/components/linearMemoryInspector.css +5 -1
  87. package/front_end/panels/linear_memory_inspector/linear_memory_inspector-meta.ts +1 -1
  88. package/front_end/panels/recorder/stepView.css +1 -0
  89. package/front_end/panels/security/SecurityPanel.ts +5 -5
  90. package/front_end/panels/security/SecurityPanelSidebar.ts +2 -11
  91. package/front_end/panels/sources/DebuggerPlugin.ts +1 -1
  92. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +11 -16
  93. package/front_end/panels/sources/sources-meta.ts +1 -1
  94. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +0 -3
  95. package/front_end/third_party/chromium/README.chromium +1 -1
  96. package/front_end/ui/comments/CommentOverlayManager.ts +28 -110
  97. package/front_end/ui/comments/comments.ts +0 -6
  98. package/front_end/ui/legacy/Treeoutline.ts +4 -0
  99. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +14 -7
  100. package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
  101. package/package.json +1 -1
  102. /package/front_end/{ui/comments → panels/common}/commentThreadWidget.css +0 -0
@@ -17,7 +17,7 @@ import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
17
17
 
18
18
  import {frameworkEventListeners} from './EventListenersUtils.js';
19
19
  import eventListenersViewStyles from './eventListenersView.css.js';
20
- const {widget} = UI.Widget;
20
+ const {widget, widgetRef} = UI.Widget;
21
21
  const {html, render} = Lit;
22
22
  const {repeat} = Lit.Directives;
23
23
 
@@ -54,16 +54,23 @@ const UIStrings = {
54
54
  const str_ = i18n.i18n.registerUIStrings('panels/event_listeners/EventListenersView.ts', UIStrings);
55
55
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
56
56
 
57
+ interface ListenerEntry {
58
+ object: SDK.RemoteObject.RemoteObject;
59
+ listener: SDK.DOMDebuggerModel.EventListener;
60
+ objectTree: ObjectUI.ObjectPropertiesSection.ObjectTree;
61
+ }
62
+
57
63
  interface ViewInput {
58
64
  togglePassiveListener(listener: SDK.DOMDebuggerModel.EventListener): void;
59
65
  removeListener(listener: SDK.DOMDebuggerModel.EventListener): boolean;
60
66
  reveal(object: SDK.RemoteObject.RemoteObject): void;
61
67
  linkifier: Components.Linkifier.Linkifier;
62
- listeners: Map<string, Array<{object: SDK.RemoteObject.RemoteObject, listener: SDK.DOMDebuggerModel.EventListener}>>;
68
+ listeners: Map<string, ListenerEntry[]>;
63
69
  filter?: {showFramework: boolean, showPassive: boolean, showBlocking: boolean};
64
70
  }
65
71
 
66
72
  type View = (input: ViewInput, output: object, target: HTMLElement) => void;
73
+
67
74
  export const DEFAULT_VIEW: View = (input, output, target) => {
68
75
  const types = input.listeners.keys().toArray().sort();
69
76
 
@@ -92,37 +99,6 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
92
99
  void menu.show();
93
100
  };
94
101
 
95
- const listenerProperties = (listener: SDK.DOMDebuggerModel.EventListener): Iterable<Lit.TemplateResult> => {
96
- const runtimeModel = listener.domDebuggerModel().runtimeModel();
97
- const properties = [
98
- new ObjectUI.ObjectPropertiesSection.ObjectTreeNode(
99
- runtimeModel.createRemotePropertyFromPrimitiveValue('useCapture', listener.useCapture()), undefined, {
100
- readOnly: false,
101
- propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
102
- }),
103
- new ObjectUI.ObjectPropertiesSection.ObjectTreeNode(
104
- runtimeModel.createRemotePropertyFromPrimitiveValue('passive', listener.passive()), undefined, {
105
- readOnly: false,
106
- propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
107
- }),
108
- new ObjectUI.ObjectPropertiesSection.ObjectTreeNode(
109
- runtimeModel.createRemotePropertyFromPrimitiveValue('once', listener.once()), undefined, {
110
- readOnly: false,
111
- propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
112
- }),
113
- ];
114
- if (typeof listener.handler() !== 'undefined') {
115
- properties.push(new ObjectUI.ObjectPropertiesSection.ObjectTreeNode(
116
- new SDK.RemoteObject.RemoteObjectProperty('handler', listener.handler()), undefined, {
117
- readOnly: false,
118
- propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
119
- }));
120
- }
121
- return ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement
122
- .createPropertyNodes({properties}, true, true, undefined)
123
- .map(node => html`<devtools-tree-wrapper .treeElement=${node}></devtools-tree-wrapper>`);
124
- };
125
-
126
102
  const shouldHide = (listenerOrType: SDK.DOMDebuggerModel.EventListener|string): boolean => {
127
103
  if (!input.filter) {
128
104
  return false;
@@ -183,7 +159,7 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
183
159
  <li role=treeitem toggle-on-click aria-label="${type}, event listener" ?hidden=${shouldHide(type)}>
184
160
  ${type}
185
161
  <ul role=group>
186
- ${repeat(input.listeners.get(type) ?? [], ({listener}) => listener, ({listener, object}) => html`
162
+ ${repeat(input.listeners.get(type) ?? [], ({listener}) => listener, ({listener, object, objectTree}) => html`
187
163
  <li role=treeitem
188
164
  data-origin=${listener.origin()}
189
165
  @contextmenu=${(e: Event) => onContextMenu(e, listener, object)}
@@ -213,9 +189,8 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
213
189
  undefined, {tabStop: true})}
214
190
  </span>
215
191
  </span>
216
- <ul role=group>
217
- ${listenerProperties(listener)}
218
- </ul>
192
+ <ul role=group ${widget(ObjectUI.ObjectPropertiesSection.ObjectTreeWidget, {objectTree})} ${
193
+ widgetRef(ObjectUI.ObjectPropertiesSection.ObjectTreeWidget, () => {})}></ul>
219
194
  </li>`)}
220
195
  </ul>
221
196
  </li>`)}
@@ -229,8 +204,7 @@ export class EventListenersView extends UI.Widget.VBox {
229
204
  #objects: Array<SDK.RemoteObject.RemoteObject|null> = [];
230
205
  #filter: {showFramework: boolean, showPassive: boolean, showBlocking: boolean}|undefined;
231
206
  #view: View;
232
- #listeners?:
233
- Map<string, Array<{object: SDK.RemoteObject.RemoteObject, listener: SDK.DOMDebuggerModel.EventListener}>>;
207
+ #listeners?: Map<string, ListenerEntry[]>;
234
208
  #linkifier = new Components.Linkifier.Linkifier();
235
209
  constructor(element?: HTMLElement, view: View = DEFAULT_VIEW) {
236
210
  super(element);
@@ -271,6 +245,7 @@ export class EventListenersView extends UI.Widget.VBox {
271
245
  filter: this.#filter,
272
246
  togglePassiveListener: (listener: SDK.DOMDebuggerModel.EventListener) => {
273
247
  void listener.togglePassive().then(() => {
248
+ this.#listeners = undefined;
274
249
  this.requestUpdate();
275
250
  });
276
251
  },
@@ -305,14 +280,27 @@ export class EventListenersView extends UI.Widget.VBox {
305
280
  this.eventListenersArrivedForTest();
306
281
  }
307
282
 
308
- static async #loadListeners(objects: SDK.RemoteObject.RemoteObject[]): Promise<
309
- Map<string, Array<{object: SDK.RemoteObject.RemoteObject, listener: SDK.DOMDebuggerModel.EventListener}>>> {
283
+ static #createObjectTree(listener: SDK.DOMDebuggerModel.EventListener): ObjectUI.ObjectPropertiesSection.ObjectTree {
284
+ const object = SDK.RemoteObject.RemoteObject.fromLocalObject({
285
+ useCapture: listener.useCapture(),
286
+ passive: listener.passive(),
287
+ once: listener.once(),
288
+ ...(typeof listener.handler() !== 'undefined' ? {handler: listener.handler()} : {}),
289
+ });
290
+ const objectTree = new ObjectUI.ObjectPropertiesSection.ObjectTree(object, {
291
+ readOnly: false,
292
+ propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
293
+ });
294
+ objectTree.expanded = true;
295
+ return objectTree;
296
+ }
297
+
298
+ static async #loadListeners(objects: SDK.RemoteObject.RemoteObject[]): Promise<Map<string, ListenerEntry[]>> {
310
299
  return Map.groupBy((await Promise.all(objects.map(this.#loadListenersForObject))).flat(),
311
300
  ({listener}) => listener.type());
312
301
  }
313
302
 
314
- static async #loadListenersForObject(object: SDK.RemoteObject.RemoteObject):
315
- Promise<Array<{object: SDK.RemoteObject.RemoteObject, listener: SDK.DOMDebuggerModel.EventListener}>> {
303
+ static async #loadListenersForObject(object: SDK.RemoteObject.RemoteObject): Promise<ListenerEntry[]> {
316
304
  const domDebuggerModel = object.runtimeModel().target().model(SDK.DOMDebuggerModel.DOMDebuggerModel);
317
305
  const [eventListeners, frameworkEventListenersObject] =
318
306
  await Promise.all([domDebuggerModel?.eventListeners(object), frameworkEventListeners(object)]);
@@ -335,7 +323,8 @@ export class EventListenersView extends UI.Widget.VBox {
335
323
  }
336
324
 
337
325
  return [eventListeners, frameworkEventListenersObject.eventListeners].flatMap(
338
- listeners => listeners.map(listener => ({object, listener})));
326
+ listeners => listeners.map(
327
+ listener => ({object, listener, objectTree: EventListenersView.#createObjectTree(listener)})));
339
328
 
340
329
  function isInternalEventListener(this: Array<Platform.Constructor.Constructor<unknown>>): boolean[] {
341
330
  const isInternal = [];
@@ -87,7 +87,7 @@ interface SerializableSettings {
87
87
 
88
88
  export class LinearMemoryInspectorController extends SDK.TargetManager.SDKModelObserver<SDK.RuntimeModel.RuntimeModel>
89
89
  implements Common.Revealer.Revealer<SDK.RemoteObject.LinearMemoryInspectable>,
90
- UI.ContextMenu.Provider<ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement> {
90
+ UI.ContextMenu.Provider<ObjectUI.ObjectPropertiesSection.ObjectTreeNode> {
91
91
  #paneInstance = LinearMemoryInspectorPane.instance();
92
92
  #bufferIdToRemoteObject = new Map<string, SDK.RemoteObject.RemoteObject>();
93
93
  #bufferIdToHighlightInfo = new Map<string, LinearMemoryInspectorComponents.LinearMemoryViewerUtils.HighlightInfo>();
@@ -315,12 +315,11 @@ export class LinearMemoryInspectorController extends SDK.TargetManager.SDKModelO
315
315
  void UI.ViewManager.ViewManager.instance().showView('linear-memory-inspector', omitFocus);
316
316
  }
317
317
 
318
- appendApplicableItems(
319
- _event: Event, contextMenu: UI.ContextMenu.ContextMenu,
320
- target: ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement): void {
321
- if (target.property.object?.isLinearMemoryInspectable()) {
322
- const expression = target.property.path;
323
- const object = target.property.object;
318
+ appendApplicableItems(_event: Event, contextMenu: UI.ContextMenu.ContextMenu,
319
+ target: ObjectUI.ObjectPropertiesSection.ObjectTreeNode): void {
320
+ if (target.object?.isLinearMemoryInspectable()) {
321
+ const expression = target.path;
322
+ const object = target.object;
324
323
  contextMenu.debugSection().appendItem(
325
324
  i18nString(UIStrings.openInMemoryInspectorPanel),
326
325
  this.reveal.bind(this, new SDK.RemoteObject.LinearMemoryInspectable(object, expression)),
@@ -29,7 +29,11 @@
29
29
  justify-content: center;
30
30
  }
31
31
 
32
- .navigator-widget ~ devtools-linear-memory-inspector-viewer {
32
+ .navigator-widget {
33
+ flex: none;
34
+ }
35
+
36
+ .navigator-widget + devtools-linear-memory-inspector-viewer {
33
37
  margin-top: var(--sys-size-6);
34
38
  }
35
39
 
@@ -52,7 +52,7 @@ UI.ContextMenu.registerProvider({
52
52
  },
53
53
  contextTypes() {
54
54
  return [
55
- ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement,
55
+ ObjectUI.ObjectPropertiesSection.ObjectTreeNode,
56
56
  ];
57
57
  },
58
58
  });
@@ -215,6 +215,7 @@ devtools-recorder-step-editor.is-selected {
215
215
  .step-actions {
216
216
  border: none;
217
217
  border-radius: 0;
218
+ flex-shrink: 0;
218
219
  height: var(--sys-size-11);
219
220
 
220
221
  --override-select-menu-show-button-border-radius: 0;
@@ -608,7 +608,7 @@ export class SecurityPanel extends UI.Panel.Panel implements SDK.TargetManager.S
608
608
  SDK.ResourceTreeModel.ResourceTreeModel, SDK.ResourceTreeModel.Events.PrimaryPageChanged,
609
609
  this.onPrimaryPageChanged, this);
610
610
 
611
- this.sidebar.showLastSelectedElement();
611
+ this.sidebar.showOverview();
612
612
  }
613
613
 
614
614
  static instance(opts: {forceNew: boolean|null} = {forceNew: null}): SecurityPanel {
@@ -657,7 +657,7 @@ export class SecurityPanel extends UI.Panel.Panel implements SDK.TargetManager.S
657
657
  override wasShown(): void {
658
658
  super.wasShown();
659
659
  if (!this.visibleView) {
660
- this.sidebar.showLastSelectedElement();
660
+ this.sidebar.showOverview();
661
661
  }
662
662
  }
663
663
 
@@ -808,7 +808,7 @@ export class SecurityPanel extends UI.Panel.Panel implements SDK.TargetManager.S
808
808
  const {frame} = event.data;
809
809
  const request = this.lastResponseReceivedForLoaderId.get(frame.loaderId);
810
810
 
811
- this.sidebar.showLastSelectedElement();
811
+ this.sidebar.showOverview();
812
812
  this.sidebar.clearOrigins();
813
813
  this.origins.clear();
814
814
  this.lastResponseReceivedForLoaderId.clear();
@@ -831,8 +831,8 @@ export class SecurityPanel extends UI.Panel.Panel implements SDK.TargetManager.S
831
831
  private onInterstitialShown(): void {
832
832
  // The panel might have been displaying the origin view on the
833
833
  // previously loaded page. When showing an interstitial, switch
834
- // back to the sidebar's last shown view.
835
- this.sidebar.showLastSelectedElement();
834
+ // back to the overview view.
835
+ this.sidebar.showOverview();
836
836
  this.sidebar.toggleOriginsList(true /* hidden */);
837
837
  }
838
838
 
@@ -2,7 +2,6 @@
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 Common from '../../core/common/common.js';
6
5
  import * as i18n from '../../core/i18n/i18n.js';
7
6
  import type * as Platform from '../../core/platform/platform.js';
8
7
  import * as Protocol from '../../generated/protocol.js';
@@ -208,7 +207,6 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
208
207
  };
209
208
 
210
209
  export class SecurityPanelSidebar extends UI.Widget.VBox {
211
- readonly #securitySidebarLastItemSetting: Common.Settings.Setting<string>;
212
210
  #mainOrigin: string|null = null;
213
211
  #origins = new Map<Platform.DevToolsPath.UrlString, Protocol.Security.SecurityState>();
214
212
  #originsHidden = false;
@@ -222,9 +220,6 @@ export class SecurityPanelSidebar extends UI.Widget.VBox {
222
220
  super(element);
223
221
  this.#view = view;
224
222
  this.registerRequiredCSS(lockIconStyles, sidebarStyles);
225
-
226
- this.#securitySidebarLastItemSetting =
227
- Common.Settings.Settings.instance().createSetting('security-last-selected-element-path', '');
228
223
  }
229
224
 
230
225
  set onShowOrigin(callback: (origin: Platform.DevToolsPath.UrlString|null) => void) {
@@ -233,12 +228,11 @@ export class SecurityPanelSidebar extends UI.Widget.VBox {
233
228
 
234
229
  override wasShown(): void {
235
230
  super.wasShown();
236
- this.showLastSelectedElement();
231
+ this.requestUpdate();
237
232
  }
238
233
 
239
- showLastSelectedElement(): void {
234
+ showOverview(): void {
240
235
  this.#selectedElementId = 'overview';
241
- this.#securitySidebarLastItemSetting.set('overview');
242
236
  this.requestUpdate();
243
237
  this.#onShowOrigin?.(null);
244
238
  }
@@ -295,7 +289,6 @@ export class SecurityPanelSidebar extends UI.Widget.VBox {
295
289
  const element = {
296
290
  select: () => {
297
291
  this.#selectedElementId = origin;
298
- this.#securitySidebarLastItemSetting.set(origin);
299
292
  this.requestUpdate();
300
293
  this.#onShowOrigin?.(origin);
301
294
  },
@@ -312,7 +305,6 @@ export class SecurityPanelSidebar extends UI.Widget.VBox {
312
305
 
313
306
  set selectedOrigin(origin: Platform.DevToolsPath.UrlString|null) {
314
307
  this.#selectedElementId = origin ?? 'overview';
315
- this.#securitySidebarLastItemSetting.set(this.#selectedElementId);
316
308
  this.requestUpdate();
317
309
  this.#onShowOrigin?.(origin);
318
310
  }
@@ -333,7 +325,6 @@ export class SecurityPanelSidebar extends UI.Widget.VBox {
333
325
  const output: ViewOutput = {
334
326
  onElementSelected: (id: string) => {
335
327
  this.#selectedElementId = id;
336
- this.#securitySidebarLastItemSetting.set(id);
337
328
  this.requestUpdate();
338
329
  },
339
330
  onShowOrigin: (origin: Platform.DevToolsPath.UrlString|null) => {
@@ -540,7 +540,7 @@ export class DebuggerPlugin extends Plugin {
540
540
  if (!url) {
541
541
  return;
542
542
  }
543
- scriptFile.addSourceMapURL(url);
543
+ scriptFile.addSourceMapURL(url, SDK.SourceMap.SourceMapProvenance.USER);
544
544
  }
545
545
 
546
546
  function addDebugInfoURL(
@@ -350,6 +350,7 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
350
350
  // clang-format off
351
351
  return html`<li
352
352
  class=${classMap({'watch-expression-tree-item': true, 'watch-expression-editing': e.editing })}
353
+ ?open=${Boolean(e.result?.expanded)}
353
354
  @keydown=${onExpressionKeydown.bind(undefined, e)}
354
355
  @expand=${(event: UI.TreeOutline.TreeViewElement.ExpandEvent) => input.onExpand(e, event.detail.expanded)}
355
356
  role=treeitem>
@@ -364,12 +365,8 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
364
365
  onContextMenu: (event: Event) => onContextMenu(e, event),
365
366
  })}></devtools-widget>
366
367
  ${e.editing || !e.result || e.exceptionDetails ||
367
- !e.result.hasChildren || e.result.object.customPreview() ? nothing : html`
368
- <ul role=group>
369
- ${ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement.createPropertyNodes(
370
- e.result.children ?? {}, false /* skipProto */, false /* skipGettersAndSetters */, input.linkifier).map(
371
- node => html`<devtools-tree-wrapper .treeElement=${node}></devtools-tree-wrapper>`)}
372
- </ul>`}
368
+ !e.result.hasChildren || e.result.object.customPreview() ? nothing :
369
+ ObjectUI.ObjectPropertiesSection.renderObjectTree(e.result, input.linkifier)}
373
370
  </li>`;
374
371
  // clang-format on
375
372
  };
@@ -552,10 +549,9 @@ export class WatchExpressionsSidebarPane extends UI.Widget.VBox implements UI.Ac
552
549
  this.saveExpressions();
553
550
  this.requestUpdate();
554
551
  },
555
- onExpand: async(e: WatchExpression, expanded: boolean): Promise<void> => {
556
- if (expanded) {
557
- await e.result?.populateChildrenIfNeeded();
558
- this.requestUpdate();
552
+ onExpand: (e: WatchExpression, expanded: boolean): void => {
553
+ if (e.result) {
554
+ e.result.expanded = expanded;
559
555
  }
560
556
  },
561
557
  },
@@ -600,13 +596,12 @@ export class WatchExpressionsSidebarPane extends UI.Widget.VBox implements UI.Ac
600
596
  return true;
601
597
  }
602
598
 
603
- appendApplicableItems(
604
- _event: Event, contextMenu: UI.ContextMenu.ContextMenu,
605
- target: ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement|UISourceCodeFrame): void {
606
- if (target instanceof ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement) {
607
- if (!target.property.property.synthetic) {
599
+ appendApplicableItems(_event: Event, contextMenu: UI.ContextMenu.ContextMenu,
600
+ target: ObjectUI.ObjectPropertiesSection.ObjectTreeNode|UISourceCodeFrame): void {
601
+ if (target instanceof ObjectUI.ObjectPropertiesSection.ObjectTreeNode) {
602
+ if (!target.property.synthetic) {
608
603
  contextMenu.debugSection().appendItem(i18nString(UIStrings.addPropertyPathToWatch),
609
- () => this.#focusAndAddExpressionToWatch(target.path()),
604
+ () => this.#focusAndAddExpressionToWatch(target.path),
610
605
  {jslogContext: 'add-property-path-to-watch'});
611
606
  }
612
607
  return;
@@ -2035,7 +2035,7 @@ UI.ContextMenu.registerProvider({
2035
2035
  },
2036
2036
  contextTypes() {
2037
2037
  return [
2038
- ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement,
2038
+ ObjectUI.ObjectPropertiesSection.ObjectTreeNode,
2039
2039
  ...maybeRetrieveContextTypes(Sources => [Sources.UISourceCodeFrame.UISourceCodeFrame]),
2040
2040
  ];
2041
2041
  },
@@ -1621,9 +1621,6 @@ export class Overlays extends EventTarget {
1621
1621
  pin.setAttribute('role', 'button');
1622
1622
  pin.setAttribute('tabindex', '0');
1623
1623
  UI.ARIAUtils.setLabel(pin, i18nString(UIStrings.commentPin));
1624
- if (overlay.commentThreadId) {
1625
- pin.setAttribute('data-comment-id', overlay.commentThreadId);
1626
- }
1627
1624
  const cursor = document.createElement('div');
1628
1625
  cursor.classList.add('comment-cursor');
1629
1626
  pin.appendChild(cursor);
@@ -1,7 +1,7 @@
1
1
  Name: Dependencies sourced from the upstream `chromium` repository
2
2
  URL: Internal
3
3
  Version: N/A
4
- Revision: c6c44ec6a59862a1b0027bc453fcacb9dce75c9e
4
+ Revision: 87625275b7c30150efc10c7dbf7c86982459704f
5
5
  Update Mechanism: Manual (https://crbug.com/428069060)
6
6
  License: BSD-3-Clause
7
7
  License File: LICENSE
@@ -36,8 +36,6 @@ export interface PinPositionData {
36
36
  index: number;
37
37
  }
38
38
 
39
- export type PendingPinPositionData = Omit<PinPositionData, 'id'>;
40
-
41
39
  export interface HighlightRectData {
42
40
  id: string;
43
41
  top: number;
@@ -47,21 +45,10 @@ export interface HighlightRectData {
47
45
  visible: boolean;
48
46
  }
49
47
 
50
- export type PendingHighlightRectData = Omit<HighlightRectData, 'id'>;
51
-
52
- export interface PendingDraft {
53
- element: Element;
54
- anchor: CommentAnchorSignature;
55
- pin: PendingPinPositionData|null;
56
- highlight: PendingHighlightRectData|null;
57
- pinOffset: {offsetX: number, offsetY: number}|null;
58
- }
59
-
60
48
  export interface CreateCommentOptions {
61
49
  author?: 'DEVELOPER'|'AGENT';
62
50
  changes?: CommentManager.CommentManager.ChangeRecord[];
63
51
  coordinates?: {clientX: number, clientY: number};
64
- pendingDraft?: PendingDraft;
65
52
  }
66
53
 
67
54
  export interface HoverHighlightData {
@@ -99,7 +86,6 @@ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<Ev
99
86
  #hoverData: HoverHighlightData|null = null;
100
87
  #pinPositions: PinPositionData[] = [];
101
88
  #highlightRects: HighlightRectData[] = [];
102
- #pendingDraft: PendingDraft|null = null;
103
89
 
104
90
  #clickListener?: (event: Event) => void;
105
91
  #hoverListener?: (event: Event) => void;
@@ -133,6 +119,7 @@ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<Ev
133
119
  #mutationObserver?: MutationObserver;
134
120
  #rematchTimeoutId?: ReturnType<typeof setTimeout>;
135
121
  #cursorElement: HTMLElement|null = null;
122
+ #isCreatingComment = false;
136
123
 
137
124
  constructor(commentManager: CommentManager.CommentManager.CommentManager) {
138
125
  super();
@@ -140,7 +127,9 @@ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<Ev
140
127
  this.#commentManager.addEventListener(
141
128
  CommentManager.CommentManager.Events.COMMENT_THREADS_CHANGED,
142
129
  () => {
143
- this.#updatePositions();
130
+ if (!this.#isCreatingComment) {
131
+ this.#updatePositions();
132
+ }
144
133
  },
145
134
  this,
146
135
  );
@@ -149,7 +138,7 @@ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<Ev
149
138
  ({data: active}) => {
150
139
  if (!active) {
151
140
  this.#clearHover();
152
- this.clearPendingAnchor();
141
+ this.clearDraftThreads();
153
142
  }
154
143
  document.body.style.cursor = active ? COMMENT_MODE_CURSOR : '';
155
144
  },
@@ -237,83 +226,58 @@ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<Ev
237
226
  return this.#highlightRects;
238
227
  }
239
228
 
240
- getPendingDraft(): PendingDraft|null {
241
- return this.#pendingDraft;
229
+ getAnchorElement(thread: CommentThread): Element|undefined {
230
+ return this.#liveNodeCache.get(thread);
242
231
  }
243
232
 
244
- clearPendingAnchor(): void {
245
- if (!this.#pendingDraft) {
246
- return;
247
- }
248
-
249
- if (!this.#observedThreads.has(this.#pendingDraft.element)) {
250
- this.#intersectionObserver?.unobserve(this.#pendingDraft.element);
233
+ clearDraftThreads(): void {
234
+ const draftThreads = this.#commentManager.getCommentThreads().filter(t => t.status === 'DRAFT');
235
+ for (const thread of draftThreads) {
236
+ this.removeCommentThread(thread.id);
251
237
  }
252
- this.#pendingDraft = null;
253
- this.#updatePositions();
254
238
  }
255
239
 
256
240
  handleElementClick(element: Element, options?: {clientX: number, clientY: number}): boolean {
257
241
  if (!this.isCommentMode() || closestAcrossShadow(element, '.comment-thread-widget')) {
258
242
  return false;
259
243
  }
260
- this.clearPendingAnchor();
244
+ this.clearDraftThreads();
261
245
 
262
246
  const resolved = this.#resolveAnchor(element, options);
263
247
  if (!resolved) {
264
248
  return false;
265
249
  }
266
- const {anchor, anchorElement: anchorEl} = resolved;
250
+ const {anchorElement: anchorEl} = resolved;
267
251
  const visibleRect = computeVisibleRect(anchorEl);
268
252
  if (!visibleRect) {
269
253
  return false;
270
254
  }
271
- const anchorRect = anchorEl.getBoundingClientRect();
272
255
 
273
- let pinOffset: {offsetX: number, offsetY: number}|null = null;
274
- if (options) {
275
- pinOffset = {
276
- offsetX: Math.min(Math.max(options.clientX, visibleRect.left), visibleRect.right) - anchorRect.left,
277
- offsetY: Math.min(Math.max(options.clientY, visibleRect.top), visibleRect.bottom) - anchorRect.top,
278
- };
279
- }
280
-
281
- this.#pendingDraft = {
282
- element: anchorEl,
283
- anchor,
284
- pin: null,
285
- highlight: null,
286
- pinOffset,
287
- };
288
- const observer = this.#getIntersectionObserver();
289
- if (!this.#observedThreads.has(anchorEl)) {
290
- observer.observe(anchorEl);
291
- }
292
- this.#updatePositions();
293
- return true;
256
+ const thread = this.createComment(element, undefined, {coordinates: options});
257
+ return thread !== null;
294
258
  }
295
259
 
296
260
  createComment(
297
261
  element: Element,
298
- text: string,
262
+ text?: string,
299
263
  options?: CreateCommentOptions,
300
264
  ): CommentThread|null {
301
265
  const author = options?.author ?? 'DEVELOPER';
302
266
  const changes = options?.changes;
303
- const pendingDraft = options?.pendingDraft;
304
- let resolved: {anchor: CommentAnchorSignature, anchorElement: Element}|null;
305
- if (pendingDraft) {
306
- resolved = {anchor: pendingDraft.anchor, anchorElement: pendingDraft.element};
307
- } else {
308
- resolved = this.#resolveAnchor(element, options?.coordinates);
309
- if (!resolved) {
310
- return null;
311
- }
267
+ const resolved = this.#resolveAnchor(element, options?.coordinates);
268
+ if (!resolved) {
269
+ return null;
312
270
  }
313
271
 
314
272
  const {anchor, anchorElement} = resolved;
315
273
 
316
- const thread = this.#commentManager.createCommentThread(anchor, text, author, changes);
274
+ let thread: CommentThread;
275
+ this.#isCreatingComment = true;
276
+ try {
277
+ thread = this.#commentManager.createCommentThread(anchor, text, author, changes);
278
+ } finally {
279
+ this.#isCreatingComment = false;
280
+ }
317
281
  // Non-DOM anchors (e.g. canvas-rendered timeline entries) manage their own overlays
318
282
  // and do not have individual backing DOM nodes to cache or observe.
319
283
  if (isDomTrackedAnchor(anchor)) {
@@ -324,11 +288,7 @@ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<Ev
324
288
  this.#observedThreads.add(anchorElement);
325
289
  }
326
290
 
327
- if (pendingDraft) {
328
- this.clearPendingAnchor();
329
- } else {
330
- this.#updatePositions();
331
- }
291
+ this.#updatePositions();
332
292
 
333
293
  return thread;
334
294
  }
@@ -493,54 +453,12 @@ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<Ev
493
453
 
494
454
  this.#pinPositions = newPins;
495
455
  this.#highlightRects = newHighlights;
496
- this.#updatePendingPositions(scrollX, scrollY);
497
456
  this.dispatchEventToListeners(Events.POSITIONS_UPDATED, {
498
457
  pins: newPins,
499
458
  highlights: newHighlights,
500
459
  });
501
460
  }
502
461
 
503
- #updatePendingPositions(scrollX: number, scrollY: number): void {
504
- if (!this.#pendingDraft) {
505
- return;
506
- }
507
-
508
- const visibleRect = computeVisibleRect(this.#pendingDraft.element);
509
- if (!visibleRect) {
510
- if (this.#pendingDraft.pin) {
511
- this.#pendingDraft.pin.visible = false;
512
- }
513
- if (this.#pendingDraft.highlight) {
514
- this.#pendingDraft.highlight.visible = false;
515
- }
516
- return;
517
- }
518
-
519
- const anchorRect = this.#pendingDraft.element.getBoundingClientRect();
520
- const pinOffset = this.#pendingDraft.pinOffset;
521
- const pinClientX = pinOffset ?
522
- Math.min(Math.max(anchorRect.left + pinOffset.offsetX, visibleRect.left), visibleRect.right) :
523
- visibleRect.right;
524
- const pinClientY = pinOffset ?
525
- Math.min(Math.max(anchorRect.top + pinOffset.offsetY, visibleRect.top), visibleRect.bottom) :
526
- visibleRect.top;
527
-
528
- this.#pendingDraft.pin = {
529
- top: scrollY + pinClientY - 12,
530
- left: scrollX + pinClientX - 12,
531
- visible: true,
532
- index: this.#commentManager.getCommentThreads().length + 1,
533
- };
534
-
535
- this.#pendingDraft.highlight = {
536
- top: scrollY + visibleRect.top,
537
- left: scrollX + visibleRect.left,
538
- width: visibleRect.width,
539
- height: visibleRect.height,
540
- visible: true,
541
- };
542
- }
543
-
544
462
  /**
545
463
  * Initializes event listeners and lifecycle observers across the target DOM container.
546
464
  *
@@ -579,7 +497,7 @@ export class CommentOverlayManager extends Common.ObjectWrapper.ObjectWrapper<Ev
579
497
  */
580
498
  stop(): void {
581
499
  document.body.style.cursor = '';
582
- this.clearPendingAnchor();
500
+ this.clearDraftThreads();
583
501
  this.#removeClickListener();
584
502
  this.#removeScrollListener();
585
503
  this.#removeResizeObserver();