chrome-devtools-frontend 1.0.1565595 → 1.0.1567721

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/docs/contributing/performance.md +24 -0
  2. package/front_end/Images/src/lock-person.svg +1 -0
  3. package/front_end/core/common/Base64.ts +21 -2
  4. package/front_end/core/common/ResourceType.ts +7 -0
  5. package/front_end/core/host/InspectorFrontendHostStub.ts +3 -0
  6. package/front_end/core/host/UserMetrics.ts +20 -0
  7. package/front_end/core/root/Runtime.ts +5 -0
  8. package/front_end/core/sdk/DOMModel.ts +32 -2
  9. package/front_end/core/sdk/NetworkManager.ts +16 -3
  10. package/front_end/core/sdk/ResourceTreeModel.ts +11 -6
  11. package/front_end/entrypoints/main/MainImpl.ts +1 -7
  12. package/front_end/generated/Deprecation.ts +0 -8
  13. package/front_end/generated/InspectorBackendCommands.ts +10 -1
  14. package/front_end/generated/SupportedCSSProperties.js +48 -62
  15. package/front_end/generated/protocol-mapping.d.ts +4 -0
  16. package/front_end/generated/protocol-proxy-api.d.ts +5 -0
  17. package/front_end/generated/protocol.ts +203 -0
  18. package/front_end/models/ai_assistance/agents/AiAgent.ts +2 -1
  19. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +98 -105
  20. package/front_end/models/emulation/DeviceModeModel.ts +1 -1
  21. package/front_end/models/formatter/FormatterWorkerPool.ts +8 -6
  22. package/front_end/models/javascript_metadata/NativeFunctions.js +4 -9
  23. package/front_end/models/persistence/PersistenceImpl.ts +8 -0
  24. package/front_end/models/text_utils/TextUtils.snapshot.txt +83 -0
  25. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +0 -1
  26. package/front_end/panels/ai_assistance/components/ArtifactsViewer.ts +28 -4
  27. package/front_end/panels/ai_assistance/components/ChatView.ts +52 -169
  28. package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +27 -8
  29. package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +19 -4
  30. package/front_end/panels/application/ApplicationPanelSidebar.ts +29 -0
  31. package/front_end/panels/application/ApplicationPanelTreeElement.ts +12 -0
  32. package/front_end/panels/application/DeviceBoundSessionsModel.ts +169 -0
  33. package/front_end/panels/application/DeviceBoundSessionsTreeElement.ts +219 -0
  34. package/front_end/panels/application/DeviceBoundSessionsView.ts +1096 -0
  35. package/front_end/panels/application/ResourcesPanel.ts +19 -0
  36. package/front_end/panels/application/application.ts +6 -0
  37. package/front_end/panels/application/deviceBoundSessionsView.css +27 -0
  38. package/front_end/panels/common/AiCodeGenerationUpgradeDialog.ts +115 -0
  39. package/front_end/panels/common/aiCodeGenerationUpgradeDialog.css +79 -0
  40. package/front_end/panels/common/common.ts +1 -0
  41. package/front_end/panels/console/ConsoleInsightTeaser.ts +41 -8
  42. package/front_end/panels/console/ConsoleViewMessage.ts +20 -13
  43. package/front_end/panels/elements/ElementsTreeOutline.ts +13 -0
  44. package/front_end/panels/elements/MetricsSidebarPane.ts +3 -1
  45. package/front_end/panels/issues/AffectedSourcesView.ts +0 -1
  46. package/front_end/panels/issues/IssuesPane.ts +0 -4
  47. package/front_end/panels/network/RequestTimingView.ts +5 -20
  48. package/front_end/panels/network/networkTimingTable.css +5 -5
  49. package/front_end/panels/recorder/components/StepEditor.ts +15 -8
  50. package/front_end/panels/security/SecurityPanelSidebar.ts +0 -1
  51. package/front_end/panels/settings/AISettingsTab.ts +31 -2
  52. package/front_end/panels/sources/InplaceFormatterEditorAction.ts +8 -6
  53. package/front_end/panels/sources/UISourceCodeFrame.ts +9 -3
  54. package/front_end/panels/timeline/TimelinePanel.ts +12 -4
  55. package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +1 -1
  56. package/front_end/third_party/chromium/README.chromium +1 -1
  57. package/front_end/third_party/puppeteer/README.chromium +2 -2
  58. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +9 -2
  59. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  60. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  61. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +8 -0
  62. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  63. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js +8 -0
  64. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  65. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts +2 -1
  66. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts.map +1 -1
  67. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js +2 -2
  68. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js.map +1 -1
  69. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  70. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js +3 -1
  71. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js.map +1 -1
  72. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +1 -1
  74. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +3 -3
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.d.ts +1 -0
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.d.ts.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.js +1 -0
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.js.map +1 -1
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +1 -0
  84. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  85. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +33 -31
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.d.ts +2 -2
  89. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.d.ts.map +1 -1
  90. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js +1 -4
  91. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js.map +1 -1
  92. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +7 -1
  93. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
  94. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js +11 -1
  95. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js.map +1 -1
  96. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Cookie.d.ts +2 -2
  97. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  98. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +2 -2
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +2 -2
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +13 -4
  104. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +62 -42
  105. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +9 -2
  106. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +8 -0
  109. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js +8 -0
  111. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts +2 -1
  113. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js +2 -2
  115. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js.map +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js +3 -1
  118. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +3 -3
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.d.ts +1 -0
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.d.ts.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.js +1 -0
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.js.map +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +1 -0
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +33 -31
  134. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.d.ts +2 -2
  136. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.d.ts.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js +1 -4
  138. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts +7 -1
  140. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js +11 -1
  142. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Cookie.d.ts +2 -2
  144. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +2 -2
  145. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +2 -2
  146. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/types.d.ts +13 -4
  149. package/front_end/third_party/puppeteer/package/package.json +3 -3
  150. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +11 -3
  151. package/front_end/third_party/puppeteer/package/src/api/Page.ts +9 -0
  152. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +3 -3
  153. package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +3 -1
  154. package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -0
  155. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +3 -5
  156. package/front_end/third_party/puppeteer/package/src/bidi/core/UserContext.ts +2 -0
  157. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +1 -0
  158. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +43 -45
  159. package/front_end/third_party/puppeteer/package/src/cdp/WebWorker.ts +3 -11
  160. package/front_end/third_party/puppeteer/package/src/common/ConsoleMessage.ts +12 -0
  161. package/front_end/third_party/puppeteer/package/src/common/Cookie.ts +2 -2
  162. package/front_end/third_party/puppeteer/package/src/revisions.ts +2 -2
  163. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  164. package/front_end/third_party/source-map-scopes-codec/README.chromium +2 -5
  165. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/builder.d.ts +1 -1
  166. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/builder.d.ts.map +1 -1
  167. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/safe_builder.d.ts +1 -1
  168. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/safe_builder.d.ts.map +1 -1
  169. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/decode/decode.d.ts +1 -1
  170. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/decode/decode.d.ts.map +1 -1
  171. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/encode/encode.d.ts +1 -1
  172. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/encode/encode.d.ts.map +1 -1
  173. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/mod.d.ts +1 -1
  174. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/mod.d.ts.map +1 -1
  175. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/scopes.d.ts +130 -0
  176. package/front_end/third_party/source-map-scopes-codec/package/_dist/src/scopes.d.ts.map +1 -0
  177. package/front_end/third_party/source-map-scopes-codec/package/deno.json +1 -1
  178. package/front_end/third_party/source-map-scopes-codec/package/package.json +1 -1
  179. package/front_end/third_party/source-map-scopes-codec/package/src/builder/builder.ts +1 -1
  180. package/front_end/third_party/source-map-scopes-codec/package/src/builder/safe_builder.ts +1 -1
  181. package/front_end/third_party/source-map-scopes-codec/package/src/codec.js +4 -0
  182. package/front_end/third_party/source-map-scopes-codec/package/src/codec.js.map +1 -1
  183. package/front_end/third_party/source-map-scopes-codec/package/src/codec.ts +4 -0
  184. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +30 -13
  185. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js.map +1 -1
  186. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.ts +35 -17
  187. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encode.ts +1 -1
  188. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
  189. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js.map +1 -1
  190. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.ts +2 -2
  191. package/front_end/third_party/source-map-scopes-codec/package/src/mod.ts +1 -1
  192. package/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +7 -0
  193. package/front_end/third_party/source-map-scopes-codec/package/src/scopes.js.map +1 -0
  194. package/front_end/third_party/source-map-scopes-codec/package/src/util.ts +1 -1
  195. package/front_end/ui/legacy/components/color_picker/FormatPickerContextMenu.ts +8 -1
  196. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +4 -0
  197. package/front_end/ui/visual_logging/KnownContextValues.ts +13 -0
  198. package/mcp/mcp.ts +1 -0
  199. package/package.json +1 -2
  200. package/front_end/third_party/source-map-scopes-codec/package/src/scopes-tsconfig.json +0 -8
  201. /package/front_end/third_party/source-map-scopes-codec/package/src/{scopes.d.ts → scopes.ts} +0 -0
@@ -0,0 +1,24 @@
1
+ # Performance testing
2
+
3
+ Performance tests run in Chromium infra to measure panel loading times. The `devtools_frontend` Crossbench benchmark collects the load time for the five major panels (elements, console, network, sources, resources) against three pages: [blank](about:blank), [speedometertests](https://chromium-workloads.web.app/speedometer/v3.1/?iterationCount=1&startAutomatically&suites=TodoMVC-Angular-Complex-DOM,TodoMVC-JavaScript-ES5-Complex-DOM,TodoMVC-React-Complex-DOM), and [dailybroadcast](https://browserben.ch/speedometer/v3.1/resources/newssite/news-next/dist/index.html).
4
+
5
+ Official results can be viewed on this [Skia-perf page](https://chrome-perf.corp.goog/m?begin=1767637318&end=1768242118&shortcut=53b911343bb42697c4a8e9f750aa421d&totalGraphs=1).
6
+
7
+ ## How to run perf benchmark locally
8
+
9
+ Crossbench is available within the Chromium repository at `./tools/perf` and is kept up-to-date by running `gclient sync`. Alternatively you can clone the Crossbench [repo](sso://chromium/crossbench). The Crossbench executable is named `cb.py`.
10
+
11
+ To execute the full DevTools benchmark:
12
+ `./cb.py devtools_frontend --repeat=N`.
13
+ When --repeat argument is missing we run every scenario 2 times.
14
+
15
+ To execute the benchmark against a subset of panels and/or sites:
16
+ `./cb.py devtools_frontend --panels=elements,resources --sites=blank,dailybroadcast`
17
+
18
+ To run the benchmark against a local Chromium build, specify the path to your browser executable:
19
+ `./cb.py devtools_frontend --browser=path/to/chrome`
20
+
21
+ To run the benchmark against your local DevTools build:
22
+ `./cb.py devtools-frontend --browser=path/to/chrome -- --custom-devtools-frontend=file://$(realpath ./path/to/devtools)`
23
+
24
+ At the end of each run, Crossbench generates a report and outputs its path. Review the `devtools_frontend_load_time.json` file in the report folder and compare your numbers with the official performance runs.
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e3e3e3"><path d="M720-240q25 0 42.5-17.5T780-300q0-25-17.5-42.5T720-360q-25 0-42.5 17.5T660-300q0 25 17.5 42.5T720-240Zm0 120q30 0 56-14t43-39q-23-14-48-20.5t-51-6.5q-26 0-51 6.5T621-173q17 25 43 39t56 14ZM360-640h240v-80q0-50-35-85t-85-35q-50 0-85 35t-35 85v80ZM490-80H240q-33 0-56.5-23.5T160-160v-400q0-33 23.5-56.5T240-640h40v-80q0-83 58.5-141.5T480-920q83 0 141.5 58.5T680-720v80h40q33 0 56.5 23.5T800-560v52q-18-6-37.5-9t-42.5-3v-40H240v400h212q8 24 16 41.5T490-80Zm230 40q-83 0-141.5-58.5T520-240q0-83 58.5-141.5T720-440q83 0 141.5 58.5T920-240q0 83-58.5 141.5T720-40ZM240-560v400-400Z"/></svg>
@@ -32,13 +32,32 @@ export function decode(input: string): Uint8Array<ArrayBuffer> {
32
32
  return bytes;
33
33
  }
34
34
 
35
+ /**
36
+ * Note: if input can be very large (larger than the max string size), callers should
37
+ * expect this to throw an error.
38
+ */
35
39
  export function encode(input: BlobPart): Promise<string> {
36
40
  return new Promise((resolve, reject) => {
37
41
  const reader = new FileReader();
38
- reader.onerror = () => reject(new Error('failed to convert to base64'));
42
+ reader.onerror = () => reject(new Error('failed to convert to base64: internal error'));
39
43
  reader.onload = () => {
44
+ // The input was too large to encode as a string. The caller should anticipate
45
+ // this and use a workaround. See TimelinePanel.ts innerSaveToFile for an example.
46
+ // For more information, see crbug.com/436482118.
47
+ if (reader.result === '') {
48
+ reject(new Error('failed to convert to base64: input too large to encode as base64 string'));
49
+ return;
50
+ }
51
+
52
+ // This string can be very large, so take care to not double memory. `split`
53
+ // was used here before, which always results in new strings in V8. By using
54
+ // slice instead, we leverage the sliced string optimization in V8 and avoid
55
+ // doubling the memory requirement (even if temporarily: that is a potential
56
+ // source of OOM crashes given large enough input, such as is common with
57
+ // Performance traces).
40
58
  const blobAsUrl = reader.result as string;
41
- const [, base64] = blobAsUrl.split(',', 2);
59
+ const index = blobAsUrl.indexOf(',');
60
+ const base64 = blobAsUrl.slice(index + 1);
42
61
  resolve(base64);
43
62
  };
44
63
 
@@ -250,6 +250,13 @@ export class ResourceType {
250
250
  return regex.test(contentType) ? 'application/json' : contentType;
251
251
  }
252
252
 
253
+ /**
254
+ * Checks whether the given MIME type represents JavaScript content.
255
+ */
256
+ static isJavaScriptMimeType(mimeType: string): boolean {
257
+ return mimeType === 'application/javascript' || mimeType === 'text/javascript';
258
+ }
259
+
253
260
  /**
254
261
  * Adds suffixes iff the mimeType is 'text/javascript' to denote whether the JS is minified or from
255
262
  * a source map.
@@ -147,6 +147,9 @@ export class InspectorFrontendHostStub implements InspectorFrontendHostAPI {
147
147
  }
148
148
 
149
149
  inspectedURLChanged(url: Platform.DevToolsPath.UrlString): void {
150
+ if (!('document' in globalThis)) {
151
+ return;
152
+ }
150
153
  document.title = i18nString(UIStrings.devtoolsS, {PH1: url.replace(/^https?:\/\//, '')});
151
154
  }
152
155
 
@@ -317,6 +317,26 @@ export class UserMetrics {
317
317
  InspectorFrontendHostInstance.recordPerformanceHistogram(
318
318
  'DevTools.Insights.TeaserFirstChunkGenerationTime', timeInMilliseconds);
319
319
  }
320
+
321
+ consoleInsightTeaserAbortedAfterFirstCharacter(timeInMilliseconds: number): void {
322
+ InspectorFrontendHostInstance.recordPerformanceHistogram(
323
+ 'DevTools.Insights.TeaserAfterFirstCharacterAbortionTime', timeInMilliseconds);
324
+ }
325
+
326
+ consoleInsightTeaserAbortedBeforeFirstCharacter(timeInMilliseconds: number): void {
327
+ InspectorFrontendHostInstance.recordPerformanceHistogram(
328
+ 'DevTools.Insights.TeaserBeforeFirstCharacterAbortionTime', timeInMilliseconds);
329
+ }
330
+
331
+ consoleInsightLongTeaserGenerated(timeInMilliseconds: number): void {
332
+ InspectorFrontendHostInstance.recordPerformanceHistogram(
333
+ 'DevTools.Insights.LongTeaserGenerationTime', timeInMilliseconds);
334
+ }
335
+
336
+ consoleInsightShortTeaserGenerated(timeInMilliseconds: number): void {
337
+ InspectorFrontendHostInstance.recordPerformanceHistogram(
338
+ 'DevTools.Insights.ShortTeaserGenerationTime', timeInMilliseconds);
339
+ }
320
340
  }
321
341
 
322
342
  /**
@@ -505,6 +505,10 @@ interface DevToolsFlexibleLayout {
505
505
  verticalDrawerEnabled: boolean;
506
506
  }
507
507
 
508
+ interface DeviceBoundSessionsDebugging {
509
+ enabled: boolean;
510
+ }
511
+
508
512
  interface AiPromptApi {
509
513
  enabled: boolean;
510
514
  allowWithoutGpu: boolean;
@@ -566,6 +570,7 @@ export type HostConfig = Platform.TypeScriptUtilities.RecursivePartial<{
566
570
  devToolsGdpProfilesAvailability: GdpProfilesAvailability,
567
571
  devToolsLiveEdit: LiveEdit,
568
572
  devToolsFlexibleLayout: DevToolsFlexibleLayout,
573
+ deviceBoundSessionsDebugging: DeviceBoundSessionsDebugging,
569
574
  devToolsAiPromptApi: AiPromptApi,
570
575
  devToolsEnableDurableMessages: DevToolsEnableDurableMessages,
571
576
  devToolsAiAssistanceContextSelectionAgent: HostConfigAiAssistanceContextSelectionAgent,
@@ -44,7 +44,7 @@ import {CSSModel} from './CSSModel.js';
44
44
  import {FrameManager} from './FrameManager.js';
45
45
  import {OverlayModel} from './OverlayModel.js';
46
46
  import {RemoteObject} from './RemoteObject.js';
47
- import {ResourceTreeModel} from './ResourceTreeModel.js';
47
+ import {Events as ResourceTreeModelEvents, type ResourceTreeFrame, ResourceTreeModel} from './ResourceTreeModel.js';
48
48
  import {RuntimeModel} from './RuntimeModel.js';
49
49
  import {SDKModel} from './SDKModel.js';
50
50
  import {Capability, type Target} from './Target.js';
@@ -209,6 +209,7 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
209
209
 
210
210
  this.id = payload.nodeId;
211
211
  this.#backendNodeId = payload.backendNodeId;
212
+ this.#frameOwnerFrameId = payload.frameId || null;
212
213
  this.#domModel.registerNode(this);
213
214
  this.#nodeType = payload.nodeType;
214
215
  this.#nodeName = payload.nodeName;
@@ -217,7 +218,6 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
217
218
  this.#pseudoType = payload.pseudoType;
218
219
  this.#pseudoIdentifier = payload.pseudoIdentifier;
219
220
  this.#shadowRootType = payload.shadowRootType;
220
- this.#frameOwnerFrameId = payload.frameId || null;
221
221
  this.#xmlVersion = payload.xmlVersion;
222
222
  this.#isSVGNode = Boolean(payload.isSVG);
223
223
  this.#isScrollable = Boolean(payload.isScrollable);
@@ -1287,6 +1287,7 @@ export class AdoptedStyleSheet {
1287
1287
  export class DOMModel extends SDKModel<EventTypes> {
1288
1288
  agent: ProtocolProxyApi.DOMApi;
1289
1289
  idToDOMNode = new Map<Protocol.DOM.NodeId, DOMNode>();
1290
+ frameIdToOwnerNode = new Map<Protocol.Page.FrameId, DOMNode>();
1290
1291
  #document: DOMDocument|null = null;
1291
1292
  readonly #attributeLoadNodeIds = new Set<Protocol.DOM.NodeId>();
1292
1293
  readonly runtimeModelInternal: RuntimeModel;
@@ -1297,6 +1298,7 @@ export class DOMModel extends SDKModel<EventTypes> {
1297
1298
  #searchId?: string;
1298
1299
  #topLayerThrottler = new Common.Throttler.Throttler(100);
1299
1300
  #topLayerNodes: DOMNode[] = [];
1301
+ #resourceTreeModel: ResourceTreeModel|null = null;
1300
1302
 
1301
1303
  constructor(target: Target) {
1302
1304
  super(target);
@@ -1306,6 +1308,9 @@ export class DOMModel extends SDKModel<EventTypes> {
1306
1308
  target.registerDOMDispatcher(new DOMDispatcher(this));
1307
1309
  this.runtimeModelInternal = (target.model(RuntimeModel) as RuntimeModel);
1308
1310
 
1311
+ this.#resourceTreeModel = target.model(ResourceTreeModel);
1312
+ this.#resourceTreeModel?.addEventListener(ResourceTreeModelEvents.DocumentOpened, this.onDocumentOpened, this);
1313
+
1309
1314
  if (!target.suspended()) {
1310
1315
  void this.agent.invoke_enable({});
1311
1316
  }
@@ -1350,6 +1355,19 @@ export class DOMModel extends SDKModel<EventTypes> {
1350
1355
  }
1351
1356
  }
1352
1357
 
1358
+ private onDocumentOpened(event: Common.EventTarget.EventTargetEvent<ResourceTreeFrame>): void {
1359
+ const frame = event.data;
1360
+ const node = this.frameIdToOwnerNode.get(frame.id);
1361
+ if (node) {
1362
+ const contentDocument = node.contentDocument();
1363
+ if (contentDocument && contentDocument.documentURL !== frame.url) {
1364
+ contentDocument.documentURL = frame.url;
1365
+ contentDocument.baseURL = frame.url;
1366
+ this.dispatchEventToListeners(Events.DocumentURLChanged, contentDocument);
1367
+ }
1368
+ }
1369
+ }
1370
+
1353
1371
  requestDocument(): Promise<DOMDocument|null> {
1354
1372
  if (this.#document) {
1355
1373
  return Promise.resolve(this.#document);
@@ -1526,6 +1544,7 @@ export class DOMModel extends SDKModel<EventTypes> {
1526
1544
 
1527
1545
  private setDocument(payload: Protocol.DOM.Node|null): void {
1528
1546
  this.idToDOMNode = new Map();
1547
+ this.frameIdToOwnerNode = new Map();
1529
1548
  if (payload && 'nodeId' in payload) {
1530
1549
  this.#document = new DOMDocument(this, payload);
1531
1550
  } else {
@@ -1704,6 +1723,10 @@ export class DOMModel extends SDKModel<EventTypes> {
1704
1723
 
1705
1724
  private unbind(node: DOMNode): void {
1706
1725
  this.idToDOMNode.delete(node.id);
1726
+ const frameId = node.frameOwnerFrameId();
1727
+ if (frameId) {
1728
+ this.frameIdToOwnerNode.delete(frameId);
1729
+ }
1707
1730
  const children = node.children();
1708
1731
  for (let i = 0; children && i < children.length; ++i) {
1709
1732
  this.unbind(children[i]);
@@ -1891,6 +1914,7 @@ export class DOMModel extends SDKModel<EventTypes> {
1891
1914
  }
1892
1915
 
1893
1916
  override dispose(): void {
1917
+ this.#resourceTreeModel?.removeEventListener(ResourceTreeModelEvents.DocumentOpened, this.onDocumentOpened, this);
1894
1918
  DOMModelUndoStack.instance().dispose(this);
1895
1919
  }
1896
1920
 
@@ -1905,6 +1929,10 @@ export class DOMModel extends SDKModel<EventTypes> {
1905
1929
 
1906
1930
  registerNode(node: DOMNode): void {
1907
1931
  this.idToDOMNode.set(node.id, node);
1932
+ const frameId = node.frameOwnerFrameId();
1933
+ if (frameId) {
1934
+ this.frameIdToOwnerNode.set(frameId, node);
1935
+ }
1908
1936
  }
1909
1937
  }
1910
1938
 
@@ -1914,6 +1942,7 @@ export enum Events {
1914
1942
  AttrRemoved = 'AttrRemoved',
1915
1943
  CharacterDataModified = 'CharacterDataModified',
1916
1944
  DOMMutated = 'DOMMutated',
1945
+ DocumentURLChanged = 'DocumentURLChanged',
1917
1946
  NodeInserted = 'NodeInserted',
1918
1947
  NodeRemoved = 'NodeRemoved',
1919
1948
  DocumentUpdated = 'DocumentUpdated',
@@ -1931,6 +1960,7 @@ export interface EventTypes {
1931
1960
  [Events.AttrRemoved]: {node: DOMNode, name: string};
1932
1961
  [Events.CharacterDataModified]: DOMNode;
1933
1962
  [Events.DOMMutated]: DOMNode;
1963
+ [Events.DocumentURLChanged]: DOMDocument;
1934
1964
  [Events.NodeInserted]: DOMNode;
1935
1965
  [Events.NodeRemoved]: {node: DOMNode, parent: DOMNode};
1936
1966
  [Events.DocumentUpdated]: DOMModel;
@@ -386,6 +386,10 @@ export class NetworkManager extends SDKModel<EventTypes> {
386
386
  return await this.#networkAgent.invoke_enableReportingApi({enable});
387
387
  }
388
388
 
389
+ async enableDeviceBoundSessions(enable = true): Promise<Promise<Protocol.ProtocolResponseWithError>> {
390
+ return await this.#networkAgent.invoke_enableDeviceBoundSessions({enable});
391
+ }
392
+
389
393
  async loadNetworkResource(
390
394
  frameId: Protocol.Page.FrameId|null, url: Platform.DevToolsPath.UrlString,
391
395
  options: Protocol.Network.LoadNetworkResourceOptions): Promise<Protocol.Network.LoadNetworkResourcePageResult> {
@@ -414,6 +418,8 @@ export enum Events {
414
418
  ReportingApiReportAdded = 'ReportingApiReportAdded',
415
419
  ReportingApiReportUpdated = 'ReportingApiReportUpdated',
416
420
  ReportingApiEndpointsChangedForOrigin = 'ReportingApiEndpointsChangedForOrigin',
421
+ DeviceBoundSessionsAdded = 'DeviceBoundSessionsAdded',
422
+ DeviceBoundSessionEventOccurred = 'DeviceBoundSessionEventOccurred',
417
423
  /* eslint-enable @typescript-eslint/naming-convention */
418
424
  }
419
425
 
@@ -445,6 +451,8 @@ export interface EventTypes {
445
451
  [Events.ReportingApiReportAdded]: Protocol.Network.ReportingApiReport;
446
452
  [Events.ReportingApiReportUpdated]: Protocol.Network.ReportingApiReport;
447
453
  [Events.ReportingApiEndpointsChangedForOrigin]: Protocol.Network.ReportingApiEndpointsChangedForOriginEvent;
454
+ [Events.DeviceBoundSessionsAdded]: Protocol.Network.DeviceBoundSession[];
455
+ [Events.DeviceBoundSessionEventOccurred]: Protocol.Network.DeviceBoundSessionEventOccurredEvent;
448
456
  }
449
457
 
450
458
  /**
@@ -1555,6 +1563,11 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
1555
1563
  }
1556
1564
 
1557
1565
  deviceBoundSessionsAdded(_params: Protocol.Network.DeviceBoundSessionsAddedEvent): void {
1566
+ this.#manager.dispatchEventToListeners(Events.DeviceBoundSessionsAdded, _params.sessions);
1567
+ }
1568
+
1569
+ deviceBoundSessionEventOccurred(_params: Protocol.Network.DeviceBoundSessionEventOccurredEvent): void {
1570
+ this.#manager.dispatchEventToListeners(Events.DeviceBoundSessionEventOccurred, _params);
1558
1571
  }
1559
1572
 
1560
1573
  policyUpdated(): void {
@@ -1900,10 +1913,10 @@ export class RequestConditions extends Common.ObjectWrapper.ObjectWrapper<Reques
1900
1913
  matchedNetworkConditions.push({ruleIds, urlPattern, conditions});
1901
1914
  }
1902
1915
  }
1916
+ }
1903
1917
 
1904
- if (globalConditions) {
1905
- matchedNetworkConditions.push({conditions: globalConditions});
1906
- }
1918
+ if (globalConditions) {
1919
+ matchedNetworkConditions.push({conditions: globalConditions});
1907
1920
  }
1908
1921
 
1909
1922
  const promises: Array<Promise<unknown>> = [];
@@ -233,12 +233,15 @@ export class ResourceTreeModel extends SDKModel<EventTypes> {
233
233
  documentOpened(framePayload: Protocol.Page.Frame): void {
234
234
  this.frameNavigated(framePayload, undefined);
235
235
  const frame = this.framesInternal.get(framePayload.id);
236
- if (frame && !frame.getResourcesMap().get(framePayload.url)) {
237
- const frameResource = this.createResourceFromFramePayload(
238
- framePayload, framePayload.url as Platform.DevToolsPath.UrlString, Common.ResourceType.resourceTypes.Document,
239
- framePayload.mimeType, null, null);
240
- frameResource.isGenerated = true;
241
- frame.addResource(frameResource);
236
+ if (frame) {
237
+ this.dispatchEventToListeners(Events.DocumentOpened, frame);
238
+ if (!frame.getResourcesMap().get(framePayload.url)) {
239
+ const frameResource = this.createResourceFromFramePayload(
240
+ framePayload, framePayload.url as Platform.DevToolsPath.UrlString,
241
+ Common.ResourceType.resourceTypes.Document, framePayload.mimeType, null, null);
242
+ frameResource.isGenerated = true;
243
+ frame.addResource(frameResource);
244
+ }
242
245
  }
243
246
  }
244
247
 
@@ -582,6 +585,7 @@ export enum Events {
582
585
  FrameDetached = 'FrameDetached',
583
586
  FrameResized = 'FrameResized',
584
587
  FrameWillNavigate = 'FrameWillNavigate',
588
+ DocumentOpened = 'DocumentOpened',
585
589
  PrimaryPageChanged = 'PrimaryPageChanged',
586
590
  ResourceAdded = 'ResourceAdded',
587
591
  WillLoadCachedResources = 'WillLoadCachedResources',
@@ -604,6 +608,7 @@ export interface EventTypes {
604
608
  [Events.FrameDetached]: {frame: ResourceTreeFrame, isSwap: boolean};
605
609
  [Events.FrameResized]: void;
606
610
  [Events.FrameWillNavigate]: ResourceTreeFrame;
611
+ [Events.DocumentOpened]: ResourceTreeFrame;
607
612
  [Events.PrimaryPageChanged]: {frame: ResourceTreeFrame, type: PrimaryPageChangeType};
608
613
  [Events.ResourceAdded]: Resource;
609
614
  [Events.WillLoadCachedResources]: void;
@@ -971,7 +971,6 @@ export class MainMenuItem implements UI.Toolbar.Provider {
971
971
  const persistence = viewExtension.persistence();
972
972
  const title = viewExtension.title();
973
973
  const id = viewExtension.viewId();
974
- const promotionId = viewExtension.featurePromotionId();
975
974
 
976
975
  if (id === 'issues-pane') {
977
976
  moreTools.defaultSection().appendItem(title, () => {
@@ -988,14 +987,9 @@ export class MainMenuItem implements UI.Toolbar.Provider {
988
987
  continue;
989
988
  }
990
989
 
991
- let additionalElement = undefined;
992
- if (promotionId) {
993
- additionalElement = UI.UIUtils.maybeCreateNewBadge(promotionId);
994
- }
995
-
996
990
  moreTools.defaultSection().appendItem(title, () => {
997
991
  void UI.ViewManager.ViewManager.instance().showView(id, true, false);
998
- }, {additionalElement, isPreviewFeature: viewExtension.isPreviewFeature(), jslogContext: id});
992
+ }, {isPreviewFeature: viewExtension.isPreviewFeature(), jslogContext: id});
999
993
  }
1000
994
 
1001
995
  const helpSubMenu = contextMenu.footerSection().appendSubMenuItem(i18nString(UIStrings.help), false, 'help');
@@ -242,10 +242,6 @@ export const UIStrings = {
242
242
  * @description Warning displayed to developers. It is shown when the `XMLHttpRequest` API is used in a way that it slows down the page load of the next page. The `main thread` refers to an operating systems thread used to run most of the processing of HTML documents, so please use a consistent wording.
243
243
  */
244
244
  XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload: "Synchronous `XMLHttpRequest` on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.",
245
- /**
246
- * @description Warning displayed to developers that they are using externally loaded entities in an XML document that constitutes a part of the web page. Externally loaded entities are a technical concept of XML document processing.
247
- */
248
- XMLNoExternalEntities: "Externally loaded entities in XML parsing have been deprecated and will be removed from this browser soon.",
249
245
  /**
250
246
  * @description Warning displayed to developers that they are using either the XSLTProcessor API, or XSLT processing instructions, both of which have been deprecated and are scheduled to be removed.
251
247
  */
@@ -374,10 +370,6 @@ export const DEPRECATIONS_METADATA: Partial<Record<string, DeprecationDescriptor
374
370
  "XHRJSONEncodingDetection": {
375
371
  "milestone": 93
376
372
  },
377
- "XMLNoExternalEntities": {
378
- "chromeStatusFeature": 6734457763659776,
379
- "milestone": 144
380
- },
381
373
  "XSLT": {
382
374
  "chromeStatusFeature": 4709671889534976,
383
375
  "milestone": 143
@@ -789,6 +789,10 @@ inspectorBackend.registerEnum("Network.CrossOriginEmbedderPolicyValue", {None: "
789
789
  inspectorBackend.registerEnum("Network.ContentSecurityPolicySource", {HTTP: "HTTP", Meta: "Meta"});
790
790
  inspectorBackend.registerEnum("Network.ReportStatus", {Queued: "Queued", Pending: "Pending", MarkedForRemoval: "MarkedForRemoval", Success: "Success"});
791
791
  inspectorBackend.registerEnum("Network.DeviceBoundSessionUrlRuleRuleType", {Exclude: "Exclude", Include: "Include"});
792
+ inspectorBackend.registerEnum("Network.DeviceBoundSessionFetchResult", {Success: "Success", KeyError: "KeyError", SigningError: "SigningError", ServerRequestedTermination: "ServerRequestedTermination", InvalidSessionId: "InvalidSessionId", InvalidChallenge: "InvalidChallenge", TooManyChallenges: "TooManyChallenges", InvalidFetcherUrl: "InvalidFetcherUrl", InvalidRefreshUrl: "InvalidRefreshUrl", TransientHttpError: "TransientHttpError", ScopeOriginSameSiteMismatch: "ScopeOriginSameSiteMismatch", RefreshUrlSameSiteMismatch: "RefreshUrlSameSiteMismatch", MismatchedSessionId: "MismatchedSessionId", MissingScope: "MissingScope", NoCredentials: "NoCredentials", SubdomainRegistrationWellKnownUnavailable: "SubdomainRegistrationWellKnownUnavailable", SubdomainRegistrationUnauthorized: "SubdomainRegistrationUnauthorized", SubdomainRegistrationWellKnownMalformed: "SubdomainRegistrationWellKnownMalformed", SessionProviderWellKnownUnavailable: "SessionProviderWellKnownUnavailable", RelyingPartyWellKnownUnavailable: "RelyingPartyWellKnownUnavailable", FederatedKeyThumbprintMismatch: "FederatedKeyThumbprintMismatch", InvalidFederatedSessionUrl: "InvalidFederatedSessionUrl", InvalidFederatedKey: "InvalidFederatedKey", TooManyRelyingOriginLabels: "TooManyRelyingOriginLabels", BoundCookieSetForbidden: "BoundCookieSetForbidden", NetError: "NetError", ProxyError: "ProxyError", EmptySessionConfig: "EmptySessionConfig", InvalidCredentialsConfig: "InvalidCredentialsConfig", InvalidCredentialsType: "InvalidCredentialsType", InvalidCredentialsEmptyName: "InvalidCredentialsEmptyName", InvalidCredentialsCookie: "InvalidCredentialsCookie", PersistentHttpError: "PersistentHttpError", RegistrationAttemptedChallenge: "RegistrationAttemptedChallenge", InvalidScopeOrigin: "InvalidScopeOrigin", ScopeOriginContainsPath: "ScopeOriginContainsPath", RefreshInitiatorNotString: "RefreshInitiatorNotString", RefreshInitiatorInvalidHostPattern: "RefreshInitiatorInvalidHostPattern", InvalidScopeSpecification: "InvalidScopeSpecification", MissingScopeSpecificationType: "MissingScopeSpecificationType", EmptyScopeSpecificationDomain: "EmptyScopeSpecificationDomain", EmptyScopeSpecificationPath: "EmptyScopeSpecificationPath", InvalidScopeSpecificationType: "InvalidScopeSpecificationType", InvalidScopeIncludeSite: "InvalidScopeIncludeSite", MissingScopeIncludeSite: "MissingScopeIncludeSite", FederatedNotAuthorizedByProvider: "FederatedNotAuthorizedByProvider", FederatedNotAuthorizedByRelyingParty: "FederatedNotAuthorizedByRelyingParty", SessionProviderWellKnownMalformed: "SessionProviderWellKnownMalformed", SessionProviderWellKnownHasProviderOrigin: "SessionProviderWellKnownHasProviderOrigin", RelyingPartyWellKnownMalformed: "RelyingPartyWellKnownMalformed", RelyingPartyWellKnownHasRelyingOrigins: "RelyingPartyWellKnownHasRelyingOrigins", InvalidFederatedSessionProviderSessionMissing: "InvalidFederatedSessionProviderSessionMissing", InvalidFederatedSessionWrongProviderOrigin: "InvalidFederatedSessionWrongProviderOrigin", InvalidCredentialsCookieCreationTime: "InvalidCredentialsCookieCreationTime", InvalidCredentialsCookieName: "InvalidCredentialsCookieName", InvalidCredentialsCookieParsing: "InvalidCredentialsCookieParsing", InvalidCredentialsCookieUnpermittedAttribute: "InvalidCredentialsCookieUnpermittedAttribute", InvalidCredentialsCookieInvalidDomain: "InvalidCredentialsCookieInvalidDomain", InvalidCredentialsCookiePrefix: "InvalidCredentialsCookiePrefix", InvalidScopeRulePath: "InvalidScopeRulePath", InvalidScopeRuleHostPattern: "InvalidScopeRuleHostPattern", ScopeRuleOriginScopedHostPatternMismatch: "ScopeRuleOriginScopedHostPatternMismatch", ScopeRuleSiteScopedHostPatternMismatch: "ScopeRuleSiteScopedHostPatternMismatch", SigningQuotaExceeded: "SigningQuotaExceeded", InvalidConfigJson: "InvalidConfigJson", InvalidFederatedSessionProviderFailedToRestoreKey: "InvalidFederatedSessionProviderFailedToRestoreKey", FailedToUnwrapKey: "FailedToUnwrapKey", SessionDeletedDuringRefresh: "SessionDeletedDuringRefresh"});
793
+ inspectorBackend.registerEnum("Network.RefreshEventDetailsRefreshResult", {Refreshed: "Refreshed", InitializedService: "InitializedService", Unreachable: "Unreachable", ServerError: "ServerError", RefreshQuotaExceeded: "RefreshQuotaExceeded", FatalError: "FatalError", SigningQuotaExceeded: "SigningQuotaExceeded"});
794
+ inspectorBackend.registerEnum("Network.TerminationEventDetailsDeletionReason", {Expired: "Expired", FailedToRestoreKey: "FailedToRestoreKey", FailedToUnwrapKey: "FailedToUnwrapKey", StoragePartitionCleared: "StoragePartitionCleared", ClearBrowsingData: "ClearBrowsingData", ServerRequested: "ServerRequested", InvalidSessionParams: "InvalidSessionParams", RefreshFatalError: "RefreshFatalError"});
795
+ inspectorBackend.registerEnum("Network.ChallengeEventDetailsChallengeResult", {Success: "Success", NoSessionId: "NoSessionId", NoSessionMatch: "NoSessionMatch", CantSetBoundCookie: "CantSetBoundCookie"});
792
796
  inspectorBackend.registerEvent("Network.dataReceived", ["requestId", "timestamp", "dataLength", "encodedDataLength", "data"]);
793
797
  inspectorBackend.registerEvent("Network.eventSourceMessageReceived", ["requestId", "timestamp", "eventName", "eventId", "data"]);
794
798
  inspectorBackend.registerEvent("Network.loadingFailed", ["requestId", "timestamp", "type", "errorText", "canceled", "blockedReason", "corsErrorStatus"]);
@@ -833,6 +837,7 @@ inspectorBackend.registerEvent("Network.reportingApiReportAdded", ["report"]);
833
837
  inspectorBackend.registerEvent("Network.reportingApiReportUpdated", ["report"]);
834
838
  inspectorBackend.registerEvent("Network.reportingApiEndpointsChangedForOrigin", ["origin", "endpoints"]);
835
839
  inspectorBackend.registerEvent("Network.deviceBoundSessionsAdded", ["sessions"]);
840
+ inspectorBackend.registerEvent("Network.deviceBoundSessionEventOccurred", ["eventId", "site", "succeeded", "sessionId", "creationEventDetails", "refreshEventDetails", "terminationEventDetails", "challengeEventDetails"]);
836
841
  inspectorBackend.registerCommand("Network.setAcceptedEncodings", [{"name": "encodings", "type": "array", "optional": false, "description": "List of accepted content encodings.", "typeRef": "Network.ContentEncoding"}], [], "Sets a list of content encodings that will be accepted. Empty list means no encoding is accepted.");
837
842
  inspectorBackend.registerCommand("Network.clearAcceptedEncodingsOverride", [], [], "Clears accepted encodings set by setAcceptedEncodings");
838
843
  inspectorBackend.registerCommand("Network.canClearBrowserCache", [], ["result"], "Tells whether clearing browser cache is supported.");
@@ -852,7 +857,7 @@ inspectorBackend.registerCommand("Network.getAllCookies", [], ["cookies"], "Retu
852
857
  inspectorBackend.registerCommand("Network.getCertificate", [{"name": "origin", "type": "string", "optional": false, "description": "Origin to get certificate for.", "typeRef": null}], ["tableNames"], "Returns the DER-encoded certificate.");
853
858
  inspectorBackend.registerCommand("Network.getCookies", [{"name": "urls", "type": "array", "optional": true, "description": "The list of URLs for which applicable cookies will be fetched. If not specified, it's assumed to be set to the list containing the URLs of the page and all of its subframes.", "typeRef": "string"}], ["cookies"], "Returns all browser cookies for the current URL. Depending on the backend support, will return detailed cookie information in the `cookies` field.");
854
859
  inspectorBackend.registerCommand("Network.getResponseBody", [{"name": "requestId", "type": "string", "optional": false, "description": "Identifier of the network request to get content for.", "typeRef": "Network.RequestId"}], ["body", "base64Encoded"], "Returns content served for the given request.");
855
- inspectorBackend.registerCommand("Network.getRequestPostData", [{"name": "requestId", "type": "string", "optional": false, "description": "Identifier of the network request to get content for.", "typeRef": "Network.RequestId"}], ["postData"], "Returns post data sent with the request. Returns an error when no data was sent with the request.");
860
+ inspectorBackend.registerCommand("Network.getRequestPostData", [{"name": "requestId", "type": "string", "optional": false, "description": "Identifier of the network request to get content for.", "typeRef": "Network.RequestId"}], ["postData", "base64Encoded"], "Returns post data sent with the request. Returns an error when no data was sent with the request.");
856
861
  inspectorBackend.registerCommand("Network.getResponseBodyForInterception", [{"name": "interceptionId", "type": "string", "optional": false, "description": "Identifier for the intercepted request to get body for.", "typeRef": "Network.InterceptionId"}], ["body", "base64Encoded"], "Returns content served for the given currently intercepted request.");
857
862
  inspectorBackend.registerCommand("Network.takeResponseBodyForInterceptionAsStream", [{"name": "interceptionId", "type": "string", "optional": false, "description": "", "typeRef": "Network.InterceptionId"}], ["stream"], "Returns a handle to the stream representing the response body. Note that after this command, the intercepted request can't be continued as is -- you either need to cancel it or to provide the response body. The stream only supports sequential read, IO.read will fail if the position is specified.");
858
863
  inspectorBackend.registerCommand("Network.replayXHR", [{"name": "requestId", "type": "string", "optional": false, "description": "Identifier of XHR to replay.", "typeRef": "Network.RequestId"}], [], "This method sends a new XMLHttpRequest which is identical to the original one. The following parameters should be identical: method, url, async, request body, extra headers, withCredentials attribute, user, password.");
@@ -918,6 +923,10 @@ inspectorBackend.registerType("Network.DeviceBoundSessionCookieCraving", [{"name
918
923
  inspectorBackend.registerType("Network.DeviceBoundSessionUrlRule", [{"name": "ruleType", "type": "string", "optional": false, "description": "See comments on `net::device_bound_sessions::SessionInclusionRules::UrlRule::rule_type`.", "typeRef": null}, {"name": "hostPattern", "type": "string", "optional": false, "description": "See comments on `net::device_bound_sessions::SessionInclusionRules::UrlRule::host_pattern`.", "typeRef": null}, {"name": "pathPrefix", "type": "string", "optional": false, "description": "See comments on `net::device_bound_sessions::SessionInclusionRules::UrlRule::path_prefix`.", "typeRef": null}]);
919
924
  inspectorBackend.registerType("Network.DeviceBoundSessionInclusionRules", [{"name": "origin", "type": "string", "optional": false, "description": "See comments on `net::device_bound_sessions::SessionInclusionRules::origin_`.", "typeRef": null}, {"name": "includeSite", "type": "boolean", "optional": false, "description": "Whether the whole site is included. See comments on `net::device_bound_sessions::SessionInclusionRules::include_site_` for more details; this boolean is true if that value is populated.", "typeRef": null}, {"name": "urlRules", "type": "array", "optional": false, "description": "See comments on `net::device_bound_sessions::SessionInclusionRules::url_rules_`.", "typeRef": "Network.DeviceBoundSessionUrlRule"}]);
920
925
  inspectorBackend.registerType("Network.DeviceBoundSession", [{"name": "key", "type": "object", "optional": false, "description": "The site and session ID of the session.", "typeRef": "Network.DeviceBoundSessionKey"}, {"name": "refreshUrl", "type": "string", "optional": false, "description": "See comments on `net::device_bound_sessions::Session::refresh_url_`.", "typeRef": null}, {"name": "inclusionRules", "type": "object", "optional": false, "description": "See comments on `net::device_bound_sessions::Session::inclusion_rules_`.", "typeRef": "Network.DeviceBoundSessionInclusionRules"}, {"name": "cookieCravings", "type": "array", "optional": false, "description": "See comments on `net::device_bound_sessions::Session::cookie_cravings_`.", "typeRef": "Network.DeviceBoundSessionCookieCraving"}, {"name": "expiryDate", "type": "number", "optional": false, "description": "See comments on `net::device_bound_sessions::Session::expiry_date_`.", "typeRef": "Network.TimeSinceEpoch"}, {"name": "cachedChallenge", "type": "string", "optional": true, "description": "See comments on `net::device_bound_sessions::Session::cached_challenge__`.", "typeRef": null}, {"name": "allowedRefreshInitiators", "type": "array", "optional": false, "description": "See comments on `net::device_bound_sessions::Session::allowed_refresh_initiators_`.", "typeRef": "string"}]);
926
+ inspectorBackend.registerType("Network.CreationEventDetails", [{"name": "fetchResult", "type": "string", "optional": false, "description": "The result of the fetch attempt.", "typeRef": "Network.DeviceBoundSessionFetchResult"}, {"name": "newSession", "type": "object", "optional": true, "description": "The session if there was a newly created session. This is populated for all successful creation events.", "typeRef": "Network.DeviceBoundSession"}]);
927
+ inspectorBackend.registerType("Network.RefreshEventDetails", [{"name": "refreshResult", "type": "string", "optional": false, "description": "The result of a refresh.", "typeRef": null}, {"name": "fetchResult", "type": "string", "optional": true, "description": "If there was a fetch attempt, the result of that.", "typeRef": "Network.DeviceBoundSessionFetchResult"}, {"name": "newSession", "type": "object", "optional": true, "description": "The session display if there was a newly created session. This is populated for any refresh event that modifies the session config.", "typeRef": "Network.DeviceBoundSession"}, {"name": "wasFullyProactiveRefresh", "type": "boolean", "optional": false, "description": "See comments on `net::device_bound_sessions::RefreshEventResult::was_fully_proactive_refresh`.", "typeRef": null}]);
928
+ inspectorBackend.registerType("Network.TerminationEventDetails", [{"name": "deletionReason", "type": "string", "optional": false, "description": "The reason for a session being deleted.", "typeRef": null}]);
929
+ inspectorBackend.registerType("Network.ChallengeEventDetails", [{"name": "challengeResult", "type": "string", "optional": false, "description": "The result of a challenge.", "typeRef": null}, {"name": "challenge", "type": "string", "optional": false, "description": "The challenge set.", "typeRef": null}]);
921
930
  inspectorBackend.registerType("Network.LoadNetworkResourcePageResult", [{"name": "success", "type": "boolean", "optional": false, "description": "", "typeRef": null}, {"name": "netError", "type": "number", "optional": true, "description": "Optional values used for error reporting.", "typeRef": null}, {"name": "netErrorName", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "httpStatusCode", "type": "number", "optional": true, "description": "", "typeRef": null}, {"name": "stream", "type": "string", "optional": true, "description": "If successful, one of the following two fields holds the result.", "typeRef": "IO.StreamHandle"}, {"name": "headers", "type": "object", "optional": true, "description": "Response headers.", "typeRef": "Network.Headers"}]);
922
931
  inspectorBackend.registerType("Network.LoadNetworkResourceOptions", [{"name": "disableCache", "type": "boolean", "optional": false, "description": "", "typeRef": null}, {"name": "includeCredentials", "type": "boolean", "optional": false, "description": "", "typeRef": null}]);
923
932