chrome-devtools-frontend 1.0.1024166 → 1.0.1024644

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.
@@ -8951,9 +8951,6 @@
8951
8951
  "panels/security/SecurityPanel.ts | keyExchange": {
8952
8952
  "message": "Key exchange"
8953
8953
  },
8954
- "panels/security/SecurityPanel.ts | keyExchangeGroup": {
8955
- "message": "Key exchange group"
8956
- },
8957
8954
  "panels/security/SecurityPanel.ts | logId": {
8958
8955
  "message": "Log ID"
8959
8956
  },
@@ -8951,9 +8951,6 @@
8951
8951
  "panels/security/SecurityPanel.ts | keyExchange": {
8952
8952
  "message": "K̂éŷ éx̂ćĥán̂ǵê"
8953
8953
  },
8954
- "panels/security/SecurityPanel.ts | keyExchangeGroup": {
8955
- "message": "K̂éŷ éx̂ćĥán̂ǵê ǵr̂óûṕ"
8956
- },
8957
8954
  "panels/security/SecurityPanel.ts | logId": {
8958
8955
  "message": "L̂óĝ ÍD̂"
8959
8956
  },
@@ -25,13 +25,14 @@ export class CSSMatchedStyles {
25
25
  readonly #pseudoDOMCascades: Map<Protocol.DOM.PseudoType, DOMInheritanceCascade>;
26
26
  readonly #customHighlightPseudoDOMCascades: Map<string, DOMInheritanceCascade>;
27
27
  readonly #styleToDOMCascade: Map<CSSStyleDeclaration, DOMInheritanceCascade>;
28
+ readonly #parentLayoutNodeId: Protocol.DOM.NodeId|undefined;
28
29
 
29
30
  constructor(
30
31
  cssModel: CSSModel, node: DOMNode, inlinePayload: Protocol.CSS.CSSStyle|null,
31
32
  attributesPayload: Protocol.CSS.CSSStyle|null, matchedPayload: Protocol.CSS.RuleMatch[],
32
33
  pseudoPayload: Protocol.CSS.PseudoElementMatches[], inheritedPayload: Protocol.CSS.InheritedStyleEntry[],
33
34
  inheritedPseudoPayload: Protocol.CSS.InheritedPseudoElementMatches[],
34
- animationsPayload: Protocol.CSS.CSSKeyframesRule[]) {
35
+ animationsPayload: Protocol.CSS.CSSKeyframesRule[], parentLayoutNodeId: Protocol.DOM.NodeId|undefined) {
35
36
  this.#cssModelInternal = cssModel;
36
37
  this.#nodeInternal = node;
37
38
  this.#addedStyles = new Map();
@@ -40,6 +41,7 @@ export class CSSMatchedStyles {
40
41
  if (animationsPayload) {
41
42
  this.#keyframesInternal = animationsPayload.map(rule => new CSSKeyframesRule(cssModel, rule));
42
43
  }
44
+ this.#parentLayoutNodeId = parentLayoutNodeId;
43
45
 
44
46
  this.#nodeForStyleInternal = new Map();
45
47
  this.#inheritedStyles = new Set();
@@ -411,6 +413,10 @@ export class CSSMatchedStyles {
411
413
  return matchingSelectors.length > 0 && this.queryMatches(rule.style);
412
414
  }
413
415
 
416
+ getParentLayoutNodeId(): Protocol.DOM.NodeId|undefined {
417
+ return this.#parentLayoutNodeId;
418
+ }
419
+
414
420
  getMatchingSelectors(rule: CSSStyleRule): number[] {
415
421
  const node = this.nodeForStyle(rule.style);
416
422
  if (!node || typeof node.id !== 'number') {
@@ -305,7 +305,7 @@ export class CSSModel extends SDKModel<EventTypes> {
305
305
  return new CSSMatchedStyles(
306
306
  this, (node as DOMNode), response.inlineStyle || null, response.attributesStyle || null,
307
307
  response.matchedCSSRules || [], response.pseudoElements || [], response.inherited || [],
308
- response.inheritedPseudoElements || [], response.cssKeyframesRules || []);
308
+ response.inheritedPseudoElements || [], response.cssKeyframesRules || [], response.parentLayoutNodeId);
309
309
  }
310
310
 
311
311
  async getClassNames(styleSheetId: Protocol.CSS.StyleSheetId): Promise<string[]> {
@@ -351,6 +351,10 @@ class FormattedValueNode extends ValueNode {
351
351
  this.#evalOptions = evalOptions;
352
352
  }
353
353
 
354
+ get sourceType(): SourceType {
355
+ return this.#sourceType;
356
+ }
357
+
354
358
  async findProperties(...properties: string[]): Promise<{
355
359
  [x: string]: FormattedValueNode | undefined,
356
360
  }> {
@@ -348,7 +348,7 @@ export class DeprecationIssue extends Issue {
348
348
  break;
349
349
  case Protocol.Audits.DeprecationIssueType.CrossOriginAccessBasedOnDocumentDomain:
350
350
  messageFunction = i18nLazyString(UIStrings.crossOriginAccessBasedOnDocumentDomain);
351
- milestone = 106;
351
+ milestone = 109;
352
352
  break;
353
353
  case Protocol.Audits.DeprecationIssueType.CrossOriginWindowAlert:
354
354
  messageFunction = i18nLazyString(UIStrings.crossOriginWindowApi, {PH1: 'window.alert'});
@@ -367,7 +367,7 @@ export class DeprecationIssue extends Issue {
367
367
  break;
368
368
  case Protocol.Audits.DeprecationIssueType.DocumentDomainSettingWithoutOriginAgentClusterHeader:
369
369
  messageFunction = i18nLazyString(UIStrings.documentDomainSettingWithoutOriginAgentClusterHeader);
370
- milestone = 106;
370
+ milestone = 109;
371
371
  break;
372
372
  case Protocol.Audits.DeprecationIssueType.EventPath:
373
373
  messageFunction = i18nLazyString(UIStrings.eventPath);
@@ -594,18 +594,17 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
594
594
  }, 200 /* only spin for loading time > 200ms to avoid unpleasant render flashes */);
595
595
  }
596
596
 
597
- const node = this.node();
598
- // TODO: Fetch the parent node id using CDP command
599
- const parentNode = node ? node.parentNode : null;
600
-
601
- const [computedStyles, parentsComputedStyles] =
602
- await Promise.all([this.fetchComputedStylesFor(node), this.fetchComputedStylesFor(parentNode)]);
597
+ const matchedStyles = await this.fetchMatchedCascade();
603
598
 
604
599
  if (signal.aborted) {
605
600
  return;
606
601
  }
607
602
 
608
- const matchedStyles = await this.fetchMatchedCascade();
603
+ const nodeId = this.node()?.id;
604
+ const parentNodeId = matchedStyles?.getParentLayoutNodeId();
605
+
606
+ const [computedStyles, parentsComputedStyles] =
607
+ await Promise.all([this.fetchComputedStylesFor(nodeId), this.fetchComputedStylesFor(parentNodeId)]);
609
608
 
610
609
  if (signal.aborted) {
611
610
  return;
@@ -633,11 +632,12 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
633
632
  this.dispatchEventToListeners(Events.StylesUpdateCompleted, {hasMatchedStyles: this.hasMatchedStyles});
634
633
  }
635
634
 
636
- private async fetchComputedStylesFor(node: SDK.DOMModel.DOMNode|null): Promise<Map<string, string>|null> {
637
- if (!node) {
635
+ private async fetchComputedStylesFor(nodeId: Protocol.DOM.NodeId|undefined): Promise<Map<string, string>|null> {
636
+ const node = this.node();
637
+ if (node === null || nodeId === undefined) {
638
638
  return null;
639
639
  }
640
- return await node.domModel().cssModel().getComputedStyle(node.id);
640
+ return await node.domModel().cssModel().getComputedStyle(nodeId);
641
641
  }
642
642
 
643
643
  onResize(): void {
@@ -319,15 +319,13 @@ const UIStrings = {
319
319
  */
320
320
  protocol: 'Protocol',
321
321
  /**
322
- *@description Text in Security Panel of the Security panel
322
+ *@description Text in the Security panel that refers to how the TLS handshake
323
+ *established encryption keys.
323
324
  */
324
325
  keyExchange: 'Key exchange',
325
326
  /**
326
- *@description Text in Security Panel of the Security panel
327
- */
328
- keyExchangeGroup: 'Key exchange group',
329
- /**
330
- *@description Text in Security Panel of the Security panel
327
+ *@description Text in Security Panel that refers to how the TLS handshake
328
+ *encrypted data.
331
329
  */
332
330
  cipher: 'Cipher',
333
331
  /**
@@ -1439,12 +1437,35 @@ export class SecurityOriginView extends UI.Widget.VBox {
1439
1437
  let table: SecurityDetailsTable = new SecurityDetailsTable();
1440
1438
  connectionSection.appendChild(table.element());
1441
1439
  table.addRow(i18nString(UIStrings.protocol), originState.securityDetails.protocol);
1442
- if (originState.securityDetails.keyExchange) {
1440
+
1441
+ // A TLS connection negotiates a cipher suite and, when doing an ephemeral
1442
+ // ECDH key exchange, a "named group". In TLS 1.2, the cipher suite is
1443
+ // named like TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256. The DevTools protocol
1444
+ // tried to decompose this name and calls the "ECDHE_RSA" portion the
1445
+ // "keyExchange", because it determined the rough shape of the key
1446
+ // exchange portion of the handshake. (A keyExchange of "RSA" meant a very
1447
+ // different handshake set.) But ECDHE_RSA was still parameterized by a
1448
+ // named group (e.g. X25519), which the DevTools protocol exposes as
1449
+ // "keyExchangeGroup".
1450
+ //
1451
+ // Then, starting TLS 1.3, the cipher suites are named like
1452
+ // TLS_AES_128_GCM_SHA256. The handshake shape is implicit in the
1453
+ // protocol. keyExchange is empty and we only have keyExchangeGroup.
1454
+ //
1455
+ // "Key exchange group" isn't common terminology and, in TLS 1.3,
1456
+ // something like "X25519" is better labelled as "key exchange" than "key
1457
+ // exchange group" anyway. So combine the two fields when displaying in
1458
+ // the UI.
1459
+ if (originState.securityDetails.keyExchange && originState.securityDetails.keyExchangeGroup) {
1460
+ table.addRow(
1461
+ i18nString(UIStrings.keyExchange),
1462
+ originState.securityDetails.keyExchange + ' with ' + originState.securityDetails.keyExchangeGroup);
1463
+ } else if (originState.securityDetails.keyExchange) {
1443
1464
  table.addRow(i18nString(UIStrings.keyExchange), originState.securityDetails.keyExchange);
1465
+ } else if (originState.securityDetails.keyExchangeGroup) {
1466
+ table.addRow(i18nString(UIStrings.keyExchange), originState.securityDetails.keyExchangeGroup);
1444
1467
  }
1445
- if (originState.securityDetails.keyExchangeGroup) {
1446
- table.addRow(i18nString(UIStrings.keyExchangeGroup), originState.securityDetails.keyExchangeGroup);
1447
- }
1468
+
1448
1469
  table.addRow(
1449
1470
  i18nString(UIStrings.cipher),
1450
1471
  originState.securityDetails.cipher +
@@ -1645,14 +1666,14 @@ export class SecurityDetailsTable {
1645
1666
  }
1646
1667
 
1647
1668
  addRow(key: string, value: string|Node): void {
1648
- const row = this.elementInternal.createChild('div', 'details-table-row');
1649
- row.createChild('div').textContent = key;
1669
+ const row = this.elementInternal.createChild('tr', 'details-table-row');
1670
+ row.createChild('td').textContent = key;
1650
1671
 
1651
- const valueDiv = row.createChild('div');
1672
+ const valueCell = row.createChild('td');
1652
1673
  if (typeof value === 'string') {
1653
- valueDiv.textContent = value;
1674
+ valueCell.textContent = value;
1654
1675
  } else {
1655
- valueDiv.appendChild(value);
1676
+ valueCell.appendChild(value);
1656
1677
  }
1657
1678
  }
1658
1679
  }
@@ -62,37 +62,38 @@
62
62
  font-weight: bold;
63
63
  }
64
64
 
65
+ .security-origin-view .details-table {
66
+ border-spacing: 0;
67
+ }
68
+
65
69
  .security-origin-view .details-table-row {
66
- display: flex;
67
70
  white-space: nowrap;
68
71
  overflow: hidden;
69
72
  line-height: 22px;
73
+ vertical-align: top;
70
74
  }
71
75
 
72
- .security-origin-view .details-table-row > div {
73
- align-items: flex-start;
76
+ .security-origin-view .details-table-row > td {
77
+ padding: 0;
74
78
  }
75
79
 
76
- .security-origin-view .details-table-row > div:first-child {
80
+ .security-origin-view .details-table-row > td:first-child {
77
81
  color: var(--color-text-secondary);
78
- width: 110px;
79
- margin-right: 1em;
80
- flex: none;
81
- display: flex;
82
- justify-content: flex-end;
82
+ width: calc(110px + 1em);
83
+ text-align: right;
84
+ padding-right: 1em;
83
85
  }
84
86
 
85
- .security-origin-view .details-table-row > div:nth-child(2) {
86
- flex: auto;
87
+ .security-origin-view .details-table-row > td:nth-child(2) {
87
88
  white-space: normal;
88
89
  }
89
90
 
90
- .security-origin-view .sct-details .details-table .details-table-row:last-child div:last-child {
91
+ .security-origin-view .sct-details .details-table .details-table-row:last-child td:last-child {
91
92
  border-bottom: 1px solid var(--color-background-elevation-2);
92
93
  padding-bottom: 10px;
93
94
  }
94
95
 
95
- .security-origin-view .sct-details .details-table:last-child .details-table-row:last-child div:last-child {
96
+ .security-origin-view .sct-details .details-table:last-child .details-table-row:last-child td:last-child {
96
97
  border-bottom: none;
97
98
  padding-bottom: 0;
98
99
  }
@@ -217,6 +217,33 @@ export class LinearMemoryInspectorController extends SDK.TargetManager.SDKModelO
217
217
  return {obj, address};
218
218
  }
219
219
 
220
+ // This function returns the size of the source language value represented
221
+ // by the ValueNode. If the value is a pointer, the function returns the size of
222
+ // the pointed-to value. If the pointed-to value is also a pointer, it returns
223
+ // the size of the pointer (usually 4 bytes) to stay consistent with the DWARF extension.
224
+ // > double x = 42.0;
225
+ // > double *ptr = &x;
226
+ // > double **dblptr = &ptr;
227
+ //
228
+ // retrieveObjectSize(ptr_ValueNode) -> 8, the size of a double
229
+ // retrieveObjectSize(dblptr_ValueNode) -> 4, the size of a pointer
230
+ static retrieveObjectSize(obj: Bindings.DebuggerLanguagePlugins.ValueNode): number {
231
+ let typeInfo = obj.sourceType.typeInfo;
232
+ const pointerMembers = typeInfo.members.filter(member => member.name === '*');
233
+ if (pointerMembers.length === 1) {
234
+ const typeId = pointerMembers[0].typeId;
235
+ const newTypeInfo = obj.sourceType.typeMap.get(typeId)?.typeInfo;
236
+ if (newTypeInfo !== undefined) {
237
+ typeInfo = newTypeInfo;
238
+ } else {
239
+ throw new Error(`Cannot find the source type information for typeId ${typeId}.`);
240
+ }
241
+ } else if (pointerMembers.length > 1) {
242
+ throw new Error('The number of pointers in typeInfo.members should not be greater than one.');
243
+ }
244
+ return typeInfo.size;
245
+ }
246
+
220
247
  async openInspectorView(obj: SDK.RemoteObject.RemoteObject, address?: number): Promise<void> {
221
248
  const response = await LinearMemoryInspectorController.retrieveDWARFMemoryObjectAndAddress(obj);
222
249
  let memoryObj = obj;
@@ -268,14 +295,13 @@ export class LinearMemoryInspectorController extends SDK.TargetManager.SDKModelO
268
295
  #extractHighlightInfo(obj: SDK.RemoteObject.RemoteObject, memoryAddress?: number): HighlightInfo|undefined {
269
296
  let highlightInfo;
270
297
  if (obj instanceof Bindings.DebuggerLanguagePlugins.ValueNode) {
271
- // Currently, only the StaticallyTypedValueNode subclass implements the sourceType getter.
272
- // The other subclasses throw a 'Not Implemented' Error.
273
298
  try {
274
299
  highlightInfo = {
275
300
  startAddress: memoryAddress || 0,
276
- size: obj.sourceType.typeInfo.size,
301
+ size: LinearMemoryInspectorController.retrieveObjectSize(obj),
277
302
  };
278
- } catch (unusedError) {
303
+ } catch (err) {
304
+ highlightInfo = undefined;
279
305
  }
280
306
  }
281
307
  return highlightInfo;
package/package.json CHANGED
@@ -55,5 +55,5 @@
55
55
  "unittest": "scripts/test/run_unittests.py --no-text-coverage",
56
56
  "watch": "vpython third_party/node/node.py --output scripts/watch_build.js"
57
57
  },
58
- "version": "1.0.1024166"
58
+ "version": "1.0.1024644"
59
59
  }