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
@@ -35,8 +35,8 @@ export class TimelineLoader {
35
35
  #collectedEvents: Trace.Types.Events.Event[] = [];
36
36
  #metadata: Trace.Types.File.MetaData|null;
37
37
 
38
- #traceFinalizedCallbackForTest?: () => void;
39
- #traceFinalizedPromiseForTest: Promise<void>;
38
+ #traceLoadedCallback?: (state: LoadingState) => void;
39
+ #traceLoadedPromise: Promise<LoadingState>;
40
40
 
41
41
  constructor(client: Client) {
42
42
  this.client = client;
@@ -45,8 +45,8 @@ export class TimelineLoader {
45
45
  this.#traceIsCPUProfile = false;
46
46
  this.#metadata = null;
47
47
 
48
- this.#traceFinalizedPromiseForTest = new Promise<void>(resolve => {
49
- this.#traceFinalizedCallbackForTest = resolve;
48
+ this.#traceLoadedPromise = new Promise<LoadingState>(resolve => {
49
+ this.#traceLoadedCallback = resolve;
50
50
  });
51
51
  }
52
52
 
@@ -57,11 +57,10 @@ export class TimelineLoader {
57
57
  client.loadingStarted();
58
58
  try {
59
59
  loader.#processParsedFile(contents);
60
- await loader.close();
60
+ await loader.complete();
61
61
  } catch (e: unknown) {
62
- await loader.close();
63
62
  const message = e instanceof Error ? e.message : '';
64
- return loader.reportErrorAndCancelLoading(i18nString(UIStrings.malformedTimelineDataS, {PH1: message}));
63
+ loader.reportErrorAndCancelLoading(i18nString(UIStrings.malformedTimelineDataS, {PH1: message}));
65
64
  }
66
65
  });
67
66
 
@@ -71,7 +70,11 @@ export class TimelineLoader {
71
70
  static loadFromEvents(events: Trace.Types.Events.Event[], client: Client): TimelineLoader {
72
71
  const loader = new TimelineLoader(client);
73
72
  window.setTimeout(async () => {
74
- void loader.addEvents(events, null);
73
+ try {
74
+ await loader.addEvents(events, null);
75
+ } catch (e: unknown) {
76
+ loader.reportErrorAndCancelLoading(e instanceof Error ? e.message : undefined);
77
+ }
75
78
  });
76
79
  return loader;
77
80
  }
@@ -79,12 +82,16 @@ export class TimelineLoader {
79
82
  static loadFromTraceFile(traceFile: Trace.Types.File.TraceFile, client: Client): TimelineLoader {
80
83
  const loader = new TimelineLoader(client);
81
84
  window.setTimeout(async () => {
82
- void loader.addEvents(traceFile.traceEvents, traceFile.metadata);
85
+ try {
86
+ await loader.addEvents(traceFile.traceEvents, traceFile.metadata);
87
+ } catch (e: unknown) {
88
+ loader.reportErrorAndCancelLoading(e instanceof Error ? e.message : undefined);
89
+ }
83
90
  });
84
91
  return loader;
85
92
  }
86
93
 
87
- static loadFromCpuProfile(profile: Protocol.Profiler.Profile, client: Client): TimelineLoader {
94
+ static loadFromCpuProfile(profile: Protocol.Profiler.Profile, client: Client, title?: string): TimelineLoader {
88
95
  const loader = new TimelineLoader(client);
89
96
  loader.#traceIsCPUProfile = true;
90
97
 
@@ -93,10 +100,15 @@ export class TimelineLoader {
93
100
  profile, Trace.Types.Events.ThreadID(1));
94
101
 
95
102
  window.setTimeout(async () => {
96
- void loader.addEvents(contents.traceEvents, null);
103
+ try {
104
+ await loader.addEvents(contents.traceEvents, title ? {title} : null);
105
+ } catch (e: unknown) {
106
+ loader.reportErrorAndCancelLoading(e instanceof Error ? e.message : undefined);
107
+ }
97
108
  });
98
- } catch (e) {
99
- console.error(e.stack);
109
+ } catch (e: unknown) {
110
+ console.error(e instanceof Error ? e.stack : e);
111
+ loader.reportErrorAndCancelLoading(e instanceof Error ? e.message : undefined);
100
112
  }
101
113
  return loader;
102
114
  }
@@ -110,9 +122,8 @@ export class TimelineLoader {
110
122
  Common.Settings.Settings.instance().moduleSetting('network.enable-remote-file-loading').get();
111
123
  Host.ResourceLoader.loadAsStream(url, null, stream, finishedCallback, allowRemoteFilePaths);
112
124
 
113
- async function finishedCallback(
114
- success: boolean, _headers: Record<string, string>,
115
- errorDescription: Host.ResourceLoader.LoadErrorDescription): Promise<void> {
125
+ async function finishedCallback(success: boolean, _headers: Record<string, string>,
126
+ errorDescription: Host.ResourceLoader.LoadErrorDescription): Promise<void> {
116
127
  if (!success) {
117
128
  return loader.reportErrorAndCancelLoading(errorDescription.message);
118
129
  }
@@ -120,9 +131,8 @@ export class TimelineLoader {
120
131
  const txt = stream.data();
121
132
  const trace = JSON.parse(txt);
122
133
  loader.#processParsedFile(trace);
123
- await loader.close();
134
+ await loader.complete();
124
135
  } catch (e: unknown) {
125
- await loader.close();
126
136
  const message = e instanceof Error ? e.message : '';
127
137
  return loader.reportErrorAndCancelLoading(i18nString(UIStrings.malformedTimelineDataS, {PH1: message}));
128
138
  }
@@ -166,27 +176,31 @@ export class TimelineLoader {
166
176
  }
167
177
  }
168
178
 
169
- async addEvents(events: readonly Trace.Types.Events.Event[], metadata: Trace.Types.File.MetaData|null):
170
- Promise<void> {
171
- this.#metadata = metadata;
172
- this.client?.loadingStarted();
173
- /**
174
- * See the `eventsPerChunk` comment in `models/trace/types/Configuration.ts`.
175
- *
176
- * This value is different though. Why? `The addEvents()` work below is different
177
- * (and much faster!) than running `handleEvent()` on all handlers.
178
- */
179
- const eventsPerChunk = 150_000;
180
- for (let i = 0; i < events.length; i += eventsPerChunk) {
181
- const chunk = events.slice(i, i + eventsPerChunk);
182
- this.#collectEvents(chunk as unknown as Trace.Types.Events.Event[]);
183
- this.client?.loadingProgress((i + chunk.length) / events.length);
184
- await new Promise(r => window.setTimeout(r, 0)); // Yield event loop to paint.
179
+ async addEvents(events: readonly Trace.Types.Events.Event[],
180
+ metadata: Trace.Types.File.MetaData|null): Promise<void> {
181
+ try {
182
+ this.#metadata = metadata;
183
+ this.client?.loadingStarted();
184
+ /**
185
+ * See the `eventsPerChunk` comment in `models/trace/types/Configuration.ts`.
186
+ *
187
+ * This value is different though. Why? `The addEvents()` work below is different
188
+ * (and much faster!) than running `handleEvent()` on all handlers.
189
+ */
190
+ const eventsPerChunk = 150_000;
191
+ for (let i = 0; i < events.length; i += eventsPerChunk) {
192
+ const chunk = events.slice(i, i + eventsPerChunk);
193
+ this.#collectEvents(chunk as unknown as Trace.Types.Events.Event[]);
194
+ this.client?.loadingProgress((i + chunk.length) / events.length);
195
+ await new Promise(r => window.setTimeout(r, 0)); // Yield event loop to paint.
196
+ }
197
+ await this.complete();
198
+ } catch (e: unknown) {
199
+ this.reportErrorAndCancelLoading(e instanceof Error ? e.message : undefined);
185
200
  }
186
- void this.close();
187
201
  }
188
202
 
189
- async cancel(): Promise<void> {
203
+ async #cleanup(): Promise<void> {
190
204
  if (this.client) {
191
205
  await this.client.loadingComplete(
192
206
  /* collectedEvents */[], /* exclusiveFilter= */ null, /* metadata= */ null);
@@ -197,19 +211,29 @@ export class TimelineLoader {
197
211
  }
198
212
  }
199
213
 
214
+ async cancel(): Promise<void> {
215
+ await this.#cleanup();
216
+ this.#traceLoadedCallback?.(LoadingState.CANCELLED);
217
+ }
218
+
200
219
  private reportErrorAndCancelLoading(message?: string): void {
201
220
  if (message) {
202
221
  Common.Console.Console.instance().error(message);
203
222
  }
204
- void this.cancel();
223
+ this.#traceLoadedCallback?.(LoadingState.ERROR);
224
+ void this.#cleanup();
205
225
  }
206
226
 
207
- async close(): Promise<void> {
227
+ async complete(): Promise<void> {
208
228
  if (!this.client) {
209
229
  return;
210
230
  }
211
231
  this.client.processingStarted();
212
- await this.finalizeTrace();
232
+ try {
233
+ await this.finalizeTrace();
234
+ } catch (e: unknown) {
235
+ this.reportErrorAndCancelLoading(e instanceof Error ? e.message : undefined);
236
+ }
213
237
  }
214
238
 
215
239
  private async finalizeTrace(): Promise<void> {
@@ -218,11 +242,11 @@ export class TimelineLoader {
218
242
  }
219
243
 
220
244
  await (this.client as Client).loadingComplete(this.#collectedEvents, this.filter, this.#metadata);
221
- this.#traceFinalizedCallbackForTest?.();
245
+ this.#traceLoadedCallback?.(LoadingState.SUCCESS);
222
246
  }
223
247
 
224
- traceFinalizedForTest(): Promise<void> {
225
- return this.#traceFinalizedPromiseForTest;
248
+ traceLoaded(): Promise<LoadingState> {
249
+ return this.#traceLoadedPromise;
226
250
  }
227
251
 
228
252
  #parseCPUProfileFormatFromFile(parsedTrace: Protocol.Profiler.Profile): void {
@@ -241,3 +265,9 @@ export class TimelineLoader {
241
265
  * Used when we parse the input, but do not yet know if it is a raw CPU Profile or a Trace
242
266
  **/
243
267
  export type ParsedJSONFile = Trace.Types.File.Contents|Protocol.Profiler.Profile;
268
+
269
+ export const enum LoadingState {
270
+ SUCCESS = 'SUCCESS',
271
+ CANCELLED = 'CANCELLED',
272
+ ERROR = 'ERROR',
273
+ }
@@ -301,6 +301,16 @@ const UIStrings = {
301
301
  * @description Title of the shortcuts dialog shown to the user that lists keyboard shortcuts.
302
302
  */
303
303
  shortcutsDialogTitle: 'Keyboard shortcuts for flamechart',
304
+ /**
305
+ * @description Header for the confirmation dialog asking the user whether
306
+ * to load a CPU profile recorded by console.profile().
307
+ */
308
+ loadCpuProfileHeader: 'Load CPU profile?',
309
+ /**
310
+ * @description Confirmation message asking the user whether to load a CPU profile recorded by console.profile().
311
+ * @example {Profile 1} PH1
312
+ */
313
+ loadCpuProfileConfirmation: 'Do you want to load the recorded CPU profile "{PH1}" into the Performance panel?',
304
314
  } as const;
305
315
  const str_ = i18n.i18n.registerUIStrings('panels/timeline/TimelinePanel.ts', UIStrings);
306
316
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -1036,12 +1046,12 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
1036
1046
  this.#minimapComponent.highlightBounds(bounds, /* withBracket */ false);
1037
1047
  }
1038
1048
 
1039
- loadFromCpuProfile(profile: Protocol.Profiler.Profile|null): void {
1049
+ loadFromCpuProfile(profile: Protocol.Profiler.Profile|null, title?: string): void {
1040
1050
  if (this.state !== State.IDLE || profile === null) {
1041
1051
  return;
1042
1052
  }
1043
1053
  this.prepareToLoadTimeline();
1044
- this.loader = TimelineLoader.loadFromCpuProfile(profile, this);
1054
+ this.loader = TimelineLoader.loadFromCpuProfile(profile, this, title);
1045
1055
  }
1046
1056
 
1047
1057
  private setState(state: State): void {
@@ -3243,9 +3253,24 @@ export class BottomUpProfileRevealer implements Common.Revealer.Revealer<Utils.H
3243
3253
  }
3244
3254
 
3245
3255
  export class ProfileFinishedRevealer implements Common.Revealer.Revealer<SDK.CPUProfilerModel.ProfileFinishedData> {
3256
+ static #consoleProfilePromiseChain: Promise<void> = Promise.resolve();
3257
+
3246
3258
  async reveal(data: SDK.CPUProfilerModel.ProfileFinishedData): Promise<void> {
3247
- await UI.ViewManager.ViewManager.instance().showView('timeline');
3248
- TimelinePanel.instance().loadFromCpuProfile(data.cpuProfile);
3259
+ const taskPromise = ProfileFinishedRevealer.#consoleProfilePromiseChain.then(async () => {
3260
+ const title = data.title || 'Untitled';
3261
+ const confirmed = await UI.UIUtils.ConfirmDialog.show(
3262
+ i18nString(UIStrings.loadCpuProfileConfirmation, {PH1: title}),
3263
+ i18nString(UIStrings.loadCpuProfileHeader),
3264
+ undefined,
3265
+ {jslogContext: 'load-cpu-profile-confirmation'},
3266
+ );
3267
+ if (confirmed) {
3268
+ await UI.ViewManager.ViewManager.instance().showView('timeline');
3269
+ TimelinePanel.instance().loadFromCpuProfile(data.cpuProfile, title);
3270
+ }
3271
+ });
3272
+ ProfileFinishedRevealer.#consoleProfilePromiseChain = taskPromise.catch(() => {});
3273
+ return await taskPromise;
3249
3274
  }
3250
3275
  }
3251
3276
 
@@ -54,6 +54,10 @@
54
54
 
55
55
  .text-details .name {
56
56
  font: var(--sys-typescale-body4-medium);
57
+ overflow: hidden;
58
+ text-overflow: ellipsis;
59
+ white-space: nowrap;
60
+ max-width: 240px;
57
61
  }
58
62
 
59
63
  .text-details .metadata {
@@ -1,7 +1,7 @@
1
1
  Name: Dependencies sourced from the upstream `chromium` repository
2
2
  URL: Internal
3
3
  Version: N/A
4
- Revision: c15d009df51d794d8a37df41cdc89d4056e7e0cd
4
+ Revision: b7fe14017379ddffae396d944fb8b59a5896c261
5
5
  Update Mechanism: Manual (https://crbug.com/428069060)
6
6
  License: BSD-3-Clause
7
7
  License File: LICENSE
@@ -1,10 +1,10 @@
1
1
  Name: Puppeteer Core
2
2
  Short Name: Puppeteer Core
3
3
  URL: https://github.com/puppeteer/puppeteer/tree/main/packages/puppeteer-core
4
- Version: 25.3.0
4
+ Version: 25.4.0
5
5
  License: Apache-2.0
6
6
  License File: LICENSE
7
- Revision: 58d9b023ed74c3a1f14ec5fd9315872602270c72
7
+ Revision: f5b96c54c01d4bcbeaa3c603ec5adf6782363b29
8
8
  Security Critical: no
9
9
  Shipped: yes
10
10
  Update Mechanism: Autoroll
@@ -123,6 +123,11 @@ export declare interface AddScreenParams {
123
123
  isInternal?: boolean;
124
124
  }
125
125
 
126
+ /**
127
+ * @public
128
+ */
129
+ export declare const asyncDisposeSymbol: typeof Symbol.asyncDispose;
130
+
126
131
  /**
127
132
  * Supported autofill address field names.
128
133
  *
@@ -567,6 +572,55 @@ export declare abstract class Browser extends EventEmitter<BrowserEvents> {
567
572
  * Uninstalls an extension.
568
573
  */
569
574
  abstract uninstallExtension(id: string): Promise<void>;
575
+ /**
576
+ * Installs a Progressive Web App (PWA) and returns its manifest id.
577
+ *
578
+ * @remarks
579
+ *
580
+ * Only available when connected to the browser over a pipe connection. Set
581
+ * `pipe: true` in {@link PuppeteerNode.launch | puppeteer.launch}; the launch
582
+ * option defaults to `false`. The underlying `PWA` CDP domain is not exposed
583
+ * over a WebSocket connection.
584
+ *
585
+ * The returned manifest id echoes {@link InstallPWAOptions.manifestId}, so it
586
+ * can be passed directly to {@link Browser.launchPWA},
587
+ * {@link Browser.getPWAState}, or {@link Browser.uninstallPWA}.
588
+ */
589
+ abstract installPWA(options: InstallPWAOptions): Promise<string>;
590
+ /**
591
+ * Uninstalls a previously installed Progressive Web App (PWA).
592
+ *
593
+ * @remarks
594
+ *
595
+ * Only available over a pipe connection. See {@link Browser.installPWA}.
596
+ */
597
+ abstract uninstallPWA(options: UninstallPWAOptions): Promise<void>;
598
+ /**
599
+ * Launches an installed Progressive Web App (PWA) and resolves with the
600
+ * {@link Page | page} backing the app window.
601
+ *
602
+ * @remarks
603
+ *
604
+ * Only available over a pipe connection. See {@link Browser.installPWA}.
605
+ *
606
+ * `PWA.launch` resolves with the id of the launched _tab_ target. Puppeteer
607
+ * does not expose tab targets through {@link Browser.targets}; this method
608
+ * instead resolves with the tab's child page target (the app's web contents).
609
+ * If Chromium focuses an existing app window, this returns that window's
610
+ * existing page.
611
+ */
612
+ abstract launchPWA(options: LaunchPWAOptions): Promise<Page>;
613
+ /**
614
+ * Returns the OS-integration state of an installed Progressive Web App (PWA),
615
+ * such as its badge count and registered file handlers.
616
+ *
617
+ * @remarks
618
+ *
619
+ * Only available over a pipe connection. See {@link Browser.installPWA}.
620
+ * Meaningful only for an app that is currently installed; querying an
621
+ * unknown manifest id rejects.
622
+ */
623
+ abstract getPWAState(options: GetPWAStateOptions): Promise<PWAState>;
570
624
  /**
571
625
  * Gets a list of {@link ScreenInfo | screen information objects}.
572
626
  */
@@ -591,6 +645,8 @@ export declare abstract class Browser extends EventEmitter<BrowserEvents> {
591
645
  * Whether Puppeteer is connected to this {@link Browser | browser}.
592
646
  */
593
647
  abstract get connected(): boolean;
648
+ [disposeSymbol](): void;
649
+ [asyncDisposeSymbol](): Promise<void>;
594
650
  /**
595
651
  * Get debug information from Puppeteer.
596
652
  *
@@ -788,6 +844,8 @@ export declare abstract class BrowserContext extends EventEmitter<BrowserContext
788
844
  * Identifier for this {@link BrowserContext | browser context}.
789
845
  */
790
846
  get id(): string | undefined;
847
+ [disposeSymbol](): void;
848
+ [asyncDisposeSymbol](): Promise<void>;
791
849
  }
792
850
 
793
851
  /**
@@ -2067,6 +2125,11 @@ export declare interface DeviceRequestPromptDevice {
2067
2125
  */
2068
2126
  export declare abstract class Dialog {
2069
2127
 
2128
+ /**
2129
+ * A boolean value indicating whether the dialog has been handled.
2130
+ */
2131
+ get handled(): boolean;
2132
+ protected set handled(handled: boolean);
2070
2133
  /**
2071
2134
  * The type of the dialog.
2072
2135
  */
@@ -2094,6 +2157,11 @@ export declare abstract class Dialog {
2094
2157
  dismiss(): Promise<void>;
2095
2158
  }
2096
2159
 
2160
+ /**
2161
+ * @public
2162
+ */
2163
+ export declare const disposeSymbol: typeof Symbol.dispose;
2164
+
2097
2165
  /**
2098
2166
  * @public
2099
2167
  */
@@ -2794,6 +2862,8 @@ export declare class EventEmitter<
2794
2862
  * @returns `this` to enable you to chain method calls.
2795
2863
  */
2796
2864
  removeAllListeners(type?: keyof EventsWithWildcard<Events>): this;
2865
+ [disposeSymbol](): void;
2866
+ [asyncDisposeSymbol](): Promise<void>;
2797
2867
  }
2798
2868
 
2799
2869
  /**
@@ -3731,6 +3801,18 @@ export declare interface GeolocationOptions {
3731
3801
  accuracy?: number;
3732
3802
  }
3733
3803
 
3804
+ /**
3805
+ * Options for {@link Browser.getPWAState}.
3806
+ *
3807
+ * @public
3808
+ */
3809
+ export declare interface GetPWAStateOptions {
3810
+ /**
3811
+ * The id from the web app's manifest file.
3812
+ */
3813
+ manifestId: string;
3814
+ }
3815
+
3734
3816
  /**
3735
3817
  * @public
3736
3818
  */
@@ -4157,6 +4239,37 @@ export declare type InnerParams<T extends unknown[]> = {
4157
4239
  [K in keyof T]: FlattenHandle<T[K]>;
4158
4240
  };
4159
4241
 
4242
+ /**
4243
+ * Options for {@link Browser.installPWA}.
4244
+ *
4245
+ * @public
4246
+ */
4247
+ export declare interface InstallPWAOptions {
4248
+ /**
4249
+ * The id from the web app's manifest file, commonly the URL of the site
4250
+ * installing the web app. See
4251
+ * {@link https://web.dev/learn/pwa/web-app-manifest | Web app manifest}.
4252
+ */
4253
+ manifestId: string;
4254
+ /**
4255
+ * The URL used to install the app, or the URL of its signed web bundle.
4256
+ *
4257
+ * This is required because the browser-scoped CDP session has no associated
4258
+ * page from which Chromium could derive an install URL.
4259
+ */
4260
+ installUrlOrBundleUrl: string;
4261
+ /**
4262
+ * Whether the app should open in a standalone window or a browser tab.
4263
+ *
4264
+ * @remarks
4265
+ *
4266
+ * `PWA.install` alone leaves the app at Chromium's default display mode
4267
+ * (`browser`); setting this chains a `PWA.changeAppUserSettings` call to apply
4268
+ * the preference.
4269
+ */
4270
+ displayMode?: PWADisplayMode;
4271
+ }
4272
+
4160
4273
  /**
4161
4274
  * @public
4162
4275
  */
@@ -4355,6 +4468,8 @@ export declare abstract class JSHandle<T = unknown> {
4355
4468
  * backing this handle.
4356
4469
  */
4357
4470
  abstract remoteObject(): Protocol.Runtime.RemoteObject;
4471
+ [disposeSymbol](): void;
4472
+ [asyncDisposeSymbol](): Promise<void>;
4358
4473
  }
4359
4474
 
4360
4475
  /**
@@ -5100,6 +5215,28 @@ export declare interface LaunchOptions extends ConnectOptions {
5100
5215
  signal?: AbortSignal;
5101
5216
  }
5102
5217
 
5218
+ /**
5219
+ * Options for {@link Browser.launchPWA}.
5220
+ *
5221
+ * @public
5222
+ */
5223
+ export declare interface LaunchPWAOptions {
5224
+ /**
5225
+ * The id from the web app's manifest file.
5226
+ */
5227
+ manifestId: string;
5228
+ /**
5229
+ * An optional URL within the app's scope to launch. Defaults to the app's
5230
+ * start URL.
5231
+ */
5232
+ url?: string;
5233
+ /**
5234
+ * Maximum time in milliseconds to wait for the app's page target to appear.
5235
+ * Defaults to 30 seconds. Pass `0` to disable the timeout.
5236
+ */
5237
+ timeout?: number;
5238
+ }
5239
+
5103
5240
  /**
5104
5241
  * Locators describe a strategy of locating objects and performing an action on
5105
5242
  * them. If the action fails because the object is not ready for the action, the
@@ -5817,7 +5954,7 @@ export declare abstract class Page extends EventEmitter<PageEvents> {
5817
5954
  abstract get tracing(): Tracing;
5818
5955
  /**
5819
5956
  * Experimental API for {@link https://github.com/webmachinelearning/webmcp| WebMCP}.
5820
- * Requires Chrome 150+ with the `--enable-features=WebMCP` flag enabled.
5957
+ * Requires Chrome 151+ with the `--enable-features=WebMCP` flag enabled.
5821
5958
  *
5822
5959
  * @experimental
5823
5960
  */
@@ -7560,6 +7697,8 @@ export declare abstract class Page extends EventEmitter<PageEvents> {
7560
7697
  * @experimental
7561
7698
  */
7562
7699
  abstract windowId(): Promise<WindowId>;
7700
+ [disposeSymbol](): void;
7701
+ [asyncDisposeSymbol](): Promise<void>;
7563
7702
  /**
7564
7703
  * Opens DevTools for the this page if not already open and returns the DevTools page.
7565
7704
  * This method is only available in Chrome.
@@ -8188,6 +8327,12 @@ declare namespace Puppeteer_2 {
8188
8327
  WorkAreaInsets,
8189
8328
  AddScreenParams,
8190
8329
  ExtensionInstallOptions,
8330
+ PWADisplayMode,
8331
+ InstallPWAOptions,
8332
+ UninstallPWAOptions,
8333
+ LaunchPWAOptions,
8334
+ GetPWAStateOptions,
8335
+ PWAState,
8191
8336
  BrowserContextEvents,
8192
8337
  CDPEvents,
8193
8338
  CDPSessionEvents,
@@ -8371,6 +8516,8 @@ declare namespace Puppeteer_2 {
8371
8516
  FileChooser,
8372
8517
  Puppeteer,
8373
8518
  SecurityDetails,
8519
+ disposeSymbol,
8520
+ asyncDisposeSymbol,
8374
8521
  BrowserLauncher,
8375
8522
  PuppeteerNode,
8376
8523
  ScreenRecorder,
@@ -8537,6 +8684,31 @@ export declare class PuppeteerNode extends Puppeteer {
8537
8684
  trimCache(): Promise<void>;
8538
8685
  }
8539
8686
 
8687
+ /**
8688
+ * If the user prefers opening an installed web app in a standalone window or in
8689
+ * a browser tab.
8690
+ *
8691
+ * @public
8692
+ */
8693
+ export declare type PWADisplayMode = 'standalone' | 'browser';
8694
+
8695
+ /**
8696
+ * The OS-integration state of an installed web app, returned by
8697
+ * {@link Browser.getPWAState}.
8698
+ *
8699
+ * @public
8700
+ */
8701
+ export declare interface PWAState {
8702
+ /**
8703
+ * The current badge count shown on the app icon.
8704
+ */
8705
+ badgeCount: number;
8706
+ /**
8707
+ * The file handlers registered by the app with the OS.
8708
+ */
8709
+ fileHandlers: Protocol.PWA.FileHandler[];
8710
+ }
8711
+
8540
8712
  /**
8541
8713
  * @public
8542
8714
  */
@@ -8682,6 +8854,7 @@ export declare abstract class Realm {
8682
8854
  },
8683
8855
  ...args: Params
8684
8856
  ): Promise<HandleFor<Awaited<ReturnType<Func>>>>;
8857
+ [disposeSymbol](): void;
8685
8858
  }
8686
8859
 
8687
8860
  /**
@@ -8865,6 +9038,7 @@ export declare class ScreenRecorder extends PassThrough {
8865
9038
  * @public
8866
9039
  */
8867
9040
  stop(): Promise<void>;
9041
+ [asyncDisposeSymbol](): Promise<void>;
8868
9042
  }
8869
9043
 
8870
9044
  /**
@@ -9338,6 +9512,18 @@ export declare interface TracingOptions {
9338
9512
  categories?: string[];
9339
9513
  }
9340
9514
 
9515
+ /**
9516
+ * Options for {@link Browser.uninstallPWA}.
9517
+ *
9518
+ * @public
9519
+ */
9520
+ export declare interface UninstallPWAOptions {
9521
+ /**
9522
+ * The id from the web app's manifest file.
9523
+ */
9524
+ manifestId: string;
9525
+ }
9526
+
9341
9527
  /**
9342
9528
  * Puppeteer will throw this error if a method is not
9343
9529
  * supported by the currently used protocol