chrome-devtools-frontend 1.0.1566234 → 1.0.1567721

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 (188) hide show
  1. package/docs/contributing/performance.md +24 -0
  2. package/front_end/core/common/Base64.ts +21 -2
  3. package/front_end/core/common/ResourceType.ts +7 -0
  4. package/front_end/core/host/InspectorFrontendHostStub.ts +3 -0
  5. package/front_end/core/host/UserMetrics.ts +20 -0
  6. package/front_end/core/sdk/NetworkManager.ts +3 -3
  7. package/front_end/entrypoints/main/MainImpl.ts +1 -7
  8. package/front_end/generated/Deprecation.ts +0 -8
  9. package/front_end/generated/InspectorBackendCommands.ts +1 -1
  10. package/front_end/generated/SupportedCSSProperties.js +39 -49
  11. package/front_end/generated/protocol.ts +4 -0
  12. package/front_end/models/ai_assistance/agents/AiAgent.ts +2 -1
  13. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +98 -105
  14. package/front_end/models/emulation/DeviceModeModel.ts +1 -1
  15. package/front_end/models/formatter/FormatterWorkerPool.ts +8 -6
  16. package/front_end/models/javascript_metadata/NativeFunctions.js +4 -9
  17. package/front_end/models/persistence/PersistenceImpl.ts +8 -0
  18. package/front_end/models/text_utils/TextUtils.snapshot.txt +83 -0
  19. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +0 -1
  20. package/front_end/panels/ai_assistance/components/ArtifactsViewer.ts +28 -4
  21. package/front_end/panels/ai_assistance/components/ChatView.ts +52 -169
  22. package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +27 -8
  23. package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +19 -4
  24. package/front_end/panels/application/ApplicationPanelSidebar.ts +1 -0
  25. package/front_end/panels/application/DeviceBoundSessionsModel.ts +42 -0
  26. package/front_end/panels/application/DeviceBoundSessionsTreeElement.ts +60 -11
  27. package/front_end/panels/application/DeviceBoundSessionsView.ts +947 -103
  28. package/front_end/panels/application/ResourcesPanel.ts +7 -0
  29. package/front_end/panels/application/deviceBoundSessionsView.css +10 -1
  30. package/front_end/panels/common/AiCodeGenerationUpgradeDialog.ts +115 -0
  31. package/front_end/panels/common/aiCodeGenerationUpgradeDialog.css +79 -0
  32. package/front_end/panels/common/common.ts +1 -0
  33. package/front_end/panels/console/ConsoleInsightTeaser.ts +17 -3
  34. package/front_end/panels/issues/AffectedSourcesView.ts +0 -1
  35. package/front_end/panels/issues/IssuesPane.ts +0 -4
  36. package/front_end/panels/network/RequestTimingView.ts +5 -20
  37. package/front_end/panels/network/networkTimingTable.css +5 -5
  38. package/front_end/panels/recorder/components/StepEditor.ts +15 -8
  39. package/front_end/panels/settings/AISettingsTab.ts +31 -2
  40. package/front_end/panels/sources/InplaceFormatterEditorAction.ts +8 -6
  41. package/front_end/panels/sources/UISourceCodeFrame.ts +9 -3
  42. package/front_end/panels/timeline/TimelinePanel.ts +12 -4
  43. package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +1 -1
  44. package/front_end/third_party/chromium/README.chromium +1 -1
  45. package/front_end/third_party/puppeteer/README.chromium +2 -2
  46. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +9 -2
  47. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  48. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  49. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +8 -0
  50. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  51. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js +8 -0
  52. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  53. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts +2 -1
  54. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts.map +1 -1
  55. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js +2 -2
  56. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js.map +1 -1
  57. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  58. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js +3 -1
  59. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js.map +1 -1
  60. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
  61. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +1 -1
  62. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
  63. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  64. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +3 -3
  65. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  66. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.d.ts +1 -0
  67. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.d.ts.map +1 -1
  68. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.js +1 -0
  69. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.js.map +1 -1
  70. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  71. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +1 -0
  72. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  74. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +33 -31
  75. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.d.ts +2 -2
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.d.ts.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js +1 -4
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +7 -1
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js +11 -1
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js.map +1 -1
  84. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Cookie.d.ts +2 -2
  85. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +2 -2
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +2 -2
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  89. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  90. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  91. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +13 -4
  92. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +62 -42
  93. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +9 -2
  94. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  96. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +8 -0
  97. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  98. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js +8 -0
  99. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  100. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts +2 -1
  101. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts.map +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js +2 -2
  103. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js +3 -1
  106. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +3 -3
  112. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.d.ts +1 -0
  114. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.d.ts.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.js +1 -0
  116. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.js.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +1 -0
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +33 -31
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.d.ts +2 -2
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.d.ts.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js +1 -4
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts +7 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js +11 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Cookie.d.ts +2 -2
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +2 -2
  133. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +2 -2
  134. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  136. package/front_end/third_party/puppeteer/package/lib/types.d.ts +13 -4
  137. package/front_end/third_party/puppeteer/package/package.json +3 -3
  138. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +11 -3
  139. package/front_end/third_party/puppeteer/package/src/api/Page.ts +9 -0
  140. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +3 -3
  141. package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +3 -1
  142. package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -0
  143. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +3 -5
  144. package/front_end/third_party/puppeteer/package/src/bidi/core/UserContext.ts +2 -0
  145. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +1 -0
  146. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +43 -45
  147. package/front_end/third_party/puppeteer/package/src/cdp/WebWorker.ts +3 -11
  148. package/front_end/third_party/puppeteer/package/src/common/ConsoleMessage.ts +12 -0
  149. package/front_end/third_party/puppeteer/package/src/common/Cookie.ts +2 -2
  150. package/front_end/third_party/puppeteer/package/src/revisions.ts +2 -2
  151. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  152. package/front_end/third_party/source-map-scopes-codec/README.chromium +2 -5
  153. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/builder.d.ts +1 -1
  154. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/builder.d.ts.map +1 -1
  155. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/safe_builder.d.ts +1 -1
  156. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/safe_builder.d.ts.map +1 -1
  157. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/decode/decode.d.ts +1 -1
  158. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/decode/decode.d.ts.map +1 -1
  159. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/encode/encode.d.ts +1 -1
  160. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/encode/encode.d.ts.map +1 -1
  161. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/mod.d.ts +1 -1
  162. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/mod.d.ts.map +1 -1
  163. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/scopes.d.ts +130 -0
  164. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/scopes.d.ts.map +1 -0
  165. package/front_end/third_party/source-map-scopes-codec/package/deno.json +1 -1
  166. package/front_end/third_party/source-map-scopes-codec/package/package.json +1 -1
  167. package/front_end/third_party/source-map-scopes-codec/package/src/builder/builder.ts +1 -1
  168. package/front_end/third_party/source-map-scopes-codec/package/src/builder/safe_builder.ts +1 -1
  169. package/front_end/third_party/source-map-scopes-codec/package/src/codec.js +4 -0
  170. package/front_end/third_party/source-map-scopes-codec/package/src/codec.js.map +1 -1
  171. package/front_end/third_party/source-map-scopes-codec/package/src/codec.ts +4 -0
  172. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +30 -13
  173. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js.map +1 -1
  174. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.ts +35 -17
  175. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encode.ts +1 -1
  176. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
  177. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js.map +1 -1
  178. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.ts +2 -2
  179. package/front_end/third_party/source-map-scopes-codec/package/src/mod.ts +1 -1
  180. package/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +7 -0
  181. package/front_end/third_party/source-map-scopes-codec/package/src/scopes.js.map +1 -0
  182. package/front_end/third_party/source-map-scopes-codec/package/src/util.ts +1 -1
  183. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +4 -0
  184. package/front_end/ui/visual_logging/KnownContextValues.ts +11 -0
  185. package/mcp/mcp.ts +1 -0
  186. package/package.json +1 -2
  187. package/front_end/third_party/source-map-scopes-codec/package/src/scopes-tsconfig.json +0 -8
  188. /package/front_end/third_party/source-map-scopes-codec/package/src/{scopes.d.ts → scopes.ts} +0 -0
@@ -48,10 +48,45 @@ export class DeviceBoundSessionsModel extends Common.ObjectWrapper.ObjectWrapper
48
48
  }
49
49
 
50
50
  clearVisibleSites(): void {
51
+ if (this.getPreserveLogSetting().get()) {
52
+ return;
53
+ }
51
54
  this.#visibleSites.clear();
52
55
  this.dispatchEventToListeners(DeviceBoundSessionModelEvents.CLEAR_VISIBLE_SITES);
53
56
  }
54
57
 
58
+ clearEvents(): void {
59
+ if (this.getPreserveLogSetting().get()) {
60
+ return;
61
+ }
62
+ const emptySessions = new Map<string, Array<string|undefined>>();
63
+ const emptySites = new Set<string>();
64
+ for (const [site, sessionIdToSessionMap] of [...this.#siteSessions]) {
65
+ let emptySessionsSiteEntry = emptySessions.get(site);
66
+ for (const [sessionId, sessionAndEvents] of sessionIdToSessionMap) {
67
+ sessionAndEvents.eventsById.clear();
68
+ if (sessionAndEvents.session) {
69
+ continue;
70
+ }
71
+ // Remove empty sessions.
72
+ sessionIdToSessionMap.delete(sessionId);
73
+ if (!emptySessionsSiteEntry) {
74
+ emptySessionsSiteEntry = [];
75
+ emptySessions.set(site, emptySessionsSiteEntry);
76
+ }
77
+ emptySessionsSiteEntry.push(sessionId);
78
+ }
79
+
80
+ // Remove empty sites.
81
+ if (sessionIdToSessionMap.size === 0) {
82
+ this.#siteSessions.delete(site);
83
+ emptySites.add(site);
84
+ }
85
+ }
86
+
87
+ this.dispatchEventToListeners(DeviceBoundSessionModelEvents.CLEAR_EVENTS, {emptySessions, emptySites});
88
+ }
89
+
55
90
  isSiteVisible(site: string): boolean {
56
91
  return this.#visibleSites.has(site);
57
92
  }
@@ -60,6 +95,10 @@ export class DeviceBoundSessionsModel extends Common.ObjectWrapper.ObjectWrapper
60
95
  return this.#siteSessions.get(site)?.get(sessionId);
61
96
  }
62
97
 
98
+ getPreserveLogSetting(): Common.Settings.Setting<boolean> {
99
+ return Common.Settings.Settings.instance().createSetting('device-bound-sessions-preserve-log', false);
100
+ }
101
+
63
102
  #onSessionsSet({data: sessions}: {data: Protocol.Network.DeviceBoundSession[]}): void {
64
103
  for (const session of sessions) {
65
104
  const sessionAndEvents = this.#ensureSiteAndSessionInitialized(session.key.site, session.key.id);
@@ -117,6 +156,7 @@ export const enum DeviceBoundSessionModelEvents {
117
156
  ADD_VISIBLE_SITE = 'ADD_VISIBLE_SITE',
118
157
  CLEAR_VISIBLE_SITES = 'CLEAR_VISIBLE_SITES',
119
158
  EVENT_OCCURRED = 'EVENT_OCCURRED',
159
+ CLEAR_EVENTS = 'CLEAR_EVENTS',
120
160
  }
121
161
 
122
162
  export interface DeviceBoundSessionModelEventTypes {
@@ -124,4 +164,6 @@ export interface DeviceBoundSessionModelEventTypes {
124
164
  [DeviceBoundSessionModelEvents.ADD_VISIBLE_SITE]: {site: string};
125
165
  [DeviceBoundSessionModelEvents.CLEAR_VISIBLE_SITES]: void;
126
166
  [DeviceBoundSessionModelEvents.EVENT_OCCURRED]: {site: string, sessionId?: string};
167
+ [DeviceBoundSessionModelEvents.CLEAR_EVENTS]:
168
+ {emptySessions: Map<string, Array<string|undefined>>, emptySites: Set<string>};
127
169
  }
@@ -7,7 +7,7 @@ import * as i18n from '../../core/i18n/i18n.js';
7
7
  import type * as Platform from '../../core/platform/platform.js';
8
8
  import {createIcon} from '../../ui/kit/kit.js';
9
9
 
10
- import {ApplicationPanelTreeElement, ExpandableApplicationPanelTreeElement} from './ApplicationPanelTreeElement.js';
10
+ import {ApplicationPanelTreeElement} from './ApplicationPanelTreeElement.js';
11
11
  import {
12
12
  DeviceBoundSessionModelEvents,
13
13
  type DeviceBoundSessionModelEventTypes,
@@ -51,14 +51,15 @@ const UIStrings = {
51
51
  const str_ = i18n.i18n.registerUIStrings('panels/application/DeviceBoundSessionsTreeElement.ts', UIStrings);
52
52
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
53
53
 
54
- export class RootTreeElement extends ExpandableApplicationPanelTreeElement {
54
+ export class RootTreeElement extends ApplicationPanelTreeElement {
55
55
  #model: DeviceBoundSessionsModel;
56
- #sites = new Map<string, {siteTreeElement: ExpandableApplicationPanelTreeElement, sessions: Set<string|undefined>}>();
56
+ #sites = new Map<string, {
57
+ siteTreeElement: ApplicationPanelTreeElement,
58
+ sessions: Map<string|undefined, ApplicationPanelTreeElement>,
59
+ }>();
57
60
 
58
61
  constructor(storagePanel: ResourcesPanel, model: DeviceBoundSessionsModel) {
59
- super(
60
- storagePanel, i18nString(UIStrings.deviceBoundSessions), i18nString(UIStrings.deviceBoundSessions),
61
- i18nString(UIStrings.deviceBoundSessionsCategoryDescription), 'device-bound-sessions-root');
62
+ super(storagePanel, i18nString(UIStrings.deviceBoundSessions), /* expandable=*/ true, 'device-bound-sessions-root');
62
63
  this.setLeadingIcons([createIcon('lock-person')]);
63
64
  this.#model = model;
64
65
  }
@@ -67,12 +68,21 @@ export class RootTreeElement extends ExpandableApplicationPanelTreeElement {
67
68
  return 'device-bound-sessions://' as Platform.DevToolsPath.UrlString;
68
69
  }
69
70
 
71
+ override onselect(selectedByUser?: boolean): boolean {
72
+ super.onselect(selectedByUser);
73
+ this.resourcesPanel.showDeviceBoundSessionDefault(
74
+ this.#model, i18nString(UIStrings.deviceBoundSessions),
75
+ i18nString(UIStrings.deviceBoundSessionsCategoryDescription));
76
+ return false;
77
+ }
78
+
70
79
  override onbind(): void {
71
80
  super.onbind();
72
81
  this.#model.addEventListener(DeviceBoundSessionModelEvents.INITIALIZE_SESSIONS, this.#onNewSessions, this);
73
82
  this.#model.addEventListener(DeviceBoundSessionModelEvents.ADD_VISIBLE_SITE, this.#onVisibleSiteAdded, this);
74
83
  this.#model.addEventListener(DeviceBoundSessionModelEvents.CLEAR_VISIBLE_SITES, this.#onVisibleSitesCleared, this);
75
84
  this.#model.addEventListener(DeviceBoundSessionModelEvents.EVENT_OCCURRED, this.#onEventOccurred, this);
85
+ this.#model.addEventListener(DeviceBoundSessionModelEvents.CLEAR_EVENTS, this.#onClearEvents, this);
76
86
  }
77
87
 
78
88
  override onunbind(): void {
@@ -82,6 +92,7 @@ export class RootTreeElement extends ExpandableApplicationPanelTreeElement {
82
92
  this.#model.removeEventListener(
83
93
  DeviceBoundSessionModelEvents.CLEAR_VISIBLE_SITES, this.#onVisibleSitesCleared, this);
84
94
  this.#model.removeEventListener(DeviceBoundSessionModelEvents.EVENT_OCCURRED, this.#onEventOccurred, this);
95
+ this.#model.removeEventListener(DeviceBoundSessionModelEvents.CLEAR_EVENTS, this.#onClearEvents, this);
85
96
  }
86
97
 
87
98
  #updateSiteTreeElementVisibility(site: string): void {
@@ -112,12 +123,21 @@ export class RootTreeElement extends ExpandableApplicationPanelTreeElement {
112
123
  #addSiteSessionIfMissing(site: string, sessionId: string|undefined): void {
113
124
  let siteMapEntry = this.#sites.get(site);
114
125
  if (!siteMapEntry) {
115
- const siteElement = new ExpandableApplicationPanelTreeElement(
116
- this.resourcesPanel, site, i18nString(UIStrings.deviceBoundSessions),
117
- i18nString(UIStrings.deviceBoundSessionsCategoryDescription), 'device-bound-sessions-site');
126
+ const siteElement = new ApplicationPanelTreeElement(
127
+ this.resourcesPanel, site, /* expandable=*/ true, 'device-bound-sessions-site');
118
128
  siteElement.setLeadingIcons([createIcon('cloud')]);
119
129
  siteElement.itemURL = `device-bound-sessions://${site}` as Platform.DevToolsPath.UrlString;
120
- siteMapEntry = {siteTreeElement: siteElement, sessions: new Set()};
130
+
131
+ const defaultOnSelect = siteElement.onselect.bind(siteElement);
132
+ siteElement.onselect = (selectedByUser?: boolean): boolean => {
133
+ defaultOnSelect(selectedByUser);
134
+ this.resourcesPanel.showDeviceBoundSessionDefault(
135
+ this.#model, i18nString(UIStrings.deviceBoundSessions),
136
+ i18nString(UIStrings.deviceBoundSessionsCategoryDescription));
137
+ return false;
138
+ };
139
+
140
+ siteMapEntry = {siteTreeElement: siteElement, sessions: new Map()};
121
141
  this.#sites.set(site, siteMapEntry);
122
142
  }
123
143
 
@@ -139,12 +159,35 @@ export class RootTreeElement extends ExpandableApplicationPanelTreeElement {
139
159
  } else {
140
160
  siteMapEntry.siteTreeElement.appendChild(sessionElement);
141
161
  }
142
- siteMapEntry.sessions.add(sessionId);
162
+ siteMapEntry.sessions.set(sessionId, sessionElement);
143
163
  }
144
164
 
145
165
  this.#updateSiteTreeElementVisibility(site);
146
166
  }
147
167
 
168
+ #removeEmptyElements(emptySessions: Map<string, Array<string|undefined>>, emptySites: Set<string>): void {
169
+ for (const emptySite of emptySites) {
170
+ const siteData = this.#sites.get(emptySite);
171
+ if (siteData) {
172
+ this.removeChild(siteData.siteTreeElement);
173
+ this.#sites.delete(emptySite);
174
+ }
175
+ }
176
+
177
+ for (const [site, emptySessionIds] of emptySessions) {
178
+ const siteData = this.#sites.get(site);
179
+ if (siteData) {
180
+ for (const emptySessionId of emptySessionIds) {
181
+ const sessionElement = siteData.sessions.get(emptySessionId);
182
+ if (sessionElement) {
183
+ siteData.siteTreeElement.removeChild(sessionElement);
184
+ siteData.sessions.delete(emptySessionId);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+
148
191
  #onNewSessions({data: {sessions}}: Common.EventTarget.EventTargetEvent<
149
192
  DeviceBoundSessionModelEventTypes[DeviceBoundSessionModelEvents.INITIALIZE_SESSIONS]>): void {
150
193
  for (const session of sessions) {
@@ -167,4 +210,10 @@ export class RootTreeElement extends ExpandableApplicationPanelTreeElement {
167
210
  .EventTargetEvent<DeviceBoundSessionModelEventTypes[DeviceBoundSessionModelEvents.EVENT_OCCURRED]>): void {
168
211
  this.#addSiteSessionIfMissing(site, sessionId);
169
212
  }
213
+
214
+ #onClearEvents({data: {emptySessions, emptySites}}: Common.EventTarget
215
+ .EventTargetEvent<DeviceBoundSessionModelEventTypes[DeviceBoundSessionModelEvents.CLEAR_EVENTS]>):
216
+ void {
217
+ this.#removeEmptyElements(emptySessions, emptySites);
218
+ }
170
219
  }