chrome-devtools-frontend 1.0.1575635 → 1.0.1576915

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 (87) hide show
  1. package/front_end/core/host/AidaClient.ts +21 -0
  2. package/front_end/core/sdk/DebuggerModel.ts +14 -4
  3. package/front_end/core/sdk/NetworkManager.ts +3 -1
  4. package/front_end/core/sdk/NetworkRequest.ts +7 -0
  5. package/front_end/core/sdk/SourceMapScopesInfo.ts +2 -1
  6. package/front_end/generated/SupportedCSSProperties.js +44 -0
  7. package/front_end/models/ai_assistance/agents/AiAgent.ts +6 -0
  8. package/front_end/models/ai_code_generation/AiCodeGeneration.ts +6 -0
  9. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +37 -38
  10. package/front_end/models/javascript_metadata/NativeFunctions.js +12 -0
  11. package/front_end/models/source_map_scopes/NamesResolver.ts +5 -8
  12. package/front_end/models/stack_trace/StackTrace.ts +19 -18
  13. package/front_end/panels/accessibility/AXBreadcrumbsPane.ts +5 -3
  14. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +14 -2
  15. package/front_end/panels/ai_assistance/components/ChatMessage.ts +5 -1
  16. package/front_end/panels/animation/AnimationGroupPreviewUI.ts +1 -1
  17. package/front_end/panels/application/DeviceBoundSessionsTreeElement.ts +22 -1
  18. package/front_end/panels/application/DeviceBoundSessionsView.ts +44 -33
  19. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +1 -0
  20. package/front_end/panels/application/components/BackForwardCacheView.ts +4 -2
  21. package/front_end/panels/application/deviceBoundSessionsView.css +1 -1
  22. package/front_end/panels/autofill/AutofillView.ts +1 -1
  23. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +1 -0
  24. package/front_end/panels/common/AiCodeGenerationUpgradeDialog.ts +12 -4
  25. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +5 -5
  26. package/front_end/panels/console/ConsoleViewMessage.ts +1 -0
  27. package/front_end/panels/elements/ElementsTreeElement.ts +1 -0
  28. package/front_end/panels/elements/LayoutPane.ts +8 -7
  29. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +1 -1
  30. package/front_end/panels/elements/components/StylePropertyEditor.ts +2 -1
  31. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +1 -1
  32. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +1 -1
  33. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +1 -1
  34. package/front_end/panels/media/PlayerListView.ts +1 -1
  35. package/front_end/panels/network/NetworkItemView.ts +32 -3
  36. package/front_end/panels/network/NetworkLogViewColumns.ts +2 -1
  37. package/front_end/panels/network/RequestDeviceBoundSessionsView.ts +160 -0
  38. package/front_end/panels/network/RequestPayloadView.ts +111 -185
  39. package/front_end/panels/network/ShowMoreDetailsWidget.ts +96 -0
  40. package/front_end/panels/network/components/RequestHeaderSection.ts +1 -1
  41. package/front_end/panels/network/forward/UIRequestLocation.ts +1 -0
  42. package/front_end/panels/network/network.ts +5 -0
  43. package/front_end/panels/network/requestDeviceBoundSessionsView.css +14 -0
  44. package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
  45. package/front_end/panels/recorder/components/RecordingListView.ts +1 -1
  46. package/front_end/panels/recorder/components/StepEditor.ts +3 -3
  47. package/front_end/panels/settings/AISettingsTab.ts +2 -2
  48. package/front_end/panels/settings/KeybindsSettingsTab.ts +2 -1
  49. package/front_end/panels/sources/CallStackSidebarPane.ts +58 -11
  50. package/front_end/panels/sources/DebuggerPlugin.ts +19 -22
  51. package/front_end/panels/sources/SourcesPanel.ts +6 -24
  52. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  53. package/front_end/panels/timeline/components/BreadcrumbsUI.ts +1 -1
  54. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +1 -1
  55. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +7 -0
  56. package/front_end/panels/whats_new/resources/WNDT.md +1 -1
  57. package/front_end/third_party/chromium/README.chromium +1 -1
  58. package/front_end/third_party/source-map-scopes-codec/README.chromium +2 -2
  59. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/decode/decode.d.ts +2 -2
  60. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/decode/decode.d.ts.map +1 -1
  61. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/mod.d.ts +1 -1
  62. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/mod.d.ts.map +1 -1
  63. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/scopes.d.ts +9 -1
  64. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/scopes.d.ts.map +1 -1
  65. package/front_end/third_party/source-map-scopes-codec/package/deno.json +8 -1
  66. package/front_end/third_party/source-map-scopes-codec/package/package.json +1 -1
  67. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +20 -7
  68. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js.map +1 -1
  69. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.ts +29 -9
  70. package/front_end/third_party/source-map-scopes-codec/package/src/mod.js.map +1 -1
  71. package/front_end/third_party/source-map-scopes-codec/package/src/mod.ts +1 -0
  72. package/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +1 -1
  73. package/front_end/third_party/source-map-scopes-codec/package/src/scopes.ts +12 -1
  74. package/front_end/ui/components/report_view/ReportView.ts +2 -2
  75. package/front_end/ui/components/report_view/report.css +1 -0
  76. package/front_end/ui/components/suggestion_input/SuggestionInput.ts +7 -12
  77. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +37 -5
  78. package/front_end/ui/components/tree_outline/TreeOutline.ts +1 -1
  79. package/front_end/ui/legacy/ContextMenu.ts +12 -7
  80. package/front_end/ui/legacy/ListControl.ts +2 -1
  81. package/front_end/ui/legacy/ListWidget.ts +1 -1
  82. package/front_end/ui/legacy/SoftContextMenu.ts +2 -1
  83. package/front_end/ui/legacy/Treeoutline.ts +1 -0
  84. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +4 -2
  85. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +1 -1
  86. package/front_end/ui/visual_logging/KnownContextValues.ts +8 -0
  87. package/package.json +1 -1
@@ -125,6 +125,10 @@ const UIStrings = {
125
125
  *@description Section header for details about an event.
126
126
  */
127
127
  eventDetails: 'Event details',
128
+ /**
129
+ *@description Accessible label for the main area containing session details.
130
+ */
131
+ sessionDetails: 'Session details',
128
132
  /**
129
133
  *@description Placeholder text when no row is selected in a table of events.
130
134
  */
@@ -576,7 +580,8 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
576
580
  const {key, inclusionRules, cookieCravings} = sessionAndEvents.session;
577
581
  sessionDetailsHtml = html`
578
582
  <devtools-report>
579
- <devtools-report-section-header>${i18nString(UIStrings.sessionConfig)}</devtools-report-section-header>
583
+ <devtools-report-section-header role="heading" aria-level="2">${
584
+ i18nString(UIStrings.sessionConfig)}</devtools-report-section-header>
580
585
  <devtools-report-key>${i18nString(UIStrings.keySite)}</devtools-report-key>
581
586
  <devtools-report-value>${key.site}</devtools-report-value>
582
587
  <devtools-report-key>${i18nString(UIStrings.keyId)}</devtools-report-key>
@@ -590,7 +595,8 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
590
595
  <devtools-report-value>${sessionAndEvents.session.cachedChallenge || ''}</devtools-report-value>
591
596
  <devtools-report-key>${i18nString(UIStrings.allowedRefreshInitiators)}</devtools-report-key>
592
597
  <devtools-report-value>${sessionAndEvents.session.allowedRefreshInitiators.join(', ')}</devtools-report-value>
593
- <devtools-report-section-header>${i18nString(UIStrings.scope)}</devtools-report-section-header>
598
+ <devtools-report-section-header role="heading" aria-level="2">${
599
+ i18nString(UIStrings.scope)}</devtools-report-section-header>
594
600
  <devtools-report-key>${i18nString(UIStrings.origin)}</devtools-report-key>
595
601
  <devtools-report-value>${inclusionRules.origin}</devtools-report-value>
596
602
  <devtools-report-key>${i18nString(UIStrings.includeSite)}</devtools-report-key>
@@ -599,13 +605,14 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
599
605
  ${
600
606
  inclusionRules.urlRules.length > 0 ? html`
601
607
  <div class="device-bound-session-grid-wrapper">
602
- <devtools-data-grid class="device-bound-session-url-rules-grid" striped inline>
608
+ <devtools-data-grid class="device-bound-session-url-rules-grid" striped inline name=${
609
+ i18nString(UIStrings.scope)}>
603
610
  <table>
604
611
  <thead>
605
612
  <tr>
606
- <th id="should-include" weight="1" sortable>${i18nString(UIStrings.ruleType)}</th>
607
- <th id="host-pattern" weight="2" sortable>${i18nString(UIStrings.ruleHostPattern)}</th>
608
- <th id="path-prefix" weight="2" sortable>${i18nString(UIStrings.rulePathPrefix)}</th>
613
+ <th id="should-include" sortable>${i18nString(UIStrings.ruleType)}</th>
614
+ <th id="host-pattern" sortable>${i18nString(UIStrings.ruleHostPattern)}</th>
615
+ <th id="path-prefix" sortable>${i18nString(UIStrings.rulePathPrefix)}</th>
609
616
  </tr>
610
617
  </thead>
611
618
  <tbody>
@@ -622,22 +629,22 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
622
629
  </div>
623
630
  ` :
624
631
  nothing}
625
- <devtools-report-section-header>${i18nString(UIStrings.cookieCravings)}</devtools-report-section-header>
632
+ <devtools-report-section-header role="heading" aria-level="2">${
633
+ i18nString(UIStrings.cookieCravings)}</devtools-report-section-header>
626
634
  ${
627
635
  cookieCravings.length > 0 ? html`
628
636
  <div class="device-bound-session-grid-wrapper">
629
- <devtools-data-grid class="device-bound-session-cookie-cravings-grid" striped inline>
637
+ <devtools-data-grid class="device-bound-session-cookie-cravings-grid" striped inline name=${
638
+ i18nString(UIStrings.cookieCravings)}>
630
639
  <table>
631
640
  <thead>
632
641
  <tr>
633
- <th id="name" weight="2" sortable>${i18nString(UIStrings.name)}</th>
634
- <th id="domain" weight="2" sortable>${i18n.i18n.lockedString('Domain')}</th>
635
- <th id="path" weight="2" sortable>${i18n.i18n.lockedString('Path')}</th>
636
- <th id="secure" type="boolean" align="center" weight="1" sortable>${
637
- i18n.i18n.lockedString('Secure')}</th>
638
- <th id="http-only" type="boolean" align="center" weight="1" sortable>${
639
- i18n.i18n.lockedString('HttpOnly')}</th>
640
- <th id="same-site" weight="1" sortable>${i18n.i18n.lockedString('SameSite')}</th>
642
+ <th id="name" sortable>${i18nString(UIStrings.name)}</th>
643
+ <th id="domain" sortable>${i18n.i18n.lockedString('Domain')}</th>
644
+ <th id="path" sortable>${i18n.i18n.lockedString('Path')}</th>
645
+ <th id="secure" type="boolean" align="center" sortable>${i18n.i18n.lockedString('Secure')}</th>
646
+ <th id="http-only" type="boolean" align="center" sortable>${i18n.i18n.lockedString('HttpOnly')}</th>
647
+ <th id="same-site" sortable>${i18n.i18n.lockedString('SameSite')}</th>
641
648
  </tr>
642
649
  </thead>
643
650
  <tbody>
@@ -660,27 +667,28 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
660
667
  }
661
668
  const events = [...sessionAndEvents.eventsById.values()];
662
669
  const eventsHtml = html`
663
- <devtools-report-section-header>${i18nString(UIStrings.events)}</devtools-report-section-header>
670
+ <devtools-report-section-header role="heading" aria-level="2">${
671
+ i18nString(UIStrings.events)}</devtools-report-section-header>
664
672
  ${
665
673
  events.length > 0 && onEventRowSelected ?
666
674
  html`
667
675
  <div class="device-bound-session-grid-wrapper">
668
- <devtools-data-grid class="device-bound-session-events-grid" striped inline ${
669
- Directives.ref((el?: Element) => {
670
- if (!el || !(el instanceof HTMLElement)) {
671
- return;
672
- }
673
- const grid = el as HTMLElement & {deselectRow(): void};
674
- if (!selectedEvent) {
675
- grid.deselectRow();
676
- }
677
- })}>
676
+ <devtools-data-grid class="device-bound-session-events-grid" striped inline name=${
677
+ i18nString(UIStrings.events)} ${Directives.ref((el?: Element) => {
678
+ if (!el || !(el instanceof HTMLElement)) {
679
+ return;
680
+ }
681
+ const grid = el as HTMLElement & {deselectRow(): void};
682
+ if (!selectedEvent) {
683
+ grid.deselectRow();
684
+ }
685
+ })}>
678
686
  <table>
679
687
  <thead>
680
688
  <tr>
681
- <th id="type" weight="1" sortable>${i18nString(UIStrings.type)}</th>
682
- <th id="timestamp" weight="2" sortable>${i18nString(UIStrings.timestamp)}</th>
683
- <th id="details" weight="2" sortable>${i18nString(UIStrings.result)}</th>
689
+ <th id="type" sortable>${i18nString(UIStrings.type)}</th>
690
+ <th id="timestamp" sortable>${i18nString(UIStrings.timestamp)}</th>
691
+ <th id="details" sortable>${i18nString(UIStrings.result)}</th>
684
692
  </tr>
685
693
  </thead>
686
694
  <tbody>${events.map(({event, timestamp}) => html`
@@ -764,7 +772,8 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
764
772
  ` :
765
773
  html`<div class="device-bound-session-no-event-details">${i18nString(UIStrings.selectEventToViewDetails)}</div>`;
766
774
  const eventDetailsHtml = html`
767
- <devtools-report-section-header>${i18nString(UIStrings.eventDetails)}</devtools-report-section-header>
775
+ <devtools-report-section-header role="heading" aria-level="2">${
776
+ i18nString(UIStrings.eventDetails)}</devtools-report-section-header>
768
777
  ${eventDetailsContentHtml}
769
778
  `;
770
779
 
@@ -774,11 +783,13 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
774
783
  <style>${deviceBoundSessionsViewStyles}</style>
775
784
  ${toolbarHtml}
776
785
  <devtools-split-view sidebar-position="second">
777
- <div slot="main" class="device-bound-session-view-wrapper">
786
+ <div slot="main" class="device-bound-session-view-wrapper" role="region" aria-label=${
787
+ i18nString(UIStrings.sessionDetails)}>
778
788
  ${sessionDetailsHtml || nothing}
779
789
  ${eventsHtml}
780
790
  </div>
781
- <div slot="sidebar" class="device-bound-session-sidebar">
791
+ <div slot="sidebar" class="device-bound-session-sidebar" role="region" aria-label=${
792
+ i18nString(UIStrings.eventDetails)}>
782
793
  ${eventDetailsHtml}
783
794
  </div>
784
795
  </devtools-split-view>`,
@@ -180,6 +180,7 @@ export class ServiceWorkerUpdateCycleView {
180
180
  const tr = this.tableElement.createChild('tr', 'service-worker-update-timeline');
181
181
  tr.setAttribute('jslog', `${VisualLogging.treeItem('update-timeline').track({
182
182
  click: true,
183
+ resize: true,
183
184
  keydown: 'ArrowLeft|ArrowRight|ArrowUp|ArrowDown|Enter|Space',
184
185
  })}`);
185
186
  this.rows.push(tr);
@@ -353,7 +353,7 @@ function renderFramesPerReason(frames: string[]|undefined): LitTemplate {
353
353
  }
354
354
  const rows = [html`<div>${i18nString(UIStrings.framesPerIssue, {n: frames.length})}</div>`];
355
355
  rows.push(...frames.map(url => html`<div class="text-ellipsis" title=${url}
356
- jslog=${VisualLogging.treeItem()}>${url}</div>`));
356
+ jslog=${VisualLogging.treeItem().track({resize: true})}>${url}</div>`));
357
357
  return html`
358
358
  <div class="details-list"
359
359
  jslog=${VisualLogging.tree('frames-per-issue')}>
@@ -361,7 +361,9 @@ function renderFramesPerReason(frames: string[]|undefined): LitTemplate {
361
361
  rows,
362
362
  title: i18nString(UIStrings.framesPerIssue, {n: frames.length}),
363
363
  } as ExpandableList.ExpandableList.ExpandableListData}
364
- jslog=${VisualLogging.treeItem()}></devtools-expandable-list>
364
+ jslog=${VisualLogging.treeItem().track({
365
+ resize: true
366
+ })}></devtools-expandable-list>
365
367
  </div>
366
368
  `;
367
369
  }
@@ -4,7 +4,7 @@
4
4
  * found in the LICENSE file.
5
5
  */
6
6
  .device-bound-session-grid-wrapper {
7
- padding: 0 20px 5px;
7
+ margin: 0 20px 5px;
8
8
  }
9
9
 
10
10
  .device-bound-session-grid-wrapper devtools-data-grid {
@@ -144,7 +144,7 @@ const DEFAULT_VIEW: View = (input: ViewInput, _output: ViewOutput, target: HTMLE
144
144
  // clang-format off
145
145
  return html`
146
146
  <span class=${spanClasses}
147
- jslog=${VisualLogging.item('matched-address-item').track({hover: true})}
147
+ jslog=${VisualLogging.item('matched-address-item').track({hover: true, resize: true})}
148
148
  @mouseenter=${() => input.onHighlightMatchesInAddress(startIndex)}
149
149
  @mouseleave=${input.onClearHighlightedMatches}>
150
150
  ${templateLines}
@@ -238,6 +238,7 @@ export class XHRBreakpointsSidebarPane extends UI.Widget.VBox implements UI.Cont
238
238
  listItemElement.setAttribute('jslog', `${VisualLogging.item().track({
239
239
  click: true,
240
240
  dblclick: true,
241
+ resize: true,
241
242
  keydown: 'ArrowUp|ArrowDown|PageUp|PageDown|Enter|Space',
242
243
  })}`);
243
244
  return listItemElement;
@@ -55,9 +55,10 @@ const UIStringsNotTranslate = {
55
55
  const lockedString = i18n.i18n.lockedString;
56
56
 
57
57
  export class AiCodeGenerationUpgradeDialog {
58
- static show({noLogging}: {noLogging: boolean}): void {
58
+ static show({noLogging}: {noLogging: boolean}): Promise<boolean> {
59
59
  const dialog = new UI.Dialog.Dialog();
60
60
  dialog.setAriaLabel(lockedString(UIStringsNotTranslate.codeCompletionJustGotBetter));
61
+ const result = Promise.withResolvers<boolean>();
61
62
  // clang-format off
62
63
  Lit.render(html`
63
64
  <div class="ai-code-generation-upgrade-dialog">
@@ -96,7 +97,8 @@ export class AiCodeGenerationUpgradeDialog {
96
97
  <div class="right-buttons">
97
98
  <devtools-button
98
99
  @click=${() => {
99
- void UI.ViewManager.ViewManager.instance().showView('chrome-ai');
100
+ result.resolve(true);
101
+ void UI.ViewManager.ViewManager.instance().showView('chrome-ai');
100
102
  }}
101
103
  jslogcontext="ai-code-generation-upgrade-dialog.manage-in-settings"
102
104
  .variant=${Buttons.Button.Variant.OUTLINED}
@@ -105,6 +107,7 @@ export class AiCodeGenerationUpgradeDialog {
105
107
  </devtools-button>
106
108
  <devtools-button
107
109
  @click=${() => {
110
+ result.resolve(true);
108
111
  dialog.hide();
109
112
  }}
110
113
  jslogcontext="ai-code-generation-upgrade-dialog.continue"
@@ -117,13 +120,18 @@ export class AiCodeGenerationUpgradeDialog {
117
120
  // clang-format on
118
121
 
119
122
  dialog.setOutsideClickCallback(ev => {
120
- ev.consume(true); // true = preventDefault()
121
- dialog.hide();
123
+ ev.consume(true);
124
+ });
125
+
126
+ dialog.setOnHideCallback(() => {
127
+ result.resolve(false);
122
128
  });
123
129
 
124
130
  dialog.setSizeBehavior(UI.GlassPane.SizeBehavior.MEASURE_CONTENT);
125
131
  dialog.setDimmed(true);
126
132
  dialog.show();
133
+
134
+ return result.promise;
127
135
  }
128
136
 
129
137
  private constructor() {
@@ -81,7 +81,7 @@ export const DEFAULT_VIEW: View = (input, _output, target): void => {
81
81
  .variant=${Buttons.Button.Variant.ICON}
82
82
  .size=${Buttons.Button.Size.REGULAR}
83
83
  .title=${i18nString(UIStrings.dismiss)}
84
- jslog=${VisualLogging.close().track({click: true})}
84
+ jslog=${VisualLogging.close().track({click: true}).context('gemini-promo-dismiss')}
85
85
  @click=${() => input.onCancelClick()}
86
86
  ></devtools-button>
87
87
  </div>
@@ -111,11 +111,11 @@ export const DEFAULT_VIEW: View = (input, _output, target): void => {
111
111
  <div class="buttons">
112
112
  <devtools-button
113
113
  .variant=${Buttons.Button.Variant.OUTLINED}
114
- .jslogContext=${'cancel'}
114
+ jslog=${VisualLogging.close().track({click: true}).context('gemini-promo-dismiss')}
115
115
  @click=${input.onCancelClick}>${i18nString(UIStrings.dismiss)}</devtools-button>
116
116
  <devtools-button
117
117
  .variant=${Buttons.Button.Variant.PRIMARY}
118
- .jslogContext=${'get-started'}
118
+ .jslogContext=${'gemini-promo-get-started'}
119
119
  @click=${input.onGetStartedClick}>${i18nString(UIStrings.getStarted)}</devtools-button>
120
120
  </div>
121
121
  `,
@@ -160,7 +160,7 @@ export class GeminiRebrandPromoDialog extends UI.Widget.VBox {
160
160
  }
161
161
 
162
162
  static show(): void {
163
- const dialog = new UI.Dialog.Dialog('gemini-rebranding-dialog');
163
+ const dialog = new UI.Dialog.Dialog('gemini-promo-dialog');
164
164
  dialog.setAriaLabel(i18nString(UIStrings.dialogAriaLabel));
165
165
  dialog.setMaxContentSize(new Geometry.Size(384, 500));
166
166
  dialog.setSizeBehavior(UI.GlassPane.SizeBehavior.SET_EXACT_WIDTH_MAX_HEIGHT);
@@ -181,7 +181,7 @@ export class GeminiRebrandPromoDialog extends UI.Widget.VBox {
181
181
  }
182
182
 
183
183
  const setting = Common.Settings.Settings.instance().createSetting<boolean>(
184
- 'gemini-rebranding-dialog-shown', false, Common.Settings.SettingStorageType.SYNCED);
184
+ 'gemini-promo-dialog-shown', false, Common.Settings.SettingStorageType.SYNCED);
185
185
  if (setting.get()) {
186
186
  return;
187
187
  }
@@ -1457,6 +1457,7 @@ export class ConsoleViewMessage implements ConsoleViewportElement {
1457
1457
  this.elementInternal.className = 'console-message-wrapper';
1458
1458
  this.elementInternal.setAttribute('jslog', `${VisualLogging.item('console-message').track({
1459
1459
  click: true,
1460
+ resize: true,
1460
1461
  keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter|Space|Home|End',
1461
1462
  })}`);
1462
1463
  this.elementInternal.removeChildren();
@@ -680,6 +680,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
680
680
  this.listItemElement.setAttribute(
681
681
  'jslog', `${VisualLogging.treeItem().parent('elementsTreeOutline').track({
682
682
  keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Backspace|Delete|Enter|Space|Home|End',
683
+ resize: true,
683
684
  drag: true,
684
685
  click: true,
685
686
  })}`);
@@ -228,26 +228,27 @@ const DEFAULT_VIEW: View = (input, output, target) => {
228
228
  event.preventDefault();
229
229
  }
230
230
  };
231
+ // clang-format off
231
232
  const renderElement = (element: LayoutElement): Lit.LitTemplate => html`<div
232
233
  class="element"
233
- jslog=${VisualLogging.item()}>
234
+ jslog=${VisualLogging.item().track({resize: true})}>
234
235
  <devtools-checkbox
235
236
  data-element="true"
236
237
  class="checkbox-label"
237
238
  .checked=${element.enabled}
238
239
  @change=${(e: Event) => input.onElementToggle(element, e)}
239
- jslog=${VisualLogging.toggle().track({
240
- click: true
241
- })}>
240
+ jslog=${VisualLogging.toggle().track({click: true, resize: true })}>
242
241
  <span
243
242
  class="node-text-container"
244
243
  data-label="true"
245
244
  @mouseenter=${(e: MouseEvent) => input.onMouseEnter(element, e)}
246
245
  @mouseleave=${(e: MouseEvent) => input.onMouseLeave(element, e)}>
247
246
  <devtools-node-text .data=${{
248
- nodeId: element.domId, nodeTitle: element.name, nodeClasses: element.domClasses,
249
- }
250
- }></devtools-node-text>
247
+ nodeId: element.domId,
248
+ nodeTitle: element.name,
249
+ nodeClasses: element.domClasses
250
+ }}>
251
+ </devtools-node-text>
251
252
  </span>
252
253
  </devtools-checkbox>
253
254
  <label
@@ -303,7 +303,7 @@ export class ElementsBreadcrumbs extends HTMLElement {
303
303
  data-crumb="true"
304
304
  >
305
305
  <a href="#" draggable=false class="crumb-link"
306
- jslog=${VisualLogging.item().track({click:true})}
306
+ jslog=${VisualLogging.item().track({click:true, resize:true})}
307
307
  @click=${this.#onCrumbClick(crumb.node)}
308
308
  @mousemove=${this.#onCrumbMouseMove(crumb.node)}
309
309
  @mouseleave=${this.#onCrumbMouseLeave(crumb.node)}
@@ -194,7 +194,8 @@ export class StylePropertyEditor extends HTMLElement {
194
194
  return html`
195
195
  <button title=${title}
196
196
  class=${classes}
197
- jslog=${VisualLogging.item().track({click: true}).context(`${propertyName}-${propertyValue}`)}
197
+ jslog=${
198
+ VisualLogging.item().track({click: true, resize: true}).context(`${propertyName}-${propertyValue}`)}
198
199
  @click=${() => this.#onButtonClick(propertyName, propertyValue, selected)}>
199
200
  <devtools-icon style=${transform} name=${iconInfo.iconName}>
200
201
  </devtools-icon>
@@ -197,7 +197,7 @@ export class LighthouseReportRenderer {
197
197
  continue;
198
198
  }
199
199
 
200
- auditEl.setAttribute('jslog', `${VisualLogging.item(`lighthouse.audit.${id}`)}`);
200
+ auditEl.setAttribute('jslog', `${VisualLogging.item(`lighthouse.audit.${id}`).track({resize: true})}`);
201
201
 
202
202
  let state: string|undefined;
203
203
  for (const className of auditEl.classList) {
@@ -60,7 +60,7 @@ function renderEndiannessSetting(
60
60
  data-endianness="true" @change=${(e: Event) => onEndiannessChanged((e.target as HTMLSelectElement).value as Endianness)}>
61
61
  ${[Endianness.LITTLE, Endianness.BIG].map(endianness => {
62
62
  return html`<option value=${endianness} .selected=${currentEndiannes === endianness}
63
- jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(endianness)).track({click: true})}>${
63
+ jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(endianness)).track({click: true, resize: true})}>${
64
64
  i18n.i18n.lockedString(endianness)}</option>`;
65
65
  })}
66
66
  </select>
@@ -104,7 +104,7 @@ export const DEFAULT_VIEW: View = (input: ViewInput, _output: undefined, target:
104
104
  ${VALUE_TYPE_MODE_LIST.filter(x => isValidMode(type, x)).map(mode => {
105
105
  return html`
106
106
  <option value=${mode} .selected=${input.valueTypeModes.get(type) === mode}
107
- jslog=${VisualLogging.item(mode).track({click: true})}>${
107
+ jslog=${VisualLogging.item(mode).track({click: true, resize: true})}>${
108
108
  i18n.i18n.lockedString(mode)}
109
109
  </option>`;
110
110
  })}
@@ -73,7 +73,7 @@ const DEFAULT_VIEW: View = (input, _output, target) => {
73
73
  })}
74
74
  @click=${() => input.onPlayerClick(player.playerID)}
75
75
  @contextmenu=${(e: Event) => input.onPlayerContextMenu(player.playerID, e)}
76
- jslog=${VisualLogging.item('player').track({click: true})}>
76
+ jslog=${VisualLogging.item('player').track({click: true, resize: true})}>
77
77
  <div class="player-entry-status-icon vbox">
78
78
  <div class="player-entry-status-icon-centering">
79
79
  <devtools-icon name=${player.iconName}></devtools-icon>
@@ -21,6 +21,7 @@ import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
21
21
  import * as NetworkComponents from './components/components.js';
22
22
  import {EventSourceMessagesView} from './EventSourceMessagesView.js';
23
23
  import {RequestCookiesView} from './RequestCookiesView.js';
24
+ import {RequestDeviceBoundSessionsView} from './RequestDeviceBoundSessionsView.js';
24
25
  import {RequestInitiatorView} from './RequestInitiatorView.js';
25
26
  import {RequestPayloadView} from './RequestPayloadView.js';
26
27
  import {RequestPreviewView} from './RequestPreviewView.js';
@@ -114,6 +115,17 @@ const UIStrings = {
114
115
  * @description Text for web cookies
115
116
  */
116
117
  cookies: 'Cookies',
118
+ /**
119
+ * @description Title of the Device Bound Sessions tab in the Network panel. A
120
+ * website may decide to create a session for a user, for example when the user
121
+ * logs in. They can use a protocol to make it a "device bound session". That
122
+ * means that when the session expires, it is only possible for it to be
123
+ * extended on the device it was created on. Thus the session is considered
124
+ * to be bound to that device. For more details on the protocol, see
125
+ * https://github.com/w3c/webappsec-dbsc/blob/main/README.md and
126
+ * https://w3c.github.io/webappsec-dbsc/.
127
+ */
128
+ deviceBoundSessions: 'Device bound sessions',
117
129
  /**
118
130
  * @description Text in Network Item View of the Network panel
119
131
  */
@@ -140,6 +152,7 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
140
152
  #payloadView: RequestPayloadView|null = null;
141
153
  readonly #responseView: RequestResponseView|undefined;
142
154
  #cookiesView: RequestCookiesView|null = null;
155
+ #deviceBoundSessionsView: RequestDeviceBoundSessionsView|null = null;
143
156
  #initialTab?: NetworkForward.UIRequestLocation.UIRequestTabs;
144
157
  readonly #firstTab: NetworkForward.UIRequestLocation.UIRequestTabs;
145
158
 
@@ -253,10 +266,10 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
253
266
  super.wasShown();
254
267
  this.#request.addEventListener(SDK.NetworkRequest.Events.REQUEST_HEADERS_CHANGED, this.requestHeadersChanged, this);
255
268
  this.#request.addEventListener(
256
- SDK.NetworkRequest.Events.RESPONSE_HEADERS_CHANGED, this.maybeAppendCookiesPanel, this);
269
+ SDK.NetworkRequest.Events.RESPONSE_HEADERS_CHANGED, this.maybeAppendCookieResponsePanels, this);
257
270
  this.#request.addEventListener(
258
271
  SDK.NetworkRequest.Events.TRUST_TOKEN_RESULT_ADDED, this.maybeShowErrorIconInTrustTokenTabHeader, this);
259
- this.maybeAppendCookiesPanel();
272
+ this.maybeAppendCookieResponsePanels();
260
273
  this.maybeShowErrorIconInTrustTokenTabHeader();
261
274
 
262
275
  // Only select the initial tab the first time the view is shown after construction.
@@ -283,7 +296,7 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
283
296
  this.#request.removeEventListener(
284
297
  SDK.NetworkRequest.Events.REQUEST_HEADERS_CHANGED, this.requestHeadersChanged, this);
285
298
  this.#request.removeEventListener(
286
- SDK.NetworkRequest.Events.RESPONSE_HEADERS_CHANGED, this.maybeAppendCookiesPanel, this);
299
+ SDK.NetworkRequest.Events.RESPONSE_HEADERS_CHANGED, this.maybeAppendCookieResponsePanels, this);
287
300
  this.#request.removeEventListener(
288
301
  SDK.NetworkRequest.Events.TRUST_TOKEN_RESULT_ADDED, this.maybeShowErrorIconInTrustTokenTabHeader, this);
289
302
  }
@@ -293,6 +306,11 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
293
306
  void this.maybeAppendPayloadPanel();
294
307
  }
295
308
 
309
+ private maybeAppendCookieResponsePanels(): void {
310
+ this.maybeAppendCookiesPanel();
311
+ this.maybeAppendDeviceBoundSessionsPanel();
312
+ }
313
+
296
314
  private maybeAppendCookiesPanel(): void {
297
315
  const cookiesPresent = this.#request.hasRequestCookies() || this.#request.responseCookies.length > 0;
298
316
  console.assert(cookiesPresent || !this.#cookiesView, 'Cookies were introduced in headers and then removed!');
@@ -311,6 +329,17 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
311
329
  }
312
330
  }
313
331
 
332
+ private maybeAppendDeviceBoundSessionsPanel(): void {
333
+ const deviceBoundSessionsPresent = this.#request.getDeviceBoundSessionUsages().length > 0;
334
+ if (deviceBoundSessionsPresent && !this.#deviceBoundSessionsView) {
335
+ this.#deviceBoundSessionsView = new RequestDeviceBoundSessionsView(this.#request);
336
+ this.appendTab(
337
+ NetworkForward.UIRequestLocation.UIRequestTabs.DEVICE_BOUND_SESSIONS,
338
+ i18nString(UIStrings.deviceBoundSessions), this.#deviceBoundSessionsView,
339
+ i18nString(UIStrings.deviceBoundSessions));
340
+ }
341
+ }
342
+
314
343
  private async maybeAppendPayloadPanel(): Promise<void> {
315
344
  if (this.hasTab('payload')) {
316
345
  return;
@@ -409,7 +409,8 @@ export class NetworkLogViewColumns {
409
409
 
410
410
  private createWaterfallHeader(): void {
411
411
  this.waterfallHeaderElement = this.waterfallColumn.contentElement.createChild('div', 'network-waterfall-header');
412
- this.waterfallHeaderElement.setAttribute('jslog', `${VisualLogging.tableHeader('waterfall').track({click: true})}`);
412
+ this.waterfallHeaderElement.setAttribute(
413
+ 'jslog', `${VisualLogging.tableHeader('waterfall').track({click: true, resize: true})}`);
413
414
  this.waterfallHeaderElement.addEventListener('click', waterfallHeaderClicked.bind(this));
414
415
  this.waterfallHeaderElement.addEventListener('contextmenu', event => {
415
416
  const contextMenu = new UI.ContextMenu.ContextMenu(event);