chrome-devtools-frontend 1.0.1036501 → 1.0.1036726
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/front_end/core/sdk/CSSStyleDeclaration.ts +1 -1
- package/front_end/core/sdk/NetworkManager.ts +21 -5
- package/front_end/core/sdk/NetworkRequest.ts +10 -0
- package/front_end/panels/elements/ElementsTreeOutline.ts +3 -3
- package/front_end/panels/elements/TopLayerContainer.ts +14 -13
- package/front_end/panels/sources/NavigatorView.ts +8 -3
- package/package.json +1 -1
@@ -184,7 +184,7 @@ export class CSSStyleDeclaration {
|
|
184
184
|
for (const shorthand of shorthands) {
|
185
185
|
if (propertiesSet.has(shorthand)) {
|
186
186
|
continue;
|
187
|
-
} // There already is a shorthand this #
|
187
|
+
} // There already is a shorthand this #longhand falls under.
|
188
188
|
const shorthandValue = this.#shorthandValues.get(shorthand);
|
189
189
|
if (!shorthandValue) {
|
190
190
|
continue;
|
@@ -141,7 +141,7 @@ export class NetworkManager extends SDKModel<EventTypes> {
|
|
141
141
|
constructor(target: Target) {
|
142
142
|
super(target);
|
143
143
|
this.dispatcher = new NetworkDispatcher(this);
|
144
|
-
this.fetchDispatcher = new FetchDispatcher(target.fetchAgent());
|
144
|
+
this.fetchDispatcher = new FetchDispatcher(target.fetchAgent(), this);
|
145
145
|
this.#networkAgent = target.networkAgent();
|
146
146
|
target.registerNetworkDispatcher(this.dispatcher);
|
147
147
|
target.registerFetchDispatcher(this.fetchDispatcher);
|
@@ -264,7 +264,7 @@ export class NetworkManager extends SDKModel<EventTypes> {
|
|
264
264
|
return this.dispatcher.requestForURL(url);
|
265
265
|
}
|
266
266
|
|
267
|
-
|
267
|
+
requestForId(id: string): NetworkRequest|null {
|
268
268
|
return this.dispatcher.requestForId(id);
|
269
269
|
}
|
270
270
|
|
@@ -392,15 +392,18 @@ const MAX_EAGER_POST_REQUEST_BODY_LENGTH = 64 * 1024; // bytes
|
|
392
392
|
|
393
393
|
export class FetchDispatcher implements ProtocolProxyApi.FetchDispatcher {
|
394
394
|
readonly #fetchAgent: ProtocolProxyApi.FetchApi;
|
395
|
+
readonly #manager: NetworkManager;
|
395
396
|
|
396
|
-
constructor(agent: ProtocolProxyApi.FetchApi) {
|
397
|
+
constructor(agent: ProtocolProxyApi.FetchApi, manager: NetworkManager) {
|
397
398
|
this.#fetchAgent = agent;
|
399
|
+
this.#manager = manager;
|
398
400
|
}
|
399
401
|
|
400
|
-
requestPaused({requestId, request, resourceType, responseStatusCode, responseHeaders}:
|
402
|
+
requestPaused({requestId, request, resourceType, responseStatusCode, responseHeaders, networkId}:
|
401
403
|
Protocol.Fetch.RequestPausedEvent): void {
|
404
|
+
const networkRequest = networkId ? this.#manager.requestForId(networkId) : null;
|
402
405
|
void MultitargetNetworkManager.instance().requestIntercepted(new InterceptedRequest(
|
403
|
-
this.#fetchAgent, request, resourceType, requestId, responseStatusCode, responseHeaders));
|
406
|
+
this.#fetchAgent, request, resourceType, requestId, networkRequest, responseStatusCode, responseHeaders));
|
404
407
|
}
|
405
408
|
|
406
409
|
authRequired({}: Protocol.Fetch.AuthRequiredEvent): void {
|
@@ -1549,12 +1552,14 @@ export class InterceptedRequest {
|
|
1549
1552
|
responseStatusCode: number|undefined;
|
1550
1553
|
responseHeaders: Protocol.Fetch.HeaderEntry[]|undefined;
|
1551
1554
|
requestId: Protocol.Fetch.RequestId;
|
1555
|
+
networkRequest: NetworkRequest|null;
|
1552
1556
|
|
1553
1557
|
constructor(
|
1554
1558
|
fetchAgent: ProtocolProxyApi.FetchApi,
|
1555
1559
|
request: Protocol.Network.Request,
|
1556
1560
|
resourceType: Protocol.Network.ResourceType,
|
1557
1561
|
requestId: Protocol.Fetch.RequestId,
|
1562
|
+
networkRequest: NetworkRequest|null,
|
1558
1563
|
responseStatusCode?: number,
|
1559
1564
|
responseHeaders?: Protocol.Fetch.HeaderEntry[],
|
1560
1565
|
) {
|
@@ -1565,6 +1570,17 @@ export class InterceptedRequest {
|
|
1565
1570
|
this.responseStatusCode = responseStatusCode;
|
1566
1571
|
this.responseHeaders = responseHeaders;
|
1567
1572
|
this.requestId = requestId;
|
1573
|
+
this.networkRequest = networkRequest;
|
1574
|
+
if (this.networkRequest && this.responseHeaders) {
|
1575
|
+
// This populates 'NetworkRequest.originalResponseHeaders' with the
|
1576
|
+
// response headers from CDP's 'Fetch.requestPaused'. Populating this
|
1577
|
+
// field together with 'NetworkRequest.responseHeaders' with the info
|
1578
|
+
// from 'Network.responseReceivedExtraInfo' would have been easier, but we
|
1579
|
+
// are not sure whether the response headers from the 2 CDP events are
|
1580
|
+
// always exactly the same.
|
1581
|
+
// Creates a deep copy.
|
1582
|
+
this.networkRequest.originalResponseHeaders = this.responseHeaders.map(headerEntry => ({...headerEntry}));
|
1583
|
+
}
|
1568
1584
|
}
|
1569
1585
|
|
1570
1586
|
hasResponded(): boolean {
|
@@ -236,6 +236,7 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper<EventType
|
|
236
236
|
[x: string]: string|undefined,
|
237
237
|
};
|
238
238
|
#responseHeadersTextInternal: string;
|
239
|
+
#originalResponseHeaders: Protocol.Fetch.HeaderEntry[];
|
239
240
|
#requestHeadersInternal: NameValue[];
|
240
241
|
#requestHeaderValues: {
|
241
242
|
[x: string]: string|undefined,
|
@@ -336,6 +337,7 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper<EventType
|
|
336
337
|
|
337
338
|
this.#responseHeaderValues = {};
|
338
339
|
this.#responseHeadersTextInternal = '';
|
340
|
+
this.#originalResponseHeaders = [];
|
339
341
|
|
340
342
|
this.#requestHeadersInternal = [];
|
341
343
|
this.#requestHeaderValues = {};
|
@@ -939,6 +941,14 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper<EventType
|
|
939
941
|
this.dispatchEventToListeners(Events.ResponseHeadersChanged);
|
940
942
|
}
|
941
943
|
|
944
|
+
get originalResponseHeaders(): Protocol.Fetch.HeaderEntry[] {
|
945
|
+
return this.#originalResponseHeaders;
|
946
|
+
}
|
947
|
+
|
948
|
+
set originalResponseHeaders(headers: Protocol.Fetch.HeaderEntry[]) {
|
949
|
+
this.#originalResponseHeaders = headers;
|
950
|
+
}
|
951
|
+
|
942
952
|
get responseHeadersText(): string {
|
943
953
|
return this.#responseHeadersTextInternal;
|
944
954
|
}
|
@@ -1189,7 +1189,7 @@ export class ElementsTreeOutline extends
|
|
1189
1189
|
}
|
1190
1190
|
const container = new TopLayerContainer(parent.treeOutline, domModel);
|
1191
1191
|
await container.throttledUpdateTopLayerElements();
|
1192
|
-
if (container.
|
1192
|
+
if (container.currentTopLayerDOMNodes.size > 0) {
|
1193
1193
|
parent.appendChild(container);
|
1194
1194
|
}
|
1195
1195
|
this.#topLayerContainerByParent.set(parent, container);
|
@@ -1460,10 +1460,10 @@ export class ElementsTreeOutline extends
|
|
1460
1460
|
private async topLayerElementsChanged(): Promise<void> {
|
1461
1461
|
for (const [parent, container] of this.#topLayerContainerByParent) {
|
1462
1462
|
await container.throttledUpdateTopLayerElements();
|
1463
|
-
if (container.
|
1463
|
+
if (container.currentTopLayerDOMNodes.size > 0 && container.parent !== parent) {
|
1464
1464
|
parent.appendChild(container);
|
1465
1465
|
}
|
1466
|
-
container.hidden = container.
|
1466
|
+
container.hidden = container.currentTopLayerDOMNodes.size === 0;
|
1467
1467
|
}
|
1468
1468
|
}
|
1469
1469
|
|
@@ -25,14 +25,13 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
25
25
|
export class TopLayerContainer extends UI.TreeOutline.TreeElement {
|
26
26
|
tree: ElementsTreeOutline.ElementsTreeOutline;
|
27
27
|
domModel: SDK.DOMModel.DOMModel;
|
28
|
-
|
28
|
+
currentTopLayerDOMNodes: Set<SDK.DOMModel.DOMNode> = new Set();
|
29
29
|
topLayerUpdateThrottler: Common.Throttler.Throttler;
|
30
30
|
|
31
31
|
constructor(tree: ElementsTreeOutline.ElementsTreeOutline, domModel: SDK.DOMModel.DOMModel) {
|
32
32
|
super('#top-layer');
|
33
33
|
this.tree = tree;
|
34
34
|
this.domModel = domModel;
|
35
|
-
this.currentTopLayerElements = new Set();
|
36
35
|
this.topLayerUpdateThrottler = new Common.Throttler.Throttler(1);
|
37
36
|
}
|
38
37
|
|
@@ -43,7 +42,7 @@ export class TopLayerContainer extends UI.TreeOutline.TreeElement {
|
|
43
42
|
async updateTopLayerElements(): Promise<void> {
|
44
43
|
this.removeChildren();
|
45
44
|
this.removeCurrentTopLayerElementsAdorners();
|
46
|
-
this.
|
45
|
+
this.currentTopLayerDOMNodes = new Set();
|
47
46
|
|
48
47
|
const newTopLayerElementsIDs = await this.domModel.getTopLayerElements();
|
49
48
|
if (!newTopLayerElementsIDs || newTopLayerElementsIDs.length === 0) {
|
@@ -57,15 +56,9 @@ export class TopLayerContainer extends UI.TreeOutline.TreeElement {
|
|
57
56
|
const topLayerElementShortcut = new SDK.DOMModel.DOMNodeShortcut(
|
58
57
|
this.domModel.target(), topLayerDOMNode.backendNodeId(), 0, topLayerDOMNode.nodeName());
|
59
58
|
const topLayerElementRepresentation = new ElementsTreeOutline.ShortcutTreeElement(topLayerElementShortcut);
|
60
|
-
const topLayerTreeElement = this.tree.treeElementByNode.get(topLayerDOMNode);
|
61
|
-
if (!topLayerTreeElement) {
|
62
|
-
continue;
|
63
|
-
}
|
64
|
-
|
65
|
-
topLayerElementIndex++;
|
66
|
-
this.addTopLayerAdorner(topLayerTreeElement, topLayerElementRepresentation, topLayerElementIndex);
|
67
|
-
this.currentTopLayerElements.add(topLayerTreeElement);
|
68
59
|
this.appendChild(topLayerElementRepresentation);
|
60
|
+
this.currentTopLayerDOMNodes.add(topLayerDOMNode);
|
61
|
+
|
69
62
|
// Add the element's backdrop if previous top layer element is a backdrop.
|
70
63
|
const previousTopLayerDOMNode =
|
71
64
|
(i > 0) ? this.domModel.idToDOMNode.get(newTopLayerElementsIDs[i - 1]) : undefined;
|
@@ -75,13 +68,21 @@ export class TopLayerContainer extends UI.TreeOutline.TreeElement {
|
|
75
68
|
const backdropElementRepresentation = new ElementsTreeOutline.ShortcutTreeElement(backdropElementShortcut);
|
76
69
|
topLayerElementRepresentation.appendChild(backdropElementRepresentation);
|
77
70
|
}
|
71
|
+
|
72
|
+
// TODO(changhaohan): store not-yet-inserted DOMNodes and adorn them when inserted.
|
73
|
+
const topLayerTreeElement = this.tree.treeElementByNode.get(topLayerDOMNode);
|
74
|
+
if (topLayerTreeElement) {
|
75
|
+
this.addTopLayerAdorner(topLayerTreeElement, topLayerElementRepresentation, ++topLayerElementIndex);
|
76
|
+
}
|
78
77
|
}
|
79
78
|
}
|
80
79
|
}
|
81
80
|
|
82
81
|
private removeCurrentTopLayerElementsAdorners(): void {
|
83
|
-
for (const
|
84
|
-
|
82
|
+
for (const node of this.currentTopLayerDOMNodes) {
|
83
|
+
const topLayerTreeElement = this.tree.treeElementByNode.get(node);
|
84
|
+
// TODO(changhaohan): remove only top layer adorner.
|
85
|
+
topLayerTreeElement?.removeAllAdorners();
|
85
86
|
}
|
86
87
|
}
|
87
88
|
|
@@ -594,12 +594,17 @@ export class NavigatorView extends UI.Widget.VBox implements SDK.TargetManager.O
|
|
594
594
|
project: Workspace.Workspace.Project, target: SDK.Target.Target|null,
|
595
595
|
frame: SDK.ResourceTreeModel.ResourceTreeFrame|null, projectOrigin: string, isFromSourceMap: boolean,
|
596
596
|
path: Platform.DevToolsPath.EncodedPathString): string {
|
597
|
-
let targetId = target && !(this.groupByAuthored && isFromSourceMap) ? target.id() : '';
|
598
597
|
const projectId = project.type() === Workspace.Workspace.projectTypes.FileSystem ? project.id() : '';
|
598
|
+
let targetId = target && !(this.groupByAuthored && isFromSourceMap) ? target.id() : '';
|
599
|
+
let frameId = this.groupByFrame && frame ? frame.id : '';
|
599
600
|
if (this.groupByAuthored) {
|
600
|
-
|
601
|
+
if (isFromSourceMap) {
|
602
|
+
targetId = 'Authored';
|
603
|
+
frameId = '';
|
604
|
+
} else {
|
605
|
+
targetId = 'Deployed:' + targetId;
|
606
|
+
}
|
601
607
|
}
|
602
|
-
const frameId = this.groupByFrame && frame ? frame.id : '';
|
603
608
|
return targetId + ':' + projectId + ':' + frameId + ':' + projectOrigin + ':' + path;
|
604
609
|
}
|
605
610
|
|
package/package.json
CHANGED