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.
- package/.agents/skills/version-control/SKILL.md +21 -9
- package/front_end/core/platform/HostRuntime.ts +12 -0
- package/front_end/core/platform/api/HostRuntime.ts +13 -0
- package/front_end/core/platform/browser/HostRuntime.ts +34 -0
- package/front_end/core/platform/node/HostRuntime.ts +40 -0
- package/front_end/core/sdk/AnimationModel.ts +12 -98
- package/front_end/core/sdk/CSSModel.ts +4 -2
- package/front_end/core/sdk/CSSPropertyParser.ts +4 -4
- package/front_end/core/sdk/CSSPropertyParserMatchers.ts +4 -44
- package/front_end/core/sdk/Connections.ts +6 -1
- package/front_end/core/sdk/ConsoleModel.ts +1 -12
- package/front_end/core/sdk/DOMModel.ts +3 -51
- package/front_end/core/sdk/DebuggerModel.ts +9 -8
- package/front_end/core/sdk/NetworkRequest.ts +1 -1
- package/front_end/core/sdk/PageFunctions.ts +187 -0
- package/front_end/core/sdk/Resource.ts +1 -1
- package/front_end/core/sdk/RuntimeModel.ts +1 -20
- package/front_end/core/sdk/Script.ts +21 -0
- package/front_end/core/sdk/SourceMap.ts +15 -2
- package/front_end/core/sdk/SourceMapCache.ts +13 -10
- package/front_end/core/sdk/SourceMapManager.ts +11 -9
- package/front_end/core/sdk/SourceMapScopeChainEntry.ts +59 -17
- package/front_end/core/sdk/SourceMapScopesInfo.ts +8 -2
- package/front_end/entrypoints/heap_snapshot_worker/ContextAnalyzer.ts +635 -0
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +26 -12
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshotLoader.ts +16 -2
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.ts +4 -4
- package/front_end/entrypoints/heap_snapshot_worker/heap_snapshot_worker.ts +2 -0
- package/front_end/entrypoints/shell/shell.ts +1 -1
- package/front_end/models/ai_assistance/DOMHelpers.ts +95 -0
- package/front_end/models/ai_assistance/EvaluateAction.ts +5 -42
- package/front_end/models/ai_assistance/ExtensionScope.ts +2 -31
- package/front_end/models/ai_assistance/agents/AiAgent.ts +2 -1
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -4
- package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
- package/front_end/models/ai_assistance/contexts/DOMNodeContext.ts +10 -7
- package/front_end/models/ai_assistance/contexts/FileContext.ts +2 -10
- package/front_end/models/ai_assistance/tools/GetSourceContent.ts +3 -2
- package/front_end/models/ai_assistance/tools/ListSources.ts +21 -14
- package/front_end/models/bindings/CompilerScriptMapping.ts +3 -10
- package/front_end/models/bindings/DebuggerLanguagePlugins.ts +48 -17
- package/front_end/models/bindings/ResourceScriptMapping.ts +2 -2
- package/front_end/models/bindings/StylesSourceMapping.ts +1 -1
- package/front_end/models/comment_manager/CD4ABridge.ts +55 -12
- package/front_end/models/comment_manager/CommentManager.ts +46 -91
- package/front_end/models/comment_manager/CommentThread.ts +145 -0
- package/front_end/models/comment_manager/comment_manager.ts +2 -0
- package/front_end/models/emulation/DeviceModeModel.ts +53 -0
- package/front_end/models/extensions/ExtensionAPI.ts +8 -6
- package/front_end/models/extensions/ExtensionEndpoint.ts +11 -8
- package/front_end/models/extensions/HostUrlPattern.ts +4 -3
- package/front_end/models/extensions/LanguageExtensionEndpoint.ts +3 -2
- package/front_end/models/extensions/RecorderExtensionEndpoint.ts +2 -1
- package/front_end/models/formatter/FormatterWorkerPool.ts +4 -6
- package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +55 -0
- package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +18 -14
- package/front_end/models/issues_manager/IssuesManager.ts +5 -0
- package/front_end/models/issues_manager/WebInstallIssue.ts +63 -0
- package/front_end/models/issues_manager/descriptions/webInstallManifestMissingId.md +3 -0
- package/front_end/models/issues_manager/descriptions/webInstallManifestMissingNameOrShortName.md +3 -0
- package/front_end/models/issues_manager/descriptions/webInstallManifestParsingOrNetworkError.md +3 -0
- package/front_end/models/issues_manager/descriptions/webInstallNoManifest.md +3 -0
- package/front_end/models/issues_manager/descriptions/webInstallStartUrlInvalid.md +3 -0
- package/front_end/models/issues_manager/issues_manager.ts +2 -0
- package/front_end/models/workspace/UISourceCode.ts +20 -0
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +4 -6
- package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +4 -10
- package/front_end/{ui/comments → panels/common}/CommentThreadWidget.ts +4 -4
- package/front_end/{ui/comments → panels/common}/CommentsOverlayWidget.ts +39 -62
- package/front_end/{ui/comments → panels/common}/CommentsStatusBarPill.ts +5 -5
- package/front_end/panels/common/ExtensionServer.ts +2 -1
- package/front_end/{ui/comments → panels/common}/commentsOverlay.css +2 -1
- package/front_end/{ui/comments/comments-meta.ts → panels/common/common-meta.ts} +11 -11
- package/front_end/panels/common/common.ts +3 -0
- package/front_end/panels/elements/AdoptedStyleSheetTreeElement.ts +3 -3
- package/front_end/panels/elements/ElementsPanel.ts +5 -1
- package/front_end/panels/elements/ElementsTreeElement.ts +4 -1
- package/front_end/panels/elements/ElementsTreeOutline.ts +58 -51
- package/front_end/panels/elements/PropertiesWidget.ts +11 -10
- package/front_end/panels/elements/PropertyRenderer.ts +29 -25
- package/front_end/panels/elements/StylePropertyTreeElement.ts +6 -6
- package/front_end/panels/elements/elementsTreeOutline.css +7 -1
- package/front_end/panels/emulation/DeviceModeToolbar.ts +2 -3
- package/front_end/panels/event_listeners/EventListenersView.ts +33 -44
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +6 -7
- package/front_end/panels/linear_memory_inspector/components/linearMemoryInspector.css +5 -1
- package/front_end/panels/linear_memory_inspector/linear_memory_inspector-meta.ts +1 -1
- package/front_end/panels/recorder/stepView.css +1 -0
- package/front_end/panels/security/SecurityPanel.ts +5 -5
- package/front_end/panels/security/SecurityPanelSidebar.ts +2 -11
- package/front_end/panels/sources/DebuggerPlugin.ts +1 -1
- package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +11 -16
- package/front_end/panels/sources/sources-meta.ts +1 -1
- package/front_end/panels/timeline/overlays/OverlaysImpl.ts +0 -3
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/comments/CommentOverlayManager.ts +28 -110
- package/front_end/ui/comments/comments.ts +0 -6
- package/front_end/ui/legacy/Treeoutline.ts +4 -0
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +14 -7
- package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
- package/package.json +1 -1
- /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,
|
|
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
|
-
|
|
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
|
|
309
|
-
|
|
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(
|
|
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.
|
|
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
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
const
|
|
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
|
|
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
|
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
|
835
|
-
this.sidebar.
|
|
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.
|
|
231
|
+
this.requestUpdate();
|
|
237
232
|
}
|
|
238
233
|
|
|
239
|
-
|
|
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) => {
|
|
@@ -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 :
|
|
368
|
-
|
|
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:
|
|
556
|
-
if (
|
|
557
|
-
|
|
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
|
-
|
|
605
|
-
|
|
606
|
-
|
|
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.
|
|
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:
|
|
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.#
|
|
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.
|
|
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
|
-
|
|
241
|
-
return this.#
|
|
229
|
+
getAnchorElement(thread: CommentThread): Element|undefined {
|
|
230
|
+
return this.#liveNodeCache.get(thread);
|
|
242
231
|
}
|
|
243
232
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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.
|
|
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 {
|
|
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
|
-
|
|
274
|
-
|
|
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
|
|
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
|
|
304
|
-
|
|
305
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
500
|
+
this.clearDraftThreads();
|
|
583
501
|
this.#removeClickListener();
|
|
584
502
|
this.#removeScrollListener();
|
|
585
503
|
this.#removeResizeObserver();
|