chrome-devtools-frontend 1.0.1668390 → 1.0.1669021

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 (192) hide show
  1. package/.agents/skills/devtools-ci/SKILL.md +65 -0
  2. package/.agents/skills/gerrit-cli/SKILL.md +59 -0
  3. package/.agents/skills/gerrit-cli/references/commands.md +93 -0
  4. package/.agents/skills/gerrit-cli/references/workflows.md +56 -0
  5. package/.agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py +47 -0
  6. package/.agents/skills/gerrit-cli/scripts/import_upstream.py +230 -0
  7. package/docs/contributing/infrastructure.md +7 -1
  8. package/front_end/core/host/AidaClient.ts +66 -47
  9. package/front_end/core/host/GcaClient.ts +4 -6
  10. package/front_end/core/host/ResourceLoader.ts +4 -2
  11. package/front_end/core/root/Runtime.ts +0 -5
  12. package/front_end/core/sdk/ConsoleModel.ts +3 -2
  13. package/front_end/core/sdk/DebuggerModel.ts +14 -6
  14. package/front_end/core/sdk/SDKSettings.ts +19 -0
  15. package/front_end/core/sdk/sdk-meta.ts +0 -58
  16. package/front_end/generated/InspectorBackendCommands.ts +2 -2
  17. package/front_end/generated/protocol.ts +11 -3
  18. package/front_end/models/ai_assistance/AiUtils.ts +67 -4
  19. package/front_end/models/ai_assistance/StorageItem.ts +26 -5
  20. package/front_end/models/ai_code_completion/AiCodeCompletion.ts +2 -19
  21. package/front_end/models/ai_code_generation/AiCodeGeneration.ts +2 -3
  22. package/front_end/models/trace/handlers/RendererHandler.ts +20 -4
  23. package/front_end/models/trace/types/File.ts +1 -0
  24. package/front_end/models/workspace/UISourceCode.ts +0 -10
  25. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +61 -182
  26. package/front_end/panels/ai_assistance/components/ChatInput.ts +25 -8
  27. package/front_end/panels/ai_assistance/components/ChatMessage.ts +13 -69
  28. package/front_end/panels/ai_assistance/components/ChatView.ts +14 -8
  29. package/front_end/panels/ai_assistance/components/chatMessage.css +2 -20
  30. package/front_end/panels/application/ApplicationPanelSidebar.ts +2 -2
  31. package/front_end/panels/application/ApplicationPanelTreeElement.ts +41 -3
  32. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +116 -79
  33. package/front_end/panels/application/ServiceWorkersView.ts +8 -8
  34. package/front_end/panels/application/application.ts +2 -0
  35. package/front_end/panels/application/components/AdsView.ts +10 -6
  36. package/front_end/panels/application/preloading/PreloadingView.ts +53 -45
  37. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +111 -119
  38. package/front_end/panels/application/preloading/components/preloadingDetailsReportView.css +21 -23
  39. package/front_end/panels/application/serviceWorkerUpdateCycleView.css +105 -102
  40. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +107 -96
  41. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +17 -19
  42. package/front_end/panels/common/AiCodeCompletionTeaser.ts +6 -6
  43. package/front_end/panels/common/AiCodeGenerationTeaser.ts +28 -26
  44. package/front_end/panels/common/common.ts +1 -1
  45. package/front_end/panels/console/ConsoleInsightTeaser.ts +3 -6
  46. package/front_end/panels/console/ConsoleView.ts +6 -4
  47. package/front_end/panels/console/ConsoleViewMessage.ts +1 -1
  48. package/front_end/panels/console/console-meta.ts +28 -0
  49. package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +1 -1
  50. package/front_end/panels/elements/StylesSidebarPane.ts +3 -2
  51. package/front_end/panels/emulation/DeviceModeWrapper.ts +18 -4
  52. package/front_end/panels/explain/components/ConsoleInsight.ts +4 -6
  53. package/front_end/panels/explain/explain-meta.ts +7 -49
  54. package/front_end/panels/network/NetworkDataGridNode.ts +1 -1
  55. package/front_end/panels/network/NetworkLogView.ts +1 -0
  56. package/front_end/panels/network/OriginalResourceChunkView.ts +340 -0
  57. package/front_end/panels/network/ResourceChunkView.ts +72 -46
  58. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +3 -2
  59. package/front_end/panels/network/ResourceWebSocketFrameView.ts +3 -3
  60. package/front_end/panels/network/originalResourceChunkView.css +49 -0
  61. package/front_end/panels/screencast/ScreencastView.ts +401 -260
  62. package/front_end/panels/screencast/screencastView.css +113 -100
  63. package/front_end/panels/sensors/LocationsSettingsTab.ts +106 -122
  64. package/front_end/panels/sensors/locationsSettingsTab.css +4 -4
  65. package/front_end/panels/settings/AISettingsTab.ts +17 -100
  66. package/front_end/panels/snippets/ScriptSnippetFileSystem.ts +2 -2
  67. package/front_end/panels/snippets/SnippetsQuickOpen.ts +4 -4
  68. package/front_end/panels/sources/AddSourceMapURLDialog.ts +3 -3
  69. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +4 -3
  70. package/front_end/panels/sources/BreakpointEditDialog.ts +14 -14
  71. package/front_end/panels/sources/BreakpointsView.ts +14 -14
  72. package/front_end/panels/sources/CallStackSidebarPane.ts +6 -6
  73. package/front_end/panels/sources/CategorizedBreakpointL10n.ts +18 -18
  74. package/front_end/panels/sources/CoveragePlugin.ts +7 -7
  75. package/front_end/panels/sources/DebuggerPausedMessage.ts +23 -23
  76. package/front_end/panels/sources/DebuggerPlugin.ts +29 -29
  77. package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +2 -2
  78. package/front_end/panels/sources/GoToLineQuickOpen.ts +10 -10
  79. package/front_end/panels/sources/NavigatorView.ts +34 -27
  80. package/front_end/panels/sources/OutlineQuickOpen.ts +3 -3
  81. package/front_end/panels/sources/PersistenceActions.ts +9 -9
  82. package/front_end/panels/sources/ProfilePlugin.ts +1 -1
  83. package/front_end/panels/sources/ScopeChainSidebarPane.ts +5 -5
  84. package/front_end/panels/sources/SnippetsPlugin.ts +2 -2
  85. package/front_end/panels/sources/SourcesNavigator.ts +20 -18
  86. package/front_end/panels/sources/SourcesPanel.ts +26 -25
  87. package/front_end/panels/sources/SourcesView.ts +5 -6
  88. package/front_end/panels/sources/TabbedEditorContainer.ts +3 -3
  89. package/front_end/panels/sources/ThreadsSidebarPane.ts +1 -1
  90. package/front_end/panels/sources/UISourceCodeFrame.ts +0 -2
  91. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +7 -7
  92. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  93. package/front_end/panels/sources/sources-meta.ts +109 -71
  94. package/front_end/panels/sources/sources.ts +0 -2
  95. package/front_end/panels/timeline/TimelineHistoryManager.ts +14 -3
  96. package/front_end/panels/timeline/TimelineLoader.ts +72 -42
  97. package/front_end/panels/timeline/TimelinePanel.ts +29 -4
  98. package/front_end/panels/timeline/timelineHistoryManager.css +4 -0
  99. package/front_end/third_party/chromium/README.chromium +1 -1
  100. package/front_end/third_party/puppeteer/README.chromium +2 -2
  101. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +187 -1
  102. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +91 -38
  103. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +145 -2
  104. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js +0 -2
  106. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts +0 -2
  108. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +0 -2
  110. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts +3 -2
  112. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js +8 -2
  114. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts +0 -2
  116. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js +0 -2
  118. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +1 -3
  120. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +0 -2
  122. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts +0 -1
  124. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js +0 -1
  126. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.d.ts.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js +2 -2
  129. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts +5 -1
  131. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js +12 -0
  133. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js.map +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +4 -1
  136. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +5 -1
  138. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +49 -0
  140. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts +0 -6
  142. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js +0 -6
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.d.ts.map +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js +3 -0
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js.map +1 -1
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts +0 -3
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js +0 -3
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.d.ts +2 -2
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.js +2 -2
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/types.d.ts +187 -1
  163. package/front_end/third_party/puppeteer/package/package.json +5 -5
  164. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +155 -2
  165. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +0 -2
  166. package/front_end/third_party/puppeteer/package/src/api/Dialog.ts +10 -2
  167. package/front_end/third_party/puppeteer/package/src/api/JSHandle.ts +0 -2
  168. package/front_end/third_party/puppeteer/package/src/api/Page.ts +1 -3
  169. package/front_end/third_party/puppeteer/package/src/api/Realm.ts +0 -1
  170. package/front_end/third_party/puppeteer/package/src/bidi/BidiOverCdp.ts +4 -2
  171. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +17 -0
  172. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +5 -4
  173. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +66 -0
  174. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +0 -6
  175. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  176. package/front_end/third_party/puppeteer/package/src/injected/util.ts +4 -1
  177. package/front_end/third_party/puppeteer/package/src/node/ScreenRecorder.ts +0 -3
  178. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  179. package/front_end/third_party/puppeteer/package/src/util/disposable.ts +2 -2
  180. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  181. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +9 -7
  182. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +7 -8
  183. package/front_end/ui/legacy/Dialog.ts +12 -2
  184. package/front_end/ui/legacy/TabbedPane.ts +7 -2
  185. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +40 -24
  186. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -0
  187. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -4
  188. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +14 -7
  189. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -1
  190. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  191. package/package.json +1 -1
  192. package/front_end/panels/sources/AiWarningInfobarPlugin.ts +0 -78
@@ -24,6 +24,11 @@ import {
24
24
  type AddScreenParams,
25
25
  type WindowBounds,
26
26
  type WindowId,
27
+ type InstallPWAOptions,
28
+ type UninstallPWAOptions,
29
+ type LaunchPWAOptions,
30
+ type GetPWAStateOptions,
31
+ type PWAState,
27
32
  } from '../api/Browser.js';
28
33
  import {BrowserContextEvent} from '../api/BrowserContext.js';
29
34
  import {CDPSessionEvent} from '../api/CDPSession.js';
@@ -523,6 +528,67 @@ export class CdpBrowser extends BrowserBase {
523
528
  this.#extensions.delete(id);
524
529
  }
525
530
 
531
+ override async installPWA(options: InstallPWAOptions): Promise<string> {
532
+ await this.#connection.send('PWA.install', {
533
+ manifestId: options.manifestId,
534
+ installUrlOrBundleUrl: options.installUrlOrBundleUrl,
535
+ });
536
+ if (options.displayMode) {
537
+ await this.#connection.send('PWA.changeAppUserSettings', {
538
+ manifestId: options.manifestId,
539
+ displayMode: options.displayMode,
540
+ });
541
+ }
542
+ return options.manifestId;
543
+ }
544
+
545
+ override async uninstallPWA(options: UninstallPWAOptions): Promise<void> {
546
+ await this.#connection.send('PWA.uninstall', {
547
+ manifestId: options.manifestId,
548
+ });
549
+ }
550
+
551
+ override async launchPWA(options: LaunchPWAOptions): Promise<Page> {
552
+ // `PWA.launch` resolves with the id of the launched *tab* target (see the
553
+ // CDP `PWA.LaunchResponse` docs). Tab targets sit above page targets in the
554
+ // target hierarchy and are not exposed through `browser.targets()`, so the
555
+ // returned id can't be awaited directly.
556
+ const {targetId: tabTargetId} = await this.#connection.send('PWA.launch', {
557
+ manifestId: options.manifestId,
558
+ url: options.url,
559
+ });
560
+ const target = (await this.waitForTarget(
561
+ candidate => {
562
+ const tab = this.#targetManager.getAvailableTargets().get(tabTargetId);
563
+ if (tab?.type() !== 'tab') {
564
+ return false;
565
+ }
566
+ for (const child of tab._childTargets()) {
567
+ if (child === candidate) {
568
+ return true;
569
+ }
570
+ }
571
+ return false;
572
+ },
573
+ {timeout: options.timeout},
574
+ )) as CdpTarget;
575
+ const page = await target.page();
576
+ if (!page) {
577
+ throw new Error(
578
+ `Failed to create a page for the launched PWA (manifestId = ${options.manifestId})`,
579
+ );
580
+ }
581
+ return page;
582
+ }
583
+
584
+ override async getPWAState(options: GetPWAStateOptions): Promise<PWAState> {
585
+ const {badgeCount, fileHandlers} = await this.#connection.send(
586
+ 'PWA.getOsAppState',
587
+ {manifestId: options.manifestId},
588
+ );
589
+ return {badgeCount, fileHandlers};
590
+ }
591
+
526
592
  override async screens(): Promise<ScreenInfo[]> {
527
593
  const {screenInfos} = await this.#connection.send(
528
594
  'Emulation.getScreenInfos',
@@ -181,16 +181,10 @@ export class EventEmitter<
181
181
  return this;
182
182
  }
183
183
 
184
- /**
185
- * @internal
186
- */
187
184
  [disposeSymbol](): void {
188
185
  return void this[asyncDisposeSymbol]().catch(debugCatchError);
189
186
  }
190
187
 
191
- /**
192
- * @internal
193
- */
194
188
  async [asyncDisposeSymbol](): Promise<void> {
195
189
  for (const [type, handlers] of this.#handlers) {
196
190
  for (const handler of handlers) {
@@ -5,4 +5,4 @@
5
5
  *
6
6
  * @internal
7
7
  */
8
- export const source = "\"use strict\";var N=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)N(t,r,{get:e[r],enumerable:!0})},J=(t,e,r,o)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let n of Y(e))!G.call(t,n)&&n!==r&&N(t,n,{get:()=>e[n],enumerable:!(o=B(e,n))||o.enumerable});return t};var z=t=>J(N({},\"__esModule\",{value:!0}),t);var ye={};l(ye,{default:()=>pe});module.exports=z(ye);var b=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}},p=class extends b{};var c=class t{static create(e){return new t(e)}static async race(e){let r=new Set;try{let o=e.map(n=>n instanceof t?(n.#n&&r.add(n),n.valueOrThrow()):n);return await Promise.race(o)}finally{for(let o of r)o.reject(new Error(\"Timeout cleared\"))}}#e=!1;#r=!1;#o;#t;#a=new Promise(e=>{this.#t=e});#n;#i;constructor(e){e&&e.timeout>0&&(this.#i=new p(e.message),this.#n=setTimeout(()=>{this.reject(this.#i)},e.timeout))}#l(e){clearTimeout(this.#n),this.#o=e,this.#t()}resolve(e){this.#r||this.#e||(this.#e=!0,this.#l(e))}reject(e){this.#r||this.#e||(this.#r=!0,this.#l(e))}resolved(){return this.#e}finished(){return this.#e||this.#r}value(){return this.#o}#s;valueOrThrow(){return this.#s||(this.#s=(async()=>{if(await this.#a,this.#r)throw this.#o;return this.#o})()),this.#s}};var W=new Map,j=t=>{let e=W.get(t);return e||(e=new Function(`return ${t}`)(),W.set(t,e),e)};var v={};l(v,{ariaQuerySelector:()=>K,ariaQuerySelectorAll:()=>x});var K=(t,e)=>globalThis.__ariaQuerySelector(t,e),x=async function*(t,e){yield*await globalThis.__ariaQuerySelectorAll(t,e)};var E={};l(E,{cssQuerySelector:()=>Z,cssQuerySelectorAll:()=>ee});var Z=(t,e)=>t.querySelector(e),ee=function(t,e){return t.querySelectorAll(e)};var A={};l(A,{CustomQuerySelectorRegistry:()=>y,customQuerySelectors:()=>P});var y=class{#e=new Map;register(e,r){if(!r.queryOne&&r.queryAll){let o=r.queryAll;r.queryOne=(n,i)=>{for(let s of o(n,i))return s;return null}}else if(r.queryOne&&!r.queryAll){let o=r.queryOne;r.queryAll=(n,i)=>{let s=o(n,i);return s?[s]:[]}}else if(!r.queryOne||!r.queryAll)throw new Error(\"At least one query method must be defined.\");this.#e.set(e,{querySelector:r.queryOne,querySelectorAll:r.queryAll})}unregister(e){this.#e.delete(e)}get(e){return this.#e.get(e)}clear(){this.#e.clear()}},P=new y;var R={};l(R,{pierceQuerySelector:()=>te,pierceQuerySelectorAll:()=>re});var te=(t,e)=>{let r=null,o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&!r&&s.matches(e)&&(r=s)}while(!r&&i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r},re=(t,e)=>{let r=[],o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&s.matches(e)&&r.push(s)}while(i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r};var u=(t,e)=>{if(!t)throw new Error(e)};var w=class{#e;#r;#o;#t;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#t=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=new MutationObserver(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())}),this.#o.observe(this.#r,{childList:!0,subtree:!0,attributes:!0})}async stop(){u(this.#t,\"Polling never started.\"),this.#t.finished()||this.#t.reject(new Error(\"Polling stopped\")),this.#o&&(this.#o.disconnect(),this.#o=void 0)}result(){return u(this.#t,\"Polling never started.\"),this.#t.valueOrThrow()}},T=class{#e;#r;constructor(e){this.#e=e}async start(){let e=this.#r=c.create(),r=await this.#e();if(r){e.resolve(r);return}let o=async()=>{if(e.finished())return;let n=await this.#e();if(!n){window.requestAnimationFrame(o);return}e.resolve(n),await this.stop()};window.requestAnimationFrame(o)}async stop(){u(this.#r,\"Polling never started.\"),this.#r.finished()||this.#r.reject(new Error(\"Polling stopped\"))}result(){return u(this.#r,\"Polling never started.\"),this.#r.valueOrThrow()}},S=class{#e;#r;#o;#t;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#t=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=setInterval(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())},this.#r)}async stop(){u(this.#t,\"Polling never started.\"),this.#t.finished()||this.#t.reject(new Error(\"Polling stopped\")),this.#o&&(clearInterval(this.#o),this.#o=void 0)}result(){return u(this.#t,\"Polling never started.\"),this.#t.valueOrThrow()}};var L={};l(L,{PCombinator:()=>U,pQuerySelector:()=>me,pQuerySelectorAll:()=>X});var a=class{static async*map(e,r){for await(let o of e)yield await r(o)}static async*flatMap(e,r){for await(let o of e)yield*r(o)}static async collect(e){let r=[];for await(let o of e)r.push(o);return r}static async first(e){for await(let r of e)return r}};var O={};l(O,{textQuerySelectorAll:()=>m});var oe=new Set([\"checkbox\",\"image\",\"radio\"]),ne=t=>t instanceof HTMLSelectElement||t instanceof HTMLTextAreaElement||t instanceof HTMLInputElement&&!oe.has(t.type),se=new Set([\"SCRIPT\",\"STYLE\"]),f=t=>!se.has(t.nodeName)&&!document.head?.contains(t),C=new WeakMap,V=t=>{for(;t;)C.delete(t),t instanceof ShadowRoot?t=t.host:t=t.parentNode},F=new WeakSet,I,ie=()=>{let t=globalThis.MutationObserver;if(!t)throw new Error(\"MutationObserver is not available in this environment.\");return I||(I=new t(e=>{for(let r of e)V(r.target)})),I},d=t=>{let e=C.get(t);if(e||(e={full:\"\",immediate:[]},!f(t)))return e;let r=\"\";if(ne(t))e.full=t.value,e.immediate.push(t.value),t.addEventListener(\"input\",o=>{V(o.target)},{once:!0,capture:!0});else{for(let o=t.firstChild;o;o=o.nextSibling){if(o.nodeType===Node.TEXT_NODE){e.full+=o.nodeValue??\"\",r+=o.nodeValue??\"\";continue}r&&e.immediate.push(r),r=\"\",o.nodeType===Node.ELEMENT_NODE&&(e.full+=d(o).full)}r&&e.immediate.push(r),t instanceof Element&&t.shadowRoot&&(e.full+=d(t.shadowRoot).full),F.has(t)||(ie().observe(t,{childList:!0,characterData:!0,subtree:!0}),F.add(t))}return C.set(t,e),e};var m=function*(t,e){let r=!1;for(let o of t.childNodes)if(o instanceof Element&&f(o)){let n;o.shadowRoot?n=m(o.shadowRoot,e):n=m(o,e);for(let i of n)yield i,r=!0}r||t instanceof Element&&f(t)&&d(t).full.includes(e)&&(yield t)};var M={};l(M,{checkVisibility:()=>ae,pierce:()=>g,pierceAll:()=>k});var le=[\"hidden\",\"collapse\"],ae=(t,e)=>{if(!t)return e===!1;if(e===void 0)return t;let r=t.nodeType===Node.TEXT_NODE?t.parentElement:t,o=window.getComputedStyle(r),n=o&&!le.includes(o.visibility)&&!ce(r);return e===n?t:!1};function ce(t){let e=t.getBoundingClientRect();return e.width===0||e.height===0}var ue=t=>\"shadowRoot\"in t&&t.shadowRoot instanceof ShadowRoot;function*g(t){ue(t)?yield t.shadowRoot:yield t}function*k(t){t=g(t).next().value,yield t;let e=[document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT)];for(let r of e){let o;for(;o=r.nextNode();)o.shadowRoot&&(yield o.shadowRoot,e.push(document.createTreeWalker(o.shadowRoot,NodeFilter.SHOW_ELEMENT)))}}var D={};l(D,{xpathQuerySelectorAll:()=>q});var q=function*(t,e,r=-1){let n=(t.ownerDocument||document).evaluate(e,t,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE),i=[],s;for(;(s=n.iterateNext())&&(i.push(s),!(r&&i.length===r)););for(let h=0;h<i.length;h++)s=i[h],yield s,i[h]=null};var de=/[-\\w\\P{ASCII}*]/u,U=(r=>(r.Descendent=\">>>\",r.Child=\">>>>\",r))(U||{}),H=t=>\"querySelectorAll\"in t,Q=class{#e;#r=[];#o=void 0;elements;constructor(e,r){this.elements=[e],this.#e=r,this.#t()}async run(){for(typeof this.#o==\"string\"&&this.#o.trimStart()===\":scope\"&&this.#t();this.#o!==void 0;this.#t()){let e=this.#o;typeof e==\"string\"?e[0]&&de.test(e[0])?this.elements=a.flatMap(this.elements,async function*(r){H(r)&&(yield*r.querySelectorAll(e))}):this.elements=a.flatMap(this.elements,async function*(r){if(!r.parentElement){if(!H(r))return;yield*r.querySelectorAll(e);return}let o=0;for(let n of r.parentElement.children)if(++o,n===r)break;yield*r.parentElement.querySelectorAll(`:scope>:nth-child(${o})${e}`)}):this.elements=a.flatMap(this.elements,async function*(r){switch(e.name){case\"text\":yield*m(r,e.value);break;case\"xpath\":yield*q(r,e.value);break;case\"aria\":yield*x(r,e.value);break;default:let o=P.get(e.name);if(!o)throw new Error(`Unknown selector type: ${e.name}`);yield*o.querySelectorAll(r,e.value)}})}}#t(){if(this.#r.length!==0){this.#o=this.#r.shift();return}if(this.#e.length===0){this.#o=void 0;return}let e=this.#e.shift();switch(e){case\">>>>\":{this.elements=a.flatMap(this.elements,g),this.#t();break}case\">>>\":{this.elements=a.flatMap(this.elements,k),this.#t();break}default:this.#r=e,this.#t();break}}},_=class{#e=new WeakMap;calculate(e,r=[]){if(e===null)return r;e instanceof ShadowRoot&&(e=e.host);let o=this.#e.get(e);if(o)return[...o,...r];let n=0;for(let s=e.previousSibling;s;s=s.previousSibling)++n;let i=this.calculate(e.parentNode,[n]);return this.#e.set(e,i),[...i,...r]}},$=(t,e)=>{if(t.length+e.length===0)return 0;let[r=-1,...o]=t,[n=-1,...i]=e;return r===n?$(o,i):r<n?-1:1},fe=async function*(t){let e=new Set;for await(let o of t)e.add(o);let r=new _;yield*[...e.values()].map(o=>[o,r.calculate(o)]).sort(([,o],[,n])=>$(o,n)).map(([o])=>o)},X=function(t,e){let r=JSON.parse(e);if(r.some(o=>{let n=0;return o.some(i=>(typeof i==\"string\"?++n:n=0,n>1))}))throw new Error(\"Multiple deep combinators found in sequence.\");return fe(a.flatMap(r,o=>{let n=new Q(t,o);return n.run(),n.elements}))},me=async function(t,e){for await(let r of X(t,e))return r;return null};var he=Object.freeze({...v,...A,...R,...L,...O,...M,...D,...E,Deferred:c,createFunction:j,createTextContent:d,IntervalPoller:S,isSuitableNodeForTextMatching:f,MutationPoller:w,RAFPoller:T}),pe=he;\n";
8
+ export const source = "\"use strict\";var N=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)N(t,r,{get:e[r],enumerable:!0})},J=(t,e,r,o)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let n of Y(e))!G.call(t,n)&&n!==r&&N(t,n,{get:()=>e[n],enumerable:!(o=B(e,n))||o.enumerable});return t};var z=t=>J(N({},\"__esModule\",{value:!0}),t);var ye={};l(ye,{default:()=>pe});module.exports=z(ye);var b=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}},p=class extends b{};var c=class t{static create(e){return new t(e)}static async race(e){let r=new Set;try{let o=e.map(n=>n instanceof t?(n.#n&&r.add(n),n.valueOrThrow()):n);return await Promise.race(o)}finally{for(let o of r)o.reject(new Error(\"Timeout cleared\"))}}#e=!1;#r=!1;#o;#t;#a=new Promise(e=>{this.#t=e});#n;#i;constructor(e){e&&e.timeout>0&&(this.#i=new p(e.message),this.#n=setTimeout(()=>{this.reject(this.#i)},e.timeout))}#l(e){clearTimeout(this.#n),this.#o=e,this.#t()}resolve(e){this.#r||this.#e||(this.#e=!0,this.#l(e))}reject(e){this.#r||this.#e||(this.#r=!0,this.#l(e))}resolved(){return this.#e}finished(){return this.#e||this.#r}value(){return this.#o}#s;valueOrThrow(){return this.#s||(this.#s=(async()=>{if(await this.#a,this.#r)throw this.#o;return this.#o})()),this.#s}};var W=new Map,j=t=>{let e=W.get(t);return e||(e=new Function(`return ${t}`)(),W.set(t,e),e)};var v={};l(v,{ariaQuerySelector:()=>K,ariaQuerySelectorAll:()=>x});var K=(t,e)=>globalThis.__ariaQuerySelector(t,e),x=async function*(t,e){yield*await globalThis.__ariaQuerySelectorAll(t,e)};var E={};l(E,{cssQuerySelector:()=>Z,cssQuerySelectorAll:()=>ee});var Z=(t,e)=>t.querySelector(e),ee=function(t,e){return t.querySelectorAll(e)};var A={};l(A,{CustomQuerySelectorRegistry:()=>y,customQuerySelectors:()=>P});var y=class{#e=new Map;register(e,r){if(!r.queryOne&&r.queryAll){let o=r.queryAll;r.queryOne=(n,i)=>{for(let s of o(n,i))return s;return null}}else if(r.queryOne&&!r.queryAll){let o=r.queryOne;r.queryAll=(n,i)=>{let s=o(n,i);return s?[s]:[]}}else if(!r.queryOne||!r.queryAll)throw new Error(\"At least one query method must be defined.\");this.#e.set(e,{querySelector:r.queryOne,querySelectorAll:r.queryAll})}unregister(e){this.#e.delete(e)}get(e){return this.#e.get(e)}clear(){this.#e.clear()}},P=new y;var R={};l(R,{pierceQuerySelector:()=>te,pierceQuerySelectorAll:()=>re});var te=(t,e)=>{let r=null,o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&!r&&s.matches(e)&&(r=s)}while(!r&&i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r},re=(t,e)=>{let r=[],o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&s.matches(e)&&r.push(s)}while(i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r};var u=(t,e)=>{if(!t)throw new Error(e)};var w=class{#e;#r;#o;#t;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#t=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=new MutationObserver(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())}),this.#o.observe(this.#r,{childList:!0,subtree:!0,attributes:!0})}async stop(){u(this.#t,\"Polling never started.\"),this.#t.finished()||this.#t.reject(new Error(\"Polling stopped\")),this.#o&&(this.#o.disconnect(),this.#o=void 0)}result(){return u(this.#t,\"Polling never started.\"),this.#t.valueOrThrow()}},T=class{#e;#r;constructor(e){this.#e=e}async start(){let e=this.#r=c.create(),r=await this.#e();if(r){e.resolve(r);return}let o=async()=>{if(e.finished())return;let n=await this.#e();if(!n){window.requestAnimationFrame(o);return}e.resolve(n),await this.stop()};window.requestAnimationFrame(o)}async stop(){u(this.#r,\"Polling never started.\"),this.#r.finished()||this.#r.reject(new Error(\"Polling stopped\"))}result(){return u(this.#r,\"Polling never started.\"),this.#r.valueOrThrow()}},S=class{#e;#r;#o;#t;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#t=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=setInterval(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())},this.#r)}async stop(){u(this.#t,\"Polling never started.\"),this.#t.finished()||this.#t.reject(new Error(\"Polling stopped\")),this.#o&&(clearInterval(this.#o),this.#o=void 0)}result(){return u(this.#t,\"Polling never started.\"),this.#t.valueOrThrow()}};var L={};l(L,{PCombinator:()=>U,pQuerySelector:()=>me,pQuerySelectorAll:()=>X});var a=class{static async*map(e,r){for await(let o of e)yield await r(o)}static async*flatMap(e,r){for await(let o of e)yield*r(o)}static async collect(e){let r=[];for await(let o of e)r.push(o);return r}static async first(e){for await(let r of e)return r}};var O={};l(O,{textQuerySelectorAll:()=>m});var oe=new Set([\"checkbox\",\"image\",\"radio\"]),ne=t=>t instanceof HTMLSelectElement||t instanceof HTMLTextAreaElement||t instanceof HTMLInputElement&&!oe.has(t.type),se=new Set([\"SCRIPT\",\"STYLE\"]),f=t=>!se.has(t.nodeName)&&!document.head?.contains(t),C=new WeakMap,V=t=>{for(;t;)C.delete(t),t instanceof ShadowRoot?t=t.host:t=t.parentNode},F=new WeakSet,I,ie=()=>{let t=globalThis.MutationObserver;if(!t)throw new Error(\"MutationObserver is not available in this environment.\");return I||(I=new t(e=>{for(let r of e)V(r.target)})),I},d=t=>{let e=C.get(t);if(e||(e={full:\"\",immediate:[]},!f(t)))return e;let r=\"\";if(ne(t))e.full=t.value,e.immediate.push(t.value),t.addEventListener(\"input\",o=>{V(o.target)},{once:!0,capture:!0});else{for(let o=t.firstChild;o;o=o.nextSibling){if(o.nodeType===Node.TEXT_NODE){e.full+=o.nodeValue??\"\",r+=o.nodeValue??\"\";continue}r&&e.immediate.push(r),r=\"\",o.nodeType===Node.ELEMENT_NODE&&(e.full+=d(o).full)}r&&e.immediate.push(r),t instanceof Element&&t.shadowRoot&&(e.full+=d(t.shadowRoot).full),F.has(t)||(ie().observe(t,{childList:!0,characterData:!0,subtree:!0}),F.add(t))}return C.set(t,e),e};var m=function*(t,e){let r=!1;for(let o of t.childNodes)if(o instanceof Element&&f(o)){let n;o.shadowRoot?n=m(o.shadowRoot,e):n=m(o,e);for(let i of n)yield i,r=!0}r||t instanceof Element&&f(t)&&d(t).full.includes(e)&&(yield t)};var M={};l(M,{checkVisibility:()=>ae,pierce:()=>g,pierceAll:()=>k});var le=[\"hidden\",\"collapse\"],ae=(t,e)=>{if(!t)return e===!1;if(e===void 0)return t;let r=t.nodeType===Node.TEXT_NODE?t.parentElement:t;if(!r)return e===!1;let o=window.getComputedStyle(r),n=o&&!le.includes(o.visibility)&&!ce(r);return e===n?t:!1};function ce(t){let e=t.getBoundingClientRect();return e.width===0||e.height===0}var ue=t=>\"shadowRoot\"in t&&t.shadowRoot instanceof ShadowRoot;function*g(t){ue(t)?yield t.shadowRoot:yield t}function*k(t){t=g(t).next().value,yield t;let e=[document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT)];for(let r of e){let o;for(;o=r.nextNode();)o.shadowRoot&&(yield o.shadowRoot,e.push(document.createTreeWalker(o.shadowRoot,NodeFilter.SHOW_ELEMENT)))}}var D={};l(D,{xpathQuerySelectorAll:()=>q});var q=function*(t,e,r=-1){let n=(t.ownerDocument||document).evaluate(e,t,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE),i=[],s;for(;(s=n.iterateNext())&&(i.push(s),!(r&&i.length===r)););for(let h=0;h<i.length;h++)s=i[h],yield s,i[h]=null};var de=/[-\\w\\P{ASCII}*]/u,U=(r=>(r.Descendent=\">>>\",r.Child=\">>>>\",r))(U||{}),H=t=>\"querySelectorAll\"in t,Q=class{#e;#r=[];#o=void 0;elements;constructor(e,r){this.elements=[e],this.#e=r,this.#t()}async run(){for(typeof this.#o==\"string\"&&this.#o.trimStart()===\":scope\"&&this.#t();this.#o!==void 0;this.#t()){let e=this.#o;typeof e==\"string\"?e[0]&&de.test(e[0])?this.elements=a.flatMap(this.elements,async function*(r){H(r)&&(yield*r.querySelectorAll(e))}):this.elements=a.flatMap(this.elements,async function*(r){if(!r.parentElement){if(!H(r))return;yield*r.querySelectorAll(e);return}let o=0;for(let n of r.parentElement.children)if(++o,n===r)break;yield*r.parentElement.querySelectorAll(`:scope>:nth-child(${o})${e}`)}):this.elements=a.flatMap(this.elements,async function*(r){switch(e.name){case\"text\":yield*m(r,e.value);break;case\"xpath\":yield*q(r,e.value);break;case\"aria\":yield*x(r,e.value);break;default:let o=P.get(e.name);if(!o)throw new Error(`Unknown selector type: ${e.name}`);yield*o.querySelectorAll(r,e.value)}})}}#t(){if(this.#r.length!==0){this.#o=this.#r.shift();return}if(this.#e.length===0){this.#o=void 0;return}let e=this.#e.shift();switch(e){case\">>>>\":{this.elements=a.flatMap(this.elements,g),this.#t();break}case\">>>\":{this.elements=a.flatMap(this.elements,k),this.#t();break}default:this.#r=e,this.#t();break}}},_=class{#e=new WeakMap;calculate(e,r=[]){if(e===null)return r;e instanceof ShadowRoot&&(e=e.host);let o=this.#e.get(e);if(o)return[...o,...r];let n=0;for(let s=e.previousSibling;s;s=s.previousSibling)++n;let i=this.calculate(e.parentNode,[n]);return this.#e.set(e,i),[...i,...r]}},$=(t,e)=>{if(t.length+e.length===0)return 0;let[r=-1,...o]=t,[n=-1,...i]=e;return r===n?$(o,i):r<n?-1:1},fe=async function*(t){let e=new Set;for await(let o of t)e.add(o);let r=new _;yield*[...e.values()].map(o=>[o,r.calculate(o)]).sort(([,o],[,n])=>$(o,n)).map(([o])=>o)},X=function(t,e){let r=JSON.parse(e);if(r.some(o=>{let n=0;return o.some(i=>(typeof i==\"string\"?++n:n=0,n>1))}))throw new Error(\"Multiple deep combinators found in sequence.\");return fe(a.flatMap(r,o=>{let n=new Q(t,o);return n.run(),n.elements}))},me=async function(t,e){for await(let r of X(t,e))return r;return null};var he=Object.freeze({...v,...A,...R,...L,...O,...M,...D,...E,Deferred:c,createFunction:j,createTextContent:d,IntervalPoller:S,isSuitableNodeForTextMatching:f,MutationPoller:w,RAFPoller:T}),pe=he;\n";
@@ -20,7 +20,10 @@ export const checkVisibility = (
20
20
  }
21
21
  const element = (
22
22
  node.nodeType === Node.TEXT_NODE ? node.parentElement : node
23
- ) as Element;
23
+ ) as Element | null;
24
+ if (!element) {
25
+ return visible === false;
26
+ }
24
27
 
25
28
  const style = window.getComputedStyle(element);
26
29
  const isVisible =
@@ -375,9 +375,6 @@ export class ScreenRecorder extends PassThrough {
375
375
  });
376
376
  }
377
377
 
378
- /**
379
- * @internal
380
- */
381
378
  override async [asyncDisposeSymbol](): Promise<void> {
382
379
  await this.stop();
383
380
  await super[asyncDisposeSymbol]();
@@ -8,7 +8,7 @@
8
8
  * @internal
9
9
  */
10
10
  export const PUPPETEER_REVISIONS = Object.freeze({
11
- chrome: '150.0.7871.24',
12
- 'chrome-headless-shell': '150.0.7871.24',
13
- firefox: 'stable_152.0.4',
11
+ chrome: '151.0.7922.47',
12
+ 'chrome-headless-shell': '151.0.7922.47',
13
+ firefox: 'stable_152.0.5',
14
14
  });
@@ -32,12 +32,12 @@ declare global {
32
32
  (Symbol as any).asyncDispose ??= Symbol('asyncDispose');
33
33
 
34
34
  /**
35
- * @internal
35
+ * @public
36
36
  */
37
37
  export const disposeSymbol: typeof Symbol.dispose = Symbol.dispose;
38
38
 
39
39
  /**
40
- * @internal
40
+ * @public
41
41
  */
42
42
  export const asyncDisposeSymbol: typeof Symbol.asyncDispose =
43
43
  Symbol.asyncDispose;
@@ -6,5 +6,5 @@
6
6
 
7
7
  // If moved update release-please config
8
8
  // x-release-please-start-version
9
- export const packageVersion = '25.3.0';
9
+ export const packageVersion = '25.4.0';
10
10
  // x-release-please-end
@@ -56,7 +56,8 @@ export interface AiCodeCompletionConfig {
56
56
  onSuggestionAccepted: (citations: Host.AidaClient.Citation[]) => void;
57
57
  onRequestTriggered: () => void;
58
58
  onResponseReceived: () => void;
59
- panel: AiCodeCompletion.AiCodeCompletion.ContextFlavor;
59
+ disclaimerTooltipId: string;
60
+ disclaimerTextVariant: PanelCommon.DisclaimerTextVariant;
60
61
  }
61
62
 
62
63
  export const DELAY_BEFORE_SHOWING_RESPONSE_MS = 500;
@@ -103,7 +104,8 @@ export class AiCodeCompletionProvider {
103
104
  onSuggestionAccepted: this.#aiCodeCompletionConfig.onSuggestionAccepted.bind(this),
104
105
  onRequestTriggered: this.#aiCodeCompletionConfig.onRequestTriggered.bind(this),
105
106
  onResponseReceived: this.#aiCodeCompletionConfig.onResponseReceived.bind(this),
106
- panel: this.#aiCodeCompletionConfig.panel,
107
+ disclaimerTooltipId: this.#aiCodeCompletionConfig.disclaimerTooltipId,
108
+ disclaimerTextVariant: this.#aiCodeCompletionConfig.disclaimerTextVariant,
107
109
  };
108
110
  this.#aiCodeGenerationProvider = AiCodeGenerationProvider.createInstance(this.#aiCodeGenerationConfig);
109
111
  }
@@ -143,7 +145,7 @@ export class AiCodeCompletionProvider {
143
145
  if (!this.#aiCodeCompletionSetting.get() && !this.#aiCodeCompletionTeaserDismissedSetting.get()) {
144
146
  this.#teaser = new PanelCommon.AiCodeCompletionTeaser({
145
147
  onDetach: () => this.#detachTeaser.bind(this),
146
- panel: this.#aiCodeCompletionConfig?.panel,
148
+ disclaimerTextVariant: this.#aiCodeCompletionConfig?.disclaimerTextVariant,
147
149
  });
148
150
  this.#editor.editor.dispatch(
149
151
  {effects: this.#teaserCompartment.reconfigure([aiCodeCompletionTeaserExtension(this.#teaser)])});
@@ -175,7 +177,7 @@ export class AiCodeCompletionProvider {
175
177
  aidaClient: this.#aidaClient,
176
178
  serverSideLoggingEnabled: !Root.Runtime.hostConfig.aidaAvailability?.disallowLogging,
177
179
  },
178
- this.#aiCodeCompletionConfig.panel, undefined, this.#aiCodeCompletionConfig.completionContext.stopSequences);
180
+ undefined, this.#aiCodeCompletionConfig.completionContext.stopSequences);
179
181
  this.#aiCodeCompletionConfig.onFeatureEnabled();
180
182
  }
181
183
 
@@ -332,10 +334,10 @@ export class AiCodeCompletionProvider {
332
334
  const startTime = performance.now();
333
335
  this.#aiCodeCompletionConfig?.onRequestTriggered();
334
336
  // Registering AiCodeCompletionRequestTriggered metric even if the request is served from cache
335
- const panel = this.#aiCodeCompletionConfig?.panel;
336
- if (panel === AiCodeCompletion.AiCodeCompletion.ContextFlavor.CONSOLE) {
337
+ const disclaimerTextVariant = this.#aiCodeCompletionConfig?.disclaimerTextVariant;
338
+ if (disclaimerTextVariant === 'console') {
337
339
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.AiCodeCompletionRequestTriggeredFromConsole);
338
- } else if (panel === AiCodeCompletion.AiCodeCompletion.ContextFlavor.SOURCES) {
340
+ } else if (disclaimerTextVariant === 'sources') {
339
341
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.AiCodeCompletionRequestTriggeredFromSources);
340
342
  }
341
343
 
@@ -6,7 +6,6 @@ import * as Common from '../../../core/common/common.js';
6
6
  import * as Host from '../../../core/host/host.js';
7
7
  import * as i18n from '../../../core/i18n/i18n.js';
8
8
  import * as Root from '../../../core/root/root.js';
9
- import * as AiCodeCompletion from '../../../models/ai_code_completion/ai_code_completion.js';
10
9
  import * as AiCodeGeneration from '../../../models/ai_code_generation/ai_code_generation.js';
11
10
  import * as PanelCommon from '../../../panels/common/common.js';
12
11
  import * as CodeMirror from '../../../third_party/codemirror.next/codemirror.next.js';
@@ -47,7 +46,8 @@ export interface AiCodeGenerationConfig {
47
46
  onSuggestionAccepted: (citations: Host.AidaClient.Citation[]) => void;
48
47
  onRequestTriggered: () => void;
49
48
  onResponseReceived: () => void;
50
- panel: AiCodeCompletion.AiCodeCompletion.ContextFlavor;
49
+ disclaimerTooltipId: string;
50
+ disclaimerTextVariant: PanelCommon.DisclaimerTextVariant;
51
51
  }
52
52
 
53
53
  export class AiCodeGenerationProvider {
@@ -84,9 +84,8 @@ export class AiCodeGenerationProvider {
84
84
  throw new Error('AI code generation feature is not available.');
85
85
  }
86
86
  this.#generationTeaser = new PanelCommon.AiCodeGenerationTeaser.AiCodeGenerationTeaser();
87
- this.#generationTeaser.disclaimerTooltipId =
88
- aiCodeGenerationConfig.panel + '-ai-code-generation-disclaimer-tooltip';
89
- this.#generationTeaser.panel = aiCodeGenerationConfig.panel;
87
+ this.#generationTeaser.disclaimerTooltipId = aiCodeGenerationConfig.disclaimerTooltipId;
88
+ this.#generationTeaser.disclaimerTextVariant = aiCodeGenerationConfig.disclaimerTextVariant;
90
89
  this.#aiCodeGenerationConfig = aiCodeGenerationConfig;
91
90
  }
92
91
 
@@ -232,10 +231,10 @@ export class AiCodeGenerationProvider {
232
231
  }
233
232
 
234
233
  void VisualLogging.logKeyDown(event.currentTarget, event, 'ai-code-generation.triggered');
235
- if (this.#aiCodeGenerationConfig?.panel === AiCodeCompletion.AiCodeCompletion.ContextFlavor.CONSOLE) {
234
+ if (this.#aiCodeGenerationConfig?.disclaimerTextVariant === 'console') {
236
235
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.AiCodeGenerationRequestTriggeredFromConsole);
237
236
  void VisualLogging.logKeyDown(event.currentTarget, event, 'ai-code-generation.triggered-from-console');
238
- } else if (this.#aiCodeGenerationConfig?.panel === AiCodeCompletion.AiCodeCompletion.ContextFlavor.SOURCES) {
237
+ } else if (this.#aiCodeGenerationConfig?.disclaimerTextVariant === 'sources') {
239
238
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.AiCodeGenerationRequestTriggeredFromSources);
240
239
  void VisualLogging.logKeyDown(event.currentTarget, event, 'ai-code-generation.triggered-from-sources');
241
240
  }
@@ -358,7 +357,7 @@ export class AiCodeGenerationProvider {
358
357
  this.#dismissTeaserAndSuggestion();
359
358
  }
360
359
 
361
- if (!generationResponse || generationResponse.samples.length === 0) {
360
+ if (generationResponse.samples.length === 0) {
362
361
  this.#aiCodeGenerationConfig.onResponseReceived();
363
362
  return;
364
363
  }
@@ -255,6 +255,8 @@ export const enum OutsideTabIndexBehavior {
255
255
 
256
256
  export class DialogWidget extends Common.ObjectWrapper.eventMixin<EventTypes, typeof Widget>(Widget) {
257
257
  #open = false;
258
+ #jslogContext = '';
259
+ #dialogStack = false;
258
260
  #content: LitTemplate = nothing;
259
261
  readonly #dialog = new Dialog();
260
262
 
@@ -279,8 +281,16 @@ export class DialogWidget extends Common.ObjectWrapper.eventMixin<EventTypes, ty
279
281
  }
280
282
  }
281
283
 
282
- #jslogContext = '';
284
+ get dialogStack(): boolean {
285
+ return this.#dialogStack;
286
+ }
283
287
 
288
+ set dialogStack(dialogStack: boolean) {
289
+ if (this.#dialogStack !== dialogStack) {
290
+ this.#dialogStack = dialogStack;
291
+ this.requestUpdate();
292
+ }
293
+ }
284
294
  get content(): LitTemplate {
285
295
  return this.#content;
286
296
  }
@@ -322,7 +332,7 @@ export class DialogWidget extends Common.ObjectWrapper.eventMixin<EventTypes, ty
322
332
  // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
323
333
  render(this.#content ?? nothing, this.#dialog.contentElement);
324
334
  if (!this.#dialog.isShowing()) {
325
- this.#dialog.show(this.contentElement.ownerDocument);
335
+ this.#dialog.show(this.contentElement.ownerDocument, this.#dialogStack);
326
336
  this.#dialog.contentElement.focus();
327
337
  } else {
328
338
  this.#dialog.positionContent();
@@ -506,6 +506,7 @@ export class TabbedPane extends Common.ObjectWrapper.eventMixin<EventTypes, type
506
506
  }
507
507
 
508
508
  protected clearMeasuredWidths(): void {
509
+ delete this.measuredDropDownButtonWidth;
509
510
  for (let i = 0; i < this.#tabs.length; ++i) {
510
511
  delete this.#tabs[i].measuredWidth;
511
512
  }
@@ -842,7 +843,8 @@ export class TabbedPane extends Common.ObjectWrapper.eventMixin<EventTypes, type
842
843
  private maybeShowDropDown(hasMoreTabs: boolean): void {
843
844
  // The legacy chevron is suppressed when a trailing-button slot is
844
845
  // populated; the slotted element takes its place.
845
- const shouldShow = this.#trailingSlot.assignedElements().length === 0 && hasMoreTabs;
846
+ const shouldShow = this.#trailingSlot.assignedElements().length === 0 && hasMoreTabs &&
847
+ this.totalWidth() >= (this.measuredDropDownButtonWidth || 0);
846
848
  if (shouldShow && !this.dropDownButton.parentElement) {
847
849
  this.headerContentsElement.appendChild(this.dropDownButton);
848
850
  } else if (!shouldShow && this.dropDownButton.parentElement) {
@@ -942,7 +944,10 @@ export class TabbedPane extends Common.ObjectWrapper.eventMixin<EventTypes, type
942
944
  }
943
945
  this.dropDownButton.classList.add('measuring');
944
946
  this.headerContentsElement.appendChild(this.dropDownButton);
945
- this.measuredDropDownButtonWidth = this.dropDownButton.getBoundingClientRect().width;
947
+ const width = this.dropDownButton.getBoundingClientRect().width;
948
+ if (width > 0) {
949
+ this.measuredDropDownButtonWidth = width;
950
+ }
946
951
  this.headerContentsElement.removeChild(this.dropDownButton);
947
952
  this.dropDownButton.classList.remove('measuring');
948
953
  }
@@ -57,7 +57,7 @@ export interface ViewInput {
57
57
  renderInline?: boolean;
58
58
  portBindingEnabled?: boolean;
59
59
  schemeBindingEnabled?: boolean;
60
- onEdit: (data: CookieData, columnId: string, valueBeforeEditing: string, newText: string) => void;
60
+ onEdit: (data: CookieData, columnId: string, valueBeforeEditing: string|boolean, newText: string|boolean) => void;
61
61
  onCreate: (data: CookieData) => void;
62
62
  onRefresh: () => void;
63
63
  onDelete: (data: CookieData) => void;
@@ -71,18 +71,21 @@ type ViewFunction = (input: ViewInput, output: object, target: HTMLElement) => v
71
71
  type AttributeWithIcon = SDK.Cookie.Attribute.NAME|SDK.Cookie.Attribute.VALUE|SDK.Cookie.Attribute.DOMAIN|
72
72
  SDK.Cookie.Attribute.PATH|SDK.Cookie.Attribute.SECURE|SDK.Cookie.Attribute.SAME_SITE;
73
73
 
74
- type CookieData = Partial<Record<SDK.Cookie.Attribute, string>>&{
75
- name: string,
76
- value: string,
77
- }&{
78
- key?: string,
79
- flagged?: boolean,
80
- icons?: Partial<Record<AttributeWithIcon, Icon>>,
81
- priorityValue?: number,
82
- expiresTooltip?: string,
83
- dirty?: boolean,
84
- inactive?: boolean,
85
- };
74
+ type BooleanAttributes =
75
+ SDK.Cookie.Attribute.HTTP_ONLY|SDK.Cookie.Attribute.SECURE|SDK.Cookie.Attribute.HAS_CROSS_SITE_ANCESTOR;
76
+ type CookieData = Partial<Record<Exclude<SDK.Cookie.Attribute, BooleanAttributes>, string>>&
77
+ Partial<Record<BooleanAttributes, string|boolean>>&{
78
+ name: string,
79
+ value: string,
80
+ }&{
81
+ key?: string,
82
+ flagged?: boolean,
83
+ icons?: Partial<Record<AttributeWithIcon, Icon>>,
84
+ priorityValue?: number,
85
+ expiresTooltip?: string,
86
+ dirty?: boolean,
87
+ inactive?: boolean,
88
+ };
86
89
 
87
90
  const {repeat, ifDefined} = Directives;
88
91
 
@@ -185,6 +188,10 @@ const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined
185
188
 
186
189
  const expiresSessionValue = i18nLazyString(UIStrings.session);
187
190
 
191
+ function isFlagAttribute(attribute: SDK.Cookie.Attribute): attribute is BooleanAttributes {
192
+ return attribute === SDK.Cookie.Attribute.HTTP_ONLY || attribute === SDK.Cookie.Attribute.SECURE;
193
+ }
194
+
188
195
  export interface CookiesTableData {
189
196
  cookies: SDK.Cookie.Cookie[];
190
197
  cookieToBlockedReasons?: ReadonlyMap<SDK.Cookie.Cookie, SDK.CookieModel.BlockedReason[]>;
@@ -280,13 +287,13 @@ export class CookiesTable extends UI.Widget.VBox {
280
287
  </th>` : ''}
281
288
  </tr>
282
289
  ${repeat(this.data, cookie => cookie.key, cookie => {
283
- const isHttpOnly = cookie['http-only'] === 'true';
290
+ const isHttpOnly = Boolean(cookie['http-only']);
284
291
  return html`
285
292
  <tr ?selected=${cookie.key === input.selectedKey}
286
293
  ?inactive=${cookie.inactive}
287
294
  ?dirty=${cookie.dirty}
288
295
  ?highlighted=${cookie.flagged}
289
- @edit=${(e: CustomEvent<{columnId: string, valueBeforeEditing: string, newText: string}>) =>
296
+ @edit=${(e: CustomEvent<{columnId: string, valueBeforeEditing: string|boolean, newText: string|boolean}>) =>
290
297
  input.onEdit(cookie, e.detail.columnId, e.detail.valueBeforeEditing, e.detail.newText)}
291
298
  @delete=${()=> input.onDelete(cookie)}
292
299
  @contextmenu=${(e: CustomEvent<UI.ContextMenu.ContextMenu>) => input.onContextMenu(cookie, e.detail)}
@@ -479,7 +486,8 @@ export class CookiesTable extends UI.Widget.VBox {
479
486
  }
480
487
  }
481
488
 
482
- private onUpdateCookie(oldData: CookieData, columnIdentifier: string, _oldText: string, newText: string): void {
489
+ private onUpdateCookie(oldData: CookieData, columnIdentifier: string, _oldText: string|boolean,
490
+ newText: string|boolean): void {
483
491
  const oldCookie = this.cookies.find(cookie => cookie.key() === oldData.key);
484
492
  if (!oldCookie) {
485
493
  return;
@@ -547,7 +555,14 @@ export class CookiesTable extends UI.Widget.VBox {
547
555
  of [SDK.Cookie.Attribute.DOMAIN, SDK.Cookie.Attribute.PATH, SDK.Cookie.Attribute.HTTP_ONLY,
548
556
  SDK.Cookie.Attribute.SECURE, SDK.Cookie.Attribute.SAME_SITE, SDK.Cookie.Attribute.SOURCE_SCHEME]) {
549
557
  if (attribute in data) {
550
- cookie.addAttribute(attribute, data[attribute]);
558
+ const value = data[attribute];
559
+ if (isFlagAttribute(attribute)) {
560
+ if (value === true) {
561
+ cookie.addAttribute(attribute);
562
+ }
563
+ } else {
564
+ cookie.addAttribute(attribute, value);
565
+ }
551
566
  }
552
567
  }
553
568
  if (data.expires && data.expires !== expiresSessionValue()) {
@@ -559,11 +574,8 @@ export class CookiesTable extends UI.Widget.VBox {
559
574
  Number.parseInt(data[SDK.Cookie.Attribute.SOURCE_PORT] || '', 10) || undefined);
560
575
  }
561
576
  if (data[SDK.Cookie.Attribute.PARTITION_KEY_SITE]) {
562
- cookie.setPartitionKey(
563
- data[SDK.Cookie.Attribute.PARTITION_KEY_SITE],
564
- Boolean(
565
- data[SDK.Cookie.Attribute.HAS_CROSS_SITE_ANCESTOR] ? data[SDK.Cookie.Attribute.HAS_CROSS_SITE_ANCESTOR] :
566
- false));
577
+ cookie.setPartitionKey(data[SDK.Cookie.Attribute.PARTITION_KEY_SITE],
578
+ data[SDK.Cookie.Attribute.HAS_CROSS_SITE_ANCESTOR] === true);
567
579
  }
568
580
  cookie.setSize(data[SDK.Cookie.Attribute.NAME].length + data[SDK.Cookie.Attribute.VALUE].length);
569
581
  return cookie;
@@ -578,7 +590,11 @@ export class CookiesTable extends UI.Widget.VBox {
578
590
  of [SDK.Cookie.Attribute.HTTP_ONLY, SDK.Cookie.Attribute.SECURE, SDK.Cookie.Attribute.SAME_SITE,
579
591
  SDK.Cookie.Attribute.SOURCE_SCHEME, SDK.Cookie.Attribute.SOURCE_PORT]) {
580
592
  if (cookie.hasAttribute(attribute)) {
581
- data[attribute] = String(cookie.getAttribute(attribute) ?? true);
593
+ if (isFlagAttribute(attribute)) {
594
+ data[attribute] = true;
595
+ } else {
596
+ data[attribute] = String(cookie.getAttribute(attribute) ?? true);
597
+ }
582
598
  }
583
599
  }
584
600
  data[SDK.Cookie.Attribute.DOMAIN] = cookie.domain() || (isRequest ? i18nString(UIStrings.na) : '');
@@ -596,7 +612,7 @@ export class CookiesTable extends UI.Widget.VBox {
596
612
  }
597
613
  data[SDK.Cookie.Attribute.PARTITION_KEY_SITE] =
598
614
  cookie.partitionKeyOpaque() ? i18nString(UIStrings.opaquePartitionKey).toString() : cookie.topLevelSite();
599
- data[SDK.Cookie.Attribute.HAS_CROSS_SITE_ANCESTOR] = cookie.hasCrossSiteAncestor() ? 'true' : '';
615
+ data[SDK.Cookie.Attribute.HAS_CROSS_SITE_ANCESTOR] = cookie.hasCrossSiteAncestor();
600
616
  data[SDK.Cookie.Attribute.SIZE] = String(cookie.size());
601
617
  data[SDK.Cookie.Attribute.PRIORITY] = cookie.priority();
602
618
  data.priorityValue = ['Low', 'Medium', 'High'].indexOf(cookie.priority());
@@ -1719,6 +1719,7 @@ export const enum Align {
1719
1719
  export const enum DataType {
1720
1720
  STRING = 'String',
1721
1721
  BOOLEAN = 'Boolean',
1722
+ NUMBER = 'Number',
1722
1723
  }
1723
1724
 
1724
1725
  export const ColumnResizePadding = 30;
@@ -285,7 +285,9 @@ export class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate
285
285
  if (align !== Align.CENTER && align !== Align.RIGHT) {
286
286
  align = undefined;
287
287
  }
288
- const dataType = column.getAttribute('type') === 'boolean' ? DataType.BOOLEAN : DataType.STRING;
288
+ const typeAttr = column.getAttribute('type');
289
+ const dataType =
290
+ typeAttr === 'boolean' ? DataType.BOOLEAN : (typeAttr === 'numeric' ? DataType.NUMBER : DataType.STRING);
289
291
  const weight = parseFloat(column.getAttribute('weight') || '') ?? undefined;
290
292
  const editable = column.hasAttribute('editable');
291
293
  if (editable) {
@@ -318,7 +320,6 @@ export class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate
318
320
  const visibleColumns = new Set(this.#columns.map(({id}) => id).filter(id => !this.#hiddenColumns.has(id)));
319
321
  this.#dataGrid.setColumnsVisibility(visibleColumns);
320
322
  this.#dataGrid.setEditCallback(hasEditableColumn ? this.#editCallback.bind(this) : undefined, INTERNAL_TOKEN);
321
- this.#dataGrid.deleteCallback = this.#deleteCallback.bind(this);
322
323
  }
323
324
 
324
325
  #needUpdateColumns(mutationList: MutationRecord[]): boolean {
@@ -509,8 +510,8 @@ export class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate
509
510
  }
510
511
  }
511
512
 
512
- #editCallback(node: DataGridElementNode, columnId: string, valueBeforeEditing: string, newText: string,
513
- moveDirection?: string): void {
513
+ #editCallback(node: DataGridElementNode, columnId: string, valueBeforeEditing: string|boolean,
514
+ newText: string|boolean, moveDirection?: string): void {
514
515
  if (node.isCreationNode) {
515
516
  this.#usedCreationNode = node;
516
517
  let hasNextEditableColumn = false;
@@ -543,6 +544,9 @@ export class DataGridElement extends UI.UIUtils.HTMLElementWithLightDOMTemplate
543
544
  if (args[0] === 'refresh') {
544
545
  this.#dataGrid.refreshCallback = this.#refreshCallback.bind(this);
545
546
  }
547
+ if (args[0] === 'delete') {
548
+ this.#dataGrid.deleteCallback = this.#deleteCallback.bind(this);
549
+ }
546
550
  }
547
551
 
548
552
  #refreshCallback(): void {
@@ -12,7 +12,7 @@ import type * as NetworkTimeCalculator from '../../../../models/network_time_cal
12
12
  import * as Trace from '../../../../models/trace/trace.js';
13
13
  import * as VisualLogging from '../../../../ui/visual_logging/visual_logging.js';
14
14
  import * as Buttons from '../../../components/buttons/buttons.js';
15
- import {html, render, type TemplateResult} from '../../../lit/lit.js';
15
+ import {html, nothing, render, type TemplateResult} from '../../../lit/lit.js';
16
16
  import * as UI from '../../legacy.js';
17
17
  import * as ThemeSupport from '../../theme_support/theme_support.js';
18
18
 
@@ -621,7 +621,7 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
621
621
 
622
622
  hideHighlight(): void {
623
623
  if (this.#searchResultEntryIndex === null) {
624
- this.popoverElement.removeChildren();
624
+ this.#renderPopover(nothing);
625
625
  this.lastPopoverState = {
626
626
  entryIndex: -1,
627
627
  groupIndex: -1,
@@ -794,7 +794,7 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
794
794
  this.viewportElement.style.cursor = 'pointer';
795
795
  const iconTooltipElement = this.#prepareIconInfo(groupIndex, hoverType);
796
796
  if (iconTooltipElement) {
797
- this.popoverElement.appendChild(iconTooltipElement);
797
+ this.#renderPopover(iconTooltipElement);
798
798
  this.updatePopoverOffset();
799
799
  }
800
800
  return;
@@ -923,9 +923,13 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
923
923
  };
924
924
  }
925
925
 
926
- updatePopoverContents(popoverElement: Element|TemplateResult): void {
926
+ #renderPopover(content: Element|TemplateResult|string|typeof nothing): void {
927
927
  // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
928
- render(html`${popoverElement}`, this.popoverElement);
928
+ render(html`${content}`, this.popoverElement);
929
+ }
930
+
931
+ updatePopoverContents(popoverElement: Element|TemplateResult): void {
932
+ this.#renderPopover(popoverElement);
929
933
  // Must update the offset AFTER the new content has been added.
930
934
  this.updatePopoverOffset();
931
935
  this.lastPopoverState.entryIndex = -1;
@@ -941,13 +945,14 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
941
945
  if (groupIndex === this.lastPopoverState.groupIndex) {
942
946
  return this.updatePopoverOffset();
943
947
  }
944
- this.popoverElement.removeChildren();
945
948
  const data = this.timelineData();
946
949
  if (!data) {
950
+ this.#renderPopover(nothing);
947
951
  return;
948
952
  }
949
953
  const group = data.groups.at(groupIndex);
950
954
  if (!group) {
955
+ this.#renderPopover(nothing);
951
956
  return;
952
957
  }
953
958
  // Only show a popover tooltip if the group has a pre-defined `fullTrackName`
@@ -956,8 +961,10 @@ export class FlameChart extends Common.ObjectWrapper.eventMixin<EventTypes, type
956
961
  const fullTrackName = group.fullTrackName;
957
962
 
958
963
  if (fullTrackName) {
959
- this.popoverElement.innerText = fullTrackName;
964
+ this.#renderPopover(fullTrackName);
960
965
  this.updatePopoverOffset();
966
+ } else {
967
+ this.#renderPopover(nothing);
961
968
  }
962
969
  this.lastPopoverState = {
963
970
  groupIndex,
@@ -228,7 +228,17 @@ export class CommandMenu {
228
228
  if (!options || !registeredSettingUI.uiDescriptor.category) {
229
229
  continue;
230
230
  }
231
- const setting = Common.Settings.Settings.instance().resolve(registeredSettingUI.descriptor);
231
+ let setting: Common.Settings.Setting<unknown>;
232
+ if ('isAvailable' in registeredSettingUI.descriptor) {
233
+ const settingResult = Common.Settings.Settings.instance().maybeResolve(
234
+ registeredSettingUI.descriptor as Common.Settings.ConditionalSettingDescriptor<unknown, unknown>);
235
+ if (!('setting' in settingResult)) {
236
+ continue;
237
+ }
238
+ setting = settingResult.setting;
239
+ } else {
240
+ setting = Common.Settings.Settings.instance().resolve(registeredSettingUI.descriptor);
241
+ }
232
242
  for (const pair of options) {
233
243
  this.#commands.push(
234
244
  CommandMenu.createSettingCommand(setting, pair.title(), pair.value, registeredSettingUI.uiDescriptor));