chrome-devtools-frontend 1.0.1550444 → 1.0.1553956

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 (455) hide show
  1. package/docs/styleguide/ux/components.md +34 -8
  2. package/eslint.config.mjs +7 -0
  3. package/front_end/Images/generate-css-vars.js +8 -4
  4. package/front_end/core/common/Settings.ts +20 -8
  5. package/front_end/core/host/UserMetrics.ts +3 -1
  6. package/front_end/core/i18n/collect-ui-strings.js +19 -10
  7. package/front_end/core/i18n/generate-locales-js.js +4 -4
  8. package/front_end/core/protocol_client/CDPConnection.ts +1 -0
  9. package/front_end/core/protocol_client/InspectorBackend.ts +5 -1
  10. package/front_end/core/root/Runtime.ts +0 -12
  11. package/front_end/core/sdk/DOMModel.ts +38 -3
  12. package/front_end/core/sdk/DebuggerModel.ts +9 -4
  13. package/front_end/core/sdk/IsolateManager.ts +7 -0
  14. package/front_end/core/sdk/PageResourceLoader.ts +3 -3
  15. package/front_end/core/sdk/RehydratingConnection.ts +5 -2
  16. package/front_end/entrypoints/main/MainImpl.ts +28 -10
  17. package/front_end/generated/SupportedCSSProperties.js +14 -0
  18. package/front_end/models/ai_assistance/AiConversation.ts +94 -4
  19. package/front_end/models/ai_assistance/agents/AiAgent.ts +30 -15
  20. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +179 -41
  21. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +5 -0
  22. package/front_end/models/ai_assistance/agents/StylingAgent.ts +62 -0
  23. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +2 -1
  24. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +1 -7
  25. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +124 -12
  26. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +125 -30
  27. package/front_end/models/ai_assistance/performance/AICallTree.ts +42 -0
  28. package/front_end/models/ai_code_generation/AiCodeGeneration.ts +12 -0
  29. package/front_end/models/issues_manager/Issue.ts +1 -0
  30. package/front_end/models/issues_manager/IssueAggregator.ts +9 -0
  31. package/front_end/models/issues_manager/IssuesManager.ts +5 -0
  32. package/front_end/models/issues_manager/PermissionElementIssue.ts +262 -0
  33. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +7 -0
  34. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
  35. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
  36. package/front_end/models/issues_manager/descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
  37. package/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +5 -0
  38. package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +5 -0
  39. package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +5 -0
  40. package/front_end/models/issues_manager/descriptions/permissionElementGeolocationDeprecated.md +5 -0
  41. package/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
  42. package/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +5 -0
  43. package/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +5 -0
  44. package/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +5 -0
  45. package/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +5 -0
  46. package/front_end/models/issues_manager/descriptions/permissionElementLowContrast.md +5 -0
  47. package/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +5 -0
  48. package/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
  49. package/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +6 -0
  50. package/front_end/models/issues_manager/descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
  51. package/front_end/models/issues_manager/descriptions/permissionElementRegistrationFailed.md +5 -0
  52. package/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +5 -0
  53. package/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +5 -0
  54. package/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +5 -0
  55. package/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +7 -0
  56. package/front_end/models/issues_manager/issues_manager.ts +2 -0
  57. package/front_end/models/javascript_metadata/NativeFunctions.js +8 -0
  58. package/front_end/models/stack_trace/StackTraceModel.ts +37 -18
  59. package/front_end/models/trace/Processor.ts +14 -15
  60. package/front_end/models/trace/insights/Common.ts +2 -8
  61. package/front_end/models/trace/insights/types.ts +12 -2
  62. package/front_end/models/trace/types/TraceEvents.ts +4 -1
  63. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +28 -6
  64. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +9 -23
  65. package/front_end/panels/ai_assistance/ai_assistance.ts +1 -0
  66. package/front_end/panels/ai_assistance/components/ChatView.ts +78 -2
  67. package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +71 -0
  68. package/front_end/panels/ai_assistance/components/PerformanceAgentFlameChart.ts +126 -0
  69. package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +131 -2
  70. package/front_end/panels/ai_assistance/components/chatView.css +28 -0
  71. package/front_end/panels/ai_assistance/components/collapsibleAssistanceContentWidget.css +33 -0
  72. package/front_end/panels/application/AppManifestView.ts +1007 -521
  73. package/front_end/panels/application/ApplicationPanelSidebar.ts +1 -17
  74. package/front_end/panels/application/ExtensionStorageItemsView.ts +3 -5
  75. package/front_end/panels/application/KeyValueStorageItemsView.ts +3 -2
  76. package/front_end/panels/application/components/BackForwardCacheView.ts +2 -2
  77. package/front_end/panels/application/preloading/PreloadingView.ts +46 -45
  78. package/front_end/panels/application/preloading/components/MismatchedPreloadingGrid.ts +80 -75
  79. package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +169 -133
  80. package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +74 -93
  81. package/front_end/panels/application/preloading/components/RuleSetGrid.ts +142 -117
  82. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +51 -11
  83. package/front_end/panels/application/preloading/components/components.ts +0 -2
  84. package/front_end/panels/common/Annotation.ts +184 -0
  85. package/front_end/panels/common/AnnotationManager.ts +148 -11
  86. package/front_end/panels/common/ExtensionView.ts +47 -0
  87. package/front_end/panels/common/PersistenceUtils.ts +22 -25
  88. package/front_end/panels/common/annotation.css +40 -0
  89. package/front_end/panels/common/common.ts +1 -0
  90. package/front_end/panels/console/ConsoleInsightTeaser.ts +187 -5
  91. package/front_end/panels/console/ConsolePinPane.ts +437 -217
  92. package/front_end/panels/console/ConsolePrompt.ts +32 -223
  93. package/front_end/panels/console/ConsoleView.ts +67 -66
  94. package/front_end/panels/console/ConsoleViewMessage.ts +8 -3
  95. package/front_end/panels/console/consoleInsightTeaser.css +23 -0
  96. package/front_end/panels/console/consoleView.css +1 -1
  97. package/front_end/panels/elements/AdoptedStyleSheetTreeElement.ts +89 -0
  98. package/front_end/panels/elements/ColorSwatchPopoverIcon.ts +2 -2
  99. package/front_end/panels/elements/ComputedStyleWidget.ts +16 -5
  100. package/front_end/panels/elements/ElementsPanel.ts +38 -12
  101. package/front_end/panels/elements/ElementsSidebarPane.ts +1 -3
  102. package/front_end/panels/elements/ElementsTreeElement.ts +313 -353
  103. package/front_end/panels/elements/ElementsTreeOutline.ts +39 -13
  104. package/front_end/panels/elements/StylePropertyTreeElement.ts +15 -14
  105. package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
  106. package/front_end/panels/emulation/MediaQueryInspector.ts +171 -125
  107. package/front_end/panels/explain/components/ConsoleInsight.ts +175 -150
  108. package/front_end/panels/explain/components/consoleInsight.css +348 -347
  109. package/front_end/panels/issues/AffectedPermissionElementsView.ts +46 -0
  110. package/front_end/panels/issues/IssueView.ts +2 -0
  111. package/front_end/panels/issues/IssuesPane.ts +6 -0
  112. package/front_end/panels/layer_viewer/LayerDetailsView.ts +165 -149
  113. package/front_end/panels/layer_viewer/Layers3DView.ts +131 -78
  114. package/front_end/panels/lighthouse/LighthouseStatusView.ts +149 -100
  115. package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +90 -64
  116. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +25 -34
  117. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +60 -44
  118. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +170 -151
  119. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +50 -51
  120. package/front_end/panels/linear_memory_inspector/components/valueInterpreterDisplay.css +0 -13
  121. package/front_end/panels/linear_memory_inspector/components/valueInterpreterSettings.css +20 -18
  122. package/front_end/panels/mobile_throttling/CalibrationController.ts +3 -1
  123. package/front_end/panels/network/NetworkDataGridNode.ts +14 -6
  124. package/front_end/panels/network/NetworkItemView.ts +42 -3
  125. package/front_end/panels/network/NetworkLogView.ts +10 -11
  126. package/front_end/panels/network/NetworkPanel.ts +63 -1
  127. package/front_end/panels/network/RequestInitiatorView.ts +146 -113
  128. package/front_end/panels/network/components/RequestHeaderSection.css +51 -50
  129. package/front_end/panels/network/components/RequestHeaderSection.ts +81 -71
  130. package/front_end/panels/network/components/RequestHeadersView.css +1 -1
  131. package/front_end/panels/network/components/RequestHeadersView.ts +26 -11
  132. package/front_end/panels/network/components/RequestTrustTokensView.css +24 -14
  133. package/front_end/panels/network/components/RequestTrustTokensView.ts +144 -140
  134. package/front_end/panels/profiler/IsolateSelector.ts +2 -1
  135. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +49 -33
  136. package/front_end/panels/recorder/RecorderController.ts +2 -3
  137. package/front_end/panels/recorder/components/ControlButton.ts +68 -34
  138. package/front_end/panels/recorder/components/CreateRecordingView.ts +9 -6
  139. package/front_end/panels/recorder/components/RecordingView.ts +81 -88
  140. package/front_end/panels/recorder/components/ReplaySection.ts +226 -145
  141. package/front_end/panels/recorder/{controllers → components}/SelectorPicker.ts +129 -52
  142. package/front_end/panels/recorder/components/StepEditor.ts +21 -67
  143. package/front_end/panels/recorder/components/StepView.ts +222 -180
  144. package/front_end/panels/recorder/components/TimelineSection.ts +69 -48
  145. package/front_end/panels/recorder/components/components.ts +2 -2
  146. package/front_end/panels/recorder/components/selectorPicker.css +14 -0
  147. package/front_end/panels/recorder/components/stepEditor.css +0 -5
  148. package/front_end/panels/recorder/components/stepView.css +196 -198
  149. package/front_end/panels/recorder/extensions/ExtensionManager.ts +4 -48
  150. package/front_end/panels/recorder/models/ScreenshotUtils.ts +17 -11
  151. package/front_end/panels/security/CookieControlsView.ts +9 -16
  152. package/front_end/panels/settings/components/SyncSection.ts +0 -1
  153. package/front_end/panels/sources/CSSPlugin.ts +3 -3
  154. package/front_end/panels/sources/CallStackSidebarPane.ts +60 -75
  155. package/front_end/panels/sources/SourcesPanel.ts +1 -11
  156. package/front_end/panels/sources/TabbedEditorContainer.ts +11 -8
  157. package/front_end/panels/sources/ThreadsSidebarPane.ts +96 -101
  158. package/front_end/panels/sources/threadsSidebarPane.css +6 -5
  159. package/front_end/panels/timeline/InteractionsTrackAppender.ts +2 -3
  160. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +23 -33
  161. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +4 -3
  162. package/front_end/panels/timeline/TimelineFlameChartView.ts +12 -0
  163. package/front_end/panels/timeline/TimelinePanel.ts +3 -5
  164. package/front_end/panels/timeline/components/IgnoreListSetting.ts +164 -142
  165. package/front_end/panels/timeline/components/InteractionBreakdown.ts +48 -28
  166. package/front_end/panels/timeline/components/LayoutShiftDetails.ts +18 -23
  167. package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +98 -73
  168. package/front_end/panels/timeline/components/SidebarInsightsTab.ts +9 -12
  169. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +262 -291
  170. package/front_end/panels/timeline/components/Utils.ts +25 -0
  171. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +210 -146
  172. package/front_end/panels/timeline/components/insights/CLSCulprits.ts +8 -20
  173. package/front_end/panels/timeline/components/insights/Cache.ts +0 -9
  174. package/front_end/panels/timeline/components/insights/DOMSize.ts +11 -33
  175. package/front_end/panels/timeline/components/insights/DocumentLatency.ts +0 -9
  176. package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +0 -9
  177. package/front_end/panels/timeline/components/insights/EventRef.ts +47 -109
  178. package/front_end/panels/timeline/components/insights/FontDisplay.ts +0 -9
  179. package/front_end/panels/timeline/components/insights/ForcedReflow.ts +0 -9
  180. package/front_end/panels/timeline/components/insights/INPBreakdown.ts +0 -9
  181. package/front_end/panels/timeline/components/insights/ImageDelivery.ts +1 -10
  182. package/front_end/panels/timeline/components/insights/ImageRef.ts +112 -0
  183. package/front_end/panels/timeline/components/insights/InsightRenderer.ts +91 -0
  184. package/front_end/panels/timeline/components/insights/LCPBreakdown.ts +0 -9
  185. package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +4 -11
  186. package/front_end/panels/timeline/components/insights/LegacyJavaScript.ts +0 -9
  187. package/front_end/panels/timeline/components/insights/ModernHTTP.ts +0 -9
  188. package/front_end/panels/timeline/components/insights/NetworkDependencyTree.ts +6 -21
  189. package/front_end/panels/timeline/components/insights/NodeLink.ts +68 -43
  190. package/front_end/panels/timeline/components/insights/README.md +2 -3
  191. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +0 -9
  192. package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +0 -9
  193. package/front_end/panels/timeline/components/insights/ThirdParties.ts +0 -9
  194. package/front_end/panels/timeline/components/insights/Viewport.ts +7 -19
  195. package/front_end/panels/timeline/components/insights/baseInsightComponent.css +5 -0
  196. package/front_end/panels/timeline/components/insights/insights.ts +2 -0
  197. package/front_end/panels/timeline/components/interactionBreakdown.css +15 -13
  198. package/front_end/panels/timeline/enable-easter-egg.js +7 -3
  199. package/front_end/third_party/chromium/README.chromium +1 -1
  200. package/front_end/third_party/puppeteer/README.chromium +2 -2
  201. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BluetoothEmulation.d.ts +96 -0
  202. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BluetoothEmulation.d.ts.map +1 -0
  203. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BluetoothEmulation.js +8 -0
  204. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BluetoothEmulation.js.map +1 -0
  205. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +87 -0
  206. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  207. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  208. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/DeviceRequestPrompt.d.ts +2 -6
  209. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/DeviceRequestPrompt.d.ts.map +1 -1
  210. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/DeviceRequestPrompt.js +5 -24
  211. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/DeviceRequestPrompt.js.map +1 -1
  212. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +5 -0
  213. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  214. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  215. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/api.d.ts +1 -0
  216. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/api.d.ts.map +1 -1
  217. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/api.js.map +1 -1
  218. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BluetoothEmulation.d.ts +18 -0
  219. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BluetoothEmulation.d.ts.map +1 -0
  220. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BluetoothEmulation.js +42 -0
  221. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BluetoothEmulation.js.map +1 -0
  222. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts +4 -1
  223. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts.map +1 -1
  224. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js +10 -0
  225. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js.map +1 -1
  226. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/DeviceRequestPrompt.d.ts +27 -0
  227. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/DeviceRequestPrompt.d.ts.map +1 -0
  228. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/DeviceRequestPrompt.js +90 -0
  229. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/DeviceRequestPrompt.js.map +1 -0
  230. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts +3 -1
  231. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
  232. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +3 -2
  233. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
  234. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +4 -1
  235. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  236. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +5 -2
  237. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  238. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts +4 -0
  239. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  240. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +14 -2
  241. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  242. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.d.ts.map +1 -1
  243. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.js +7 -0
  244. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.js.map +1 -1
  245. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js +1 -1
  246. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js.map +1 -1
  247. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BluetoothEmulation.d.ts +18 -0
  248. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BluetoothEmulation.d.ts.map +1 -0
  249. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BluetoothEmulation.js +30 -0
  250. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BluetoothEmulation.js.map +1 -0
  251. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +5 -2
  252. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  253. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +22 -3
  254. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  255. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/CdpSession.d.ts +1 -1
  256. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/CdpSession.d.ts.map +1 -1
  257. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/DeviceRequestPrompt.d.ts +2 -3
  258. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/DeviceRequestPrompt.d.ts.map +1 -1
  259. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/DeviceRequestPrompt.js +4 -6
  260. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/DeviceRequestPrompt.js.map +1 -1
  261. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/FrameManager.d.ts +2 -2
  262. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/FrameManager.d.ts.map +1 -1
  263. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/FrameManager.js +1 -1
  264. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/FrameManager.js.map +1 -1
  265. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +2 -0
  266. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  267. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +8 -0
  268. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  269. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.d.ts.map +1 -1
  270. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js +8 -3
  271. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js.map +1 -1
  272. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/cdp.d.ts +1 -0
  273. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/cdp.d.ts.map +1 -1
  274. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/cdp.js +1 -0
  275. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/cdp.js.map +1 -1
  276. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js +30 -0
  277. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
  278. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConnectOptions.d.ts +15 -0
  279. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  280. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  281. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.d.ts +1 -1
  282. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  283. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js +2 -13
  284. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js.map +1 -1
  285. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.d.ts +5 -3
  286. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.d.ts.map +1 -1
  287. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.js +17 -0
  288. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/LaunchOptions.js.map +1 -1
  289. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  290. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  291. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  292. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  293. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  294. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  295. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +221 -4
  296. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +182 -95
  297. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BluetoothEmulation.d.ts +96 -0
  298. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BluetoothEmulation.d.ts.map +1 -0
  299. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BluetoothEmulation.js +7 -0
  300. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BluetoothEmulation.js.map +1 -0
  301. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +87 -0
  302. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  303. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  304. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/DeviceRequestPrompt.d.ts +2 -6
  305. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/DeviceRequestPrompt.d.ts.map +1 -1
  306. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/DeviceRequestPrompt.js +4 -22
  307. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/DeviceRequestPrompt.js.map +1 -1
  308. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +5 -0
  309. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  310. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  311. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/api.d.ts +1 -0
  312. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/api.d.ts.map +1 -1
  313. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/api.js.map +1 -1
  314. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BluetoothEmulation.d.ts +18 -0
  315. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BluetoothEmulation.d.ts.map +1 -0
  316. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BluetoothEmulation.js +38 -0
  317. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BluetoothEmulation.js.map +1 -0
  318. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts +4 -1
  319. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts.map +1 -1
  320. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js +10 -0
  321. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js.map +1 -1
  322. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/DeviceRequestPrompt.d.ts +27 -0
  323. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/DeviceRequestPrompt.d.ts.map +1 -0
  324. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/DeviceRequestPrompt.js +85 -0
  325. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/DeviceRequestPrompt.js.map +1 -0
  326. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts +3 -1
  327. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
  328. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +3 -2
  329. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
  330. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +4 -1
  331. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  332. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +5 -2
  333. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  334. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts +4 -0
  335. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  336. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +14 -2
  337. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  338. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.d.ts.map +1 -1
  339. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.js +7 -0
  340. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.js.map +1 -1
  341. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js +1 -1
  342. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js.map +1 -1
  343. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BluetoothEmulation.d.ts +18 -0
  344. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BluetoothEmulation.d.ts.map +1 -0
  345. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BluetoothEmulation.js +26 -0
  346. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BluetoothEmulation.js.map +1 -0
  347. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +5 -2
  348. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  349. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +22 -3
  350. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  351. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/CdpSession.d.ts +1 -1
  352. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/CdpSession.d.ts.map +1 -1
  353. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/DeviceRequestPrompt.d.ts +2 -3
  354. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/DeviceRequestPrompt.d.ts.map +1 -1
  355. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/DeviceRequestPrompt.js +2 -4
  356. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/DeviceRequestPrompt.js.map +1 -1
  357. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/FrameManager.d.ts +2 -2
  358. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/FrameManager.d.ts.map +1 -1
  359. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/FrameManager.js +2 -2
  360. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/FrameManager.js.map +1 -1
  361. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +2 -0
  362. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  363. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +8 -0
  364. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  365. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.d.ts.map +1 -1
  366. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js +8 -3
  367. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js.map +1 -1
  368. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/cdp.d.ts +1 -0
  369. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/cdp.d.ts.map +1 -1
  370. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/cdp.js +1 -0
  371. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/cdp.js.map +1 -1
  372. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js +31 -1
  373. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js.map +1 -1
  374. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConnectOptions.d.ts +15 -0
  375. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  376. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.d.ts +1 -1
  377. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  378. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js +2 -13
  379. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js.map +1 -1
  380. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.d.ts +5 -3
  381. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.d.ts.map +1 -1
  382. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.js +16 -1
  383. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/LaunchOptions.js.map +1 -1
  384. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  385. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  386. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  387. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  388. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  389. package/front_end/third_party/puppeteer/package/lib/types.d.ts +221 -4
  390. package/front_end/third_party/puppeteer/package/package.json +4 -4
  391. package/front_end/third_party/puppeteer/package/src/api/BluetoothEmulation.ts +103 -0
  392. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +96 -1
  393. package/front_end/third_party/puppeteer/package/src/api/DeviceRequestPrompt.ts +2 -10
  394. package/front_end/third_party/puppeteer/package/src/api/Page.ts +6 -0
  395. package/front_end/third_party/puppeteer/package/src/api/api.ts +1 -0
  396. package/front_end/third_party/puppeteer/package/src/bidi/BluetoothEmulation.ts +52 -0
  397. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +15 -0
  398. package/front_end/third_party/puppeteer/package/src/bidi/DeviceRequestPrompt.ts +138 -0
  399. package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +7 -3
  400. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +10 -2
  401. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +30 -2
  402. package/front_end/third_party/puppeteer/package/src/bidi/util.ts +8 -0
  403. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +1 -1
  404. package/front_end/third_party/puppeteer/package/src/cdp/BluetoothEmulation.ts +47 -0
  405. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +33 -3
  406. package/front_end/third_party/puppeteer/package/src/cdp/CdpSession.ts +1 -1
  407. package/front_end/third_party/puppeteer/package/src/cdp/DeviceRequestPrompt.ts +3 -8
  408. package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +2 -2
  409. package/front_end/third_party/puppeteer/package/src/cdp/FrameManager.ts +9 -4
  410. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +13 -0
  411. package/front_end/third_party/puppeteer/package/src/cdp/WebWorker.ts +8 -3
  412. package/front_end/third_party/puppeteer/package/src/cdp/cdp.ts +1 -0
  413. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +45 -1
  414. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +20 -0
  415. package/front_end/third_party/puppeteer/package/src/node/ChromeLauncher.ts +5 -17
  416. package/front_end/third_party/puppeteer/package/src/node/LaunchOptions.ts +23 -7
  417. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  418. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  419. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +4 -0
  420. package/front_end/ui/components/annotations/AnnotationRepository.ts +153 -13
  421. package/front_end/ui/components/snackbars/Snackbars.docs.ts +0 -1
  422. package/front_end/ui/components/text_editor/AiCodeCompletionTeaserPlaceholder.ts +12 -3
  423. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +182 -0
  424. package/front_end/ui/components/text_editor/text_editor.ts +1 -0
  425. package/front_end/ui/helpers/OpenInNewTab.ts +5 -1
  426. package/front_end/ui/i18n/i18n.ts +9 -9
  427. package/front_end/ui/kit/icons/Icon.docs.ts +22 -65
  428. package/front_end/ui/kit/kit.ts +1 -0
  429. package/front_end/ui/kit/link/Link.docs.ts +15 -0
  430. package/front_end/ui/kit/link/Link.ts +151 -0
  431. package/front_end/ui/kit/link/link.css +27 -0
  432. package/front_end/ui/legacy/EmptyWidget.ts +6 -0
  433. package/front_end/ui/legacy/Floaty.ts +442 -0
  434. package/front_end/ui/legacy/InspectorView.ts +12 -0
  435. package/front_end/ui/legacy/ReportView.ts +1 -1
  436. package/front_end/ui/legacy/SelectMenu.docs.ts +0 -1
  437. package/front_end/ui/legacy/TabbedPane.ts +131 -53
  438. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +1 -1
  439. package/front_end/ui/legacy/components/inline_editor/ColorSwatch.ts +36 -36
  440. package/front_end/ui/legacy/components/object_ui/JavaScriptREPL.ts +22 -37
  441. package/front_end/ui/legacy/components/object_ui/RemoteObjectPreviewFormatter.ts +31 -1
  442. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +2 -2
  443. package/front_end/ui/legacy/components/utils/Linkifier.ts +7 -11
  444. package/front_end/ui/legacy/floaty.css +77 -0
  445. package/front_end/ui/legacy/legacy.ts +2 -0
  446. package/front_end/ui/visual_logging/KnownContextValues.ts +6 -0
  447. package/inspector_overlay/loadCSS.rollup.js +5 -4
  448. package/package.json +2 -2
  449. package/front_end/panels/application/preloading/components/PreloadingMismatchedHeadersGrid.ts +0 -99
  450. package/front_end/panels/recorder/components/SelectButton.ts +0 -304
  451. package/front_end/panels/recorder/controllers/controllers.ts +0 -7
  452. package/front_end/ui/components/chrome_link/ChromeLink.ts +0 -76
  453. package/front_end/ui/components/chrome_link/chromeLink.css +0 -12
  454. package/front_end/ui/components/chrome_link/chrome_link.ts +0 -9
  455. /package/front_end/panels/recorder/components/{selectButton.css → replaySection.css} +0 -0
@@ -81,6 +81,7 @@ import {
81
81
  } from '../util/disposable.js';
82
82
  import {stringToTypedArray} from '../util/encoding.js';
83
83
 
84
+ import type {BluetoothEmulation} from './BluetoothEmulation.js';
84
85
  import type {Browser} from './Browser.js';
85
86
  import type {BrowserContext} from './BrowserContext.js';
86
87
  import type {CDPSession} from './CDPSession.js';
@@ -3174,6 +3175,11 @@ export abstract class Page extends EventEmitter<PageEvents> {
3174
3175
  * method is only available in Chrome.
3175
3176
  */
3176
3177
  abstract openDevTools(): Promise<Page>;
3178
+
3179
+ /**
3180
+ * {@inheritDoc BluetoothEmulation}
3181
+ */
3182
+ abstract get bluetooth(): BluetoothEmulation;
3177
3183
  }
3178
3184
 
3179
3185
  /**
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ export type * from './BluetoothEmulation.js';
7
8
  export * from './Browser.js';
8
9
  export * from './BrowserContext.js';
9
10
  export * from './CDPSession.js';
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google Inc.
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import type {
8
+ AdapterState,
9
+ BluetoothEmulation,
10
+ PreconnectedPeripheral,
11
+ } from '../api/BluetoothEmulation.js';
12
+
13
+ import type {Session} from './core/Session.js';
14
+
15
+ /**
16
+ * @internal
17
+ */
18
+ export class BidiBluetoothEmulation implements BluetoothEmulation {
19
+ readonly #session: Session;
20
+ readonly #contextId: string;
21
+
22
+ constructor(contextId: string, session: Session) {
23
+ this.#contextId = contextId;
24
+ this.#session = session;
25
+ }
26
+
27
+ async emulateAdapter(state: AdapterState, leSupported = true): Promise<void> {
28
+ await this.#session.send('bluetooth.simulateAdapter', {
29
+ context: this.#contextId,
30
+ state,
31
+ leSupported,
32
+ });
33
+ }
34
+
35
+ async disableEmulation(): Promise<void> {
36
+ await this.#session.send('bluetooth.disableSimulation', {
37
+ context: this.#contextId,
38
+ });
39
+ }
40
+
41
+ async simulatePreconnectedPeripheral(
42
+ preconnectedPeripheral: PreconnectedPeripheral,
43
+ ): Promise<void> {
44
+ await this.#session.send('bluetooth.simulatePreconnectedPeripheral', {
45
+ context: this.#contextId,
46
+ address: preconnectedPeripheral.address,
47
+ name: preconnectedPeripheral.name,
48
+ manufacturerData: preconnectedPeripheral.manufacturerData,
49
+ knownServiceUuids: preconnectedPeripheral.knownServiceUuids,
50
+ });
51
+ }
52
+ }
@@ -14,6 +14,8 @@ import {
14
14
  BrowserEvent,
15
15
  type BrowserCloseCallback,
16
16
  type BrowserContextOptions,
17
+ type ScreenInfo,
18
+ type AddScreenParams,
17
19
  type DebugInfo,
18
20
  } from '../api/Browser.js';
19
21
  import {BrowserContextEvent} from '../api/BrowserContext.js';
@@ -22,6 +24,7 @@ import type {Target} from '../api/Target.js';
22
24
  import type {Connection as CdpConnection} from '../cdp/Connection.js';
23
25
  import type {SupportedWebDriverCapabilities} from '../common/ConnectOptions.js';
24
26
  import {ProtocolError} from '../common/Errors.js';
27
+ import {UnsupportedOperation} from '../common/Errors.js';
25
28
  import {EventEmitter} from '../common/EventEmitter.js';
26
29
  import {debugError} from '../common/util.js';
27
30
  import type {Viewport} from '../common/Viewport.js';
@@ -289,6 +292,18 @@ export class BidiBrowser extends Browser {
289
292
  await this.#browserCore.uninstallExtension(id);
290
293
  }
291
294
 
295
+ override screens(): Promise<ScreenInfo[]> {
296
+ throw new UnsupportedOperation();
297
+ }
298
+
299
+ override addScreen(_params: AddScreenParams): Promise<ScreenInfo> {
300
+ throw new UnsupportedOperation();
301
+ }
302
+
303
+ override removeScreen(_screenId: string): Promise<void> {
304
+ throw new UnsupportedOperation();
305
+ }
306
+
292
307
  override targets(): Target[] {
293
308
  return [
294
309
  this.#target,
@@ -0,0 +1,138 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google Inc.
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import type * as Bidi from 'webdriver-bidi-protocol';
8
+
9
+ import {
10
+ DeviceRequestPrompt,
11
+ type DeviceRequestPromptDevice,
12
+ } from '../api/DeviceRequestPrompt.js';
13
+ import {UnsupportedOperation} from '../common/Errors.js';
14
+ import {Deferred} from '../util/Deferred.js';
15
+
16
+ import type {Session} from './core/Session.js';
17
+
18
+ /**
19
+ * @internal
20
+ */
21
+ export class BidiDeviceRequestPromptManager {
22
+ readonly #session: Session;
23
+ readonly #contextId: string;
24
+ #enabled = false;
25
+
26
+ constructor(contextId: string, session: Session) {
27
+ this.#session = session;
28
+ this.#contextId = contextId;
29
+ }
30
+
31
+ async #enableIfNeeded(): Promise<void> {
32
+ if (!this.#enabled) {
33
+ this.#enabled = true;
34
+ await this.#session.subscribe(
35
+ ['bluetooth.requestDevicePromptUpdated'],
36
+ [this.#contextId],
37
+ );
38
+ }
39
+ }
40
+
41
+ async waitForDevicePrompt(
42
+ timeout: number,
43
+ signal: AbortSignal | undefined,
44
+ ): Promise<DeviceRequestPrompt> {
45
+ const deferred = Deferred.create<DeviceRequestPrompt>({
46
+ message: `Waiting for \`DeviceRequestPrompt\` failed: ${timeout}ms exceeded`,
47
+ timeout,
48
+ });
49
+
50
+ const onRequestDevicePromptUpdated = (
51
+ params: Bidi.Bluetooth.RequestDevicePromptUpdatedParameters,
52
+ ) => {
53
+ if (params.context === this.#contextId) {
54
+ deferred.resolve(
55
+ new BidiDeviceRequestPrompt(
56
+ this.#contextId,
57
+ params.prompt,
58
+ this.#session,
59
+ params.devices,
60
+ ),
61
+ );
62
+ this.#session.off(
63
+ 'bluetooth.requestDevicePromptUpdated',
64
+ onRequestDevicePromptUpdated,
65
+ );
66
+ }
67
+ };
68
+ this.#session.on(
69
+ 'bluetooth.requestDevicePromptUpdated',
70
+ onRequestDevicePromptUpdated,
71
+ );
72
+
73
+ if (signal) {
74
+ signal.addEventListener(
75
+ 'abort',
76
+ () => {
77
+ deferred.reject(signal.reason);
78
+ },
79
+ {once: true},
80
+ );
81
+ }
82
+
83
+ await this.#enableIfNeeded();
84
+
85
+ return await deferred.valueOrThrow();
86
+ }
87
+ }
88
+
89
+ /**
90
+ * @internal
91
+ */
92
+ export class BidiDeviceRequestPrompt extends DeviceRequestPrompt {
93
+ readonly #session: Session;
94
+ #promptId: string;
95
+ #contextId: string;
96
+
97
+ constructor(
98
+ contextId: string,
99
+ promptId: string,
100
+ session: Session,
101
+ devices: Bidi.Bluetooth.RequestDeviceInfo[],
102
+ ) {
103
+ super();
104
+ this.#session = session;
105
+ this.#promptId = promptId;
106
+ this.#contextId = contextId;
107
+
108
+ this.devices.push(
109
+ ...devices.map(d => {
110
+ return {
111
+ id: d.id,
112
+ name: d.name ?? 'UNKNOWN',
113
+ };
114
+ }),
115
+ );
116
+ }
117
+
118
+ async cancel(): Promise<void> {
119
+ await this.#session.send('bluetooth.handleRequestDevicePrompt', {
120
+ context: this.#contextId,
121
+ prompt: this.#promptId,
122
+ accept: false,
123
+ });
124
+ }
125
+
126
+ async select(device: DeviceRequestPromptDevice): Promise<void> {
127
+ await this.#session.send('bluetooth.handleRequestDevicePrompt', {
128
+ context: this.#contextId,
129
+ prompt: this.#promptId,
130
+ accept: true,
131
+ device: device.id,
132
+ });
133
+ }
134
+
135
+ waitForDevice(): never {
136
+ throw new UnsupportedOperation();
137
+ }
138
+ }
@@ -21,13 +21,14 @@ import {
21
21
  switchMap,
22
22
  } from '../../third_party/rxjs/rxjs.js';
23
23
  import type {CDPSession} from '../api/CDPSession.js';
24
+ import type {DeviceRequestPrompt} from '../api/DeviceRequestPrompt.js';
24
25
  import {
25
26
  Frame,
26
27
  throwIfDetached,
27
28
  type GoToOptions,
28
29
  type WaitForOptions,
29
30
  } from '../api/Frame.js';
30
- import {PageEvent} from '../api/Page.js';
31
+ import {PageEvent, type WaitTimeoutOptions} from '../api/Page.js';
31
32
  import {Accessibility} from '../cdp/Accessibility.js';
32
33
  import type {ConsoleMessageType} from '../common/ConsoleMessage.js';
33
34
  import {
@@ -474,8 +475,11 @@ export class BidiFrame extends Frame {
474
475
  );
475
476
  }
476
477
 
477
- override waitForDevicePrompt(): never {
478
- throw new UnsupportedOperation();
478
+ override waitForDevicePrompt(
479
+ options: WaitTimeoutOptions = {},
480
+ ): Promise<DeviceRequestPrompt> {
481
+ const {timeout = this.timeoutSettings.timeout(), signal} = options;
482
+ return this.browsingContext.waitForDevicePrompt(timeout, signal);
479
483
  }
480
484
 
481
485
  override get detached(): boolean {
@@ -8,7 +8,9 @@ import type Protocol from 'devtools-protocol';
8
8
  import * as Bidi from 'webdriver-bidi-protocol';
9
9
 
10
10
  import {firstValueFrom, from, raceWith} from '../../third_party/rxjs/rxjs.js';
11
+ import type {BluetoothEmulation} from '../api/BluetoothEmulation.js';
11
12
  import type {CDPSession} from '../api/CDPSession.js';
13
+ import type {DeviceRequestPrompt} from '../api/DeviceRequestPrompt.js';
12
14
  import type {BoundingBox} from '../api/ElementHandle.js';
13
15
  import type {WaitForOptions} from '../api/Frame.js';
14
16
  import type {HTTPResponse} from '../api/HTTPResponse.js';
@@ -1010,8 +1012,14 @@ export class BidiPage extends Page {
1010
1012
  }
1011
1013
  }
1012
1014
 
1013
- override waitForDevicePrompt(): never {
1014
- throw new UnsupportedOperation();
1015
+ override async waitForDevicePrompt(
1016
+ options: WaitTimeoutOptions = {},
1017
+ ): Promise<DeviceRequestPrompt> {
1018
+ return await this.mainFrame().waitForDevicePrompt(options);
1019
+ }
1020
+
1021
+ override get bluetooth(): BluetoothEmulation {
1022
+ return this.mainFrame().browsingContext.bluetooth;
1015
1023
  }
1016
1024
  }
1017
1025
 
@@ -6,9 +6,13 @@
6
6
 
7
7
  import type * as Bidi from 'webdriver-bidi-protocol';
8
8
 
9
+ import type {BluetoothEmulation} from '../../api/BluetoothEmulation.js';
10
+ import type {DeviceRequestPrompt} from '../../api/DeviceRequestPrompt.js';
9
11
  import {EventEmitter} from '../../common/EventEmitter.js';
10
12
  import {inertIfDisposed, throwIfDisposed} from '../../util/decorators.js';
11
13
  import {DisposableStack, disposeSymbol} from '../../util/disposable.js';
14
+ import {BidiBluetoothEmulation} from '../BluetoothEmulation.js';
15
+ import {BidiDeviceRequestPromptManager} from '../DeviceRequestPrompt.js';
12
16
 
13
17
  import type {AddPreloadScriptOptions} from './Browser.js';
14
18
  import {Navigation} from './Navigation.js';
@@ -161,9 +165,11 @@ export class BrowsingContext extends EventEmitter<{
161
165
  readonly #emulationState: {
162
166
  javaScriptEnabled: boolean;
163
167
  } = {javaScriptEnabled: true};
168
+ readonly #bluetoothEmulation: BluetoothEmulation;
169
+ readonly #deviceRequestPromptManager: BidiDeviceRequestPromptManager;
164
170
 
165
171
  private constructor(
166
- context: UserContext,
172
+ userContext: UserContext,
167
173
  parent: BrowsingContext | undefined,
168
174
  id: string,
169
175
  url: string,
@@ -174,10 +180,18 @@ export class BrowsingContext extends EventEmitter<{
174
180
  this.#url = url;
175
181
  this.id = id;
176
182
  this.parent = parent;
177
- this.userContext = context;
183
+ this.userContext = userContext;
178
184
  this.originalOpener = originalOpener;
179
185
 
180
186
  this.defaultRealm = this.#createWindowRealm();
187
+ this.#bluetoothEmulation = new BidiBluetoothEmulation(
188
+ this.id,
189
+ this.#session,
190
+ );
191
+ this.#deviceRequestPromptManager = new BidiDeviceRequestPromptManager(
192
+ this.id,
193
+ this.#session,
194
+ );
181
195
  }
182
196
 
183
197
  #initialize() {
@@ -757,4 +771,18 @@ export class BrowsingContext extends EventEmitter<{
757
771
  contexts: [this.id],
758
772
  });
759
773
  }
774
+
775
+ get bluetooth(): BluetoothEmulation {
776
+ return this.#bluetoothEmulation;
777
+ }
778
+
779
+ async waitForDevicePrompt(
780
+ timeout: number,
781
+ signal?: AbortSignal,
782
+ ): Promise<DeviceRequestPrompt> {
783
+ return await this.#deviceRequestPromptManager.waitForDevicePrompt(
784
+ timeout,
785
+ signal,
786
+ );
787
+ }
760
788
  }
@@ -17,6 +17,14 @@ import {BidiDeserializer} from './Deserializer.js';
17
17
  export function createEvaluationError(
18
18
  details: Bidi.Script.ExceptionDetails,
19
19
  ): unknown {
20
+ if (details.exception.type === 'object' && !('value' in details.exception)) {
21
+ // Heuristic detecting a platform object was thrown. WebDriver BiDi serializes
22
+ // platform objects without value. If so, throw a generic error with the actual
23
+ // exception's message, as there is no way to restore the original exception's
24
+ // constructor.
25
+ return new Error(details.text);
26
+ }
27
+
20
28
  if (details.exception.type !== 'error') {
21
29
  return BidiDeserializer.deserialize(details.exception);
22
30
  }
@@ -618,7 +618,7 @@ class AXNode {
618
618
  continue;
619
619
  }
620
620
  const value = getBooleanPropertyValue(booleanProperty);
621
- if (!value) {
621
+ if (value === undefined) {
622
622
  continue;
623
623
  }
624
624
  node[booleanProperty] = getBooleanPropertyValue(booleanProperty);
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google Inc.
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type {
7
+ AdapterState,
8
+ BluetoothEmulation,
9
+ PreconnectedPeripheral,
10
+ } from '../api/BluetoothEmulation.js';
11
+
12
+ import type {Connection} from './Connection.js';
13
+
14
+ /**
15
+ * @internal
16
+ */
17
+ export class CdpBluetoothEmulation implements BluetoothEmulation {
18
+ #connection: Connection;
19
+
20
+ constructor(connection: Connection) {
21
+ this.#connection = connection;
22
+ }
23
+
24
+ async emulateAdapter(state: AdapterState, leSupported = true): Promise<void> {
25
+ // Bluetooth spec requires overriding the existing adapter (step 6). From the CDP
26
+ // perspective, it means disabling the emulation first.
27
+ // https://webbluetoothcg.github.io/web-bluetooth/#bluetooth-simulateAdapter-command
28
+ await this.#connection.send('BluetoothEmulation.disable');
29
+ await this.#connection.send('BluetoothEmulation.enable', {
30
+ state,
31
+ leSupported,
32
+ });
33
+ }
34
+
35
+ async disableEmulation(): Promise<void> {
36
+ await this.#connection.send('BluetoothEmulation.disable');
37
+ }
38
+
39
+ async simulatePreconnectedPeripheral(
40
+ preconnectedPeripheral: PreconnectedPeripheral,
41
+ ): Promise<void> {
42
+ await this.#connection.send(
43
+ 'BluetoothEmulation.simulatePreconnectedPeripheral',
44
+ preconnectedPeripheral,
45
+ );
46
+ }
47
+ }
@@ -16,6 +16,8 @@ import {
16
16
  type BrowserContextOptions,
17
17
  type IsPageTargetCallback,
18
18
  type TargetFilterCallback,
19
+ type ScreenInfo,
20
+ type AddScreenParams,
19
21
  } from '../api/Browser.js';
20
22
  import {BrowserContextEvent} from '../api/BrowserContext.js';
21
23
  import {CDPSessionEvent} from '../api/CDPSession.js';
@@ -196,7 +198,9 @@ export class CdpBrowser extends BrowserBase {
196
198
  target.type() === 'webview' ||
197
199
  (this.#handleDevToolsAsPage &&
198
200
  target.type() === 'other' &&
199
- target.url().startsWith('devtools://'))
201
+ target
202
+ .url()
203
+ .startsWith('devtools://devtools/bundled/devtools_app.html'))
200
204
  );
201
205
  });
202
206
  }
@@ -343,8 +347,8 @@ export class CdpBrowser extends BrowserBase {
343
347
  return this.#connection.url();
344
348
  }
345
349
 
346
- override async newPage(): Promise<Page> {
347
- return await this.#defaultContext.newPage();
350
+ override async newPage(options?: CreatePageOptions): Promise<Page> {
351
+ return await this.#defaultContext.newPage(options);
348
352
  }
349
353
 
350
354
  async _createPageInContext(
@@ -355,9 +359,16 @@ export class CdpBrowser extends BrowserBase {
355
359
  this.targets().filter(t => {
356
360
  return t.browserContext().id === contextId;
357
361
  }).length > 0;
362
+ const windowBounds =
363
+ options?.type === 'window' ? options.windowBounds : undefined;
358
364
  const {targetId} = await this.#connection.send('Target.createTarget', {
359
365
  url: 'about:blank',
360
366
  browserContextId: contextId || undefined,
367
+ left: windowBounds?.left,
368
+ top: windowBounds?.top,
369
+ width: windowBounds?.width,
370
+ height: windowBounds?.height,
371
+ windowState: windowBounds?.windowState,
361
372
  // Works around crbug.com/454825274.
362
373
  newWindow: hasTargets && options?.type === 'window' ? true : undefined,
363
374
  });
@@ -423,6 +434,25 @@ export class CdpBrowser extends BrowserBase {
423
434
  return this.#connection.send('Extensions.uninstall', {id});
424
435
  }
425
436
 
437
+ override async screens(): Promise<ScreenInfo[]> {
438
+ const {screenInfos} = await this.#connection.send(
439
+ 'Emulation.getScreenInfos',
440
+ );
441
+ return screenInfos;
442
+ }
443
+
444
+ override async addScreen(params: AddScreenParams): Promise<ScreenInfo> {
445
+ const {screenInfo} = await this.#connection.send(
446
+ 'Emulation.addScreen',
447
+ params,
448
+ );
449
+ return screenInfo;
450
+ }
451
+
452
+ override async removeScreen(screenId: string): Promise<void> {
453
+ return await this.#connection.send('Emulation.removeScreen', {screenId});
454
+ }
455
+
426
456
  override targets(): CdpTarget[] {
427
457
  return Array.from(
428
458
  this.#targetManager.getAvailableTargets().values(),
@@ -71,7 +71,7 @@ export class CdpCDPSession extends CDPSession {
71
71
  return this.#target;
72
72
  }
73
73
 
74
- override connection(): Connection | undefined {
74
+ override connection(): Connection {
75
75
  return this.#connection;
76
76
  }
77
77
 
@@ -8,7 +8,7 @@ import type Protocol from 'devtools-protocol';
8
8
 
9
9
  import type {CDPSession} from '../api/CDPSession.js';
10
10
  import {DeviceRequestPrompt} from '../api/DeviceRequestPrompt.js';
11
- import {DeviceRequestPromptDevice} from '../api/DeviceRequestPrompt.js';
11
+ import type {DeviceRequestPromptDevice} from '../api/DeviceRequestPrompt.js';
12
12
  import type {WaitTimeoutOptions} from '../api/Page.js';
13
13
  import type {TimeoutSettings} from '../common/TimeoutSettings.js';
14
14
  import {assert} from '../util/assert.js';
@@ -28,8 +28,6 @@ export class CdpDeviceRequestPrompt extends DeviceRequestPrompt {
28
28
  promise: Deferred<DeviceRequestPromptDevice>;
29
29
  }>();
30
30
 
31
- devices: DeviceRequestPromptDevice[] = [];
32
-
33
31
  constructor(
34
32
  client: CDPSession,
35
33
  timeoutSettings: TimeoutSettings,
@@ -65,10 +63,7 @@ export class CdpDeviceRequestPrompt extends DeviceRequestPrompt {
65
63
  continue;
66
64
  }
67
65
 
68
- const newDevice = new DeviceRequestPromptDevice(
69
- rawDevice.id,
70
- rawDevice.name,
71
- );
66
+ const newDevice = {id: rawDevice.id, name: rawDevice.name};
72
67
  this.devices.push(newDevice);
73
68
 
74
69
  for (const waitForDevicePromise of this.#waitForDevicePromises) {
@@ -156,7 +151,7 @@ export class CdpDeviceRequestPrompt extends DeviceRequestPrompt {
156
151
  /**
157
152
  * @internal
158
153
  */
159
- export class DeviceRequestPromptManager {
154
+ export class CdpDeviceRequestPromptManager {
160
155
  #client: CDPSession | null;
161
156
  #timeoutSettings: TimeoutSettings;
162
157
  #deviceRequestPromptDeferreds = new Set<Deferred<DeviceRequestPrompt>>();
@@ -22,7 +22,7 @@ import {isErrorLike} from '../util/ErrorLike.js';
22
22
  import {Accessibility} from './Accessibility.js';
23
23
  import type {Binding} from './Binding.js';
24
24
  import type {CdpPreloadScript} from './CdpPreloadScript.js';
25
- import type {DeviceRequestPromptManager} from './DeviceRequestPrompt.js';
25
+ import type {CdpDeviceRequestPromptManager} from './DeviceRequestPrompt.js';
26
26
  import type {FrameManager} from './FrameManager.js';
27
27
  import {FrameManagerEvent} from './FrameManagerEvents.js';
28
28
  import type {IsolatedWorldChart} from './IsolatedWorld.js';
@@ -315,7 +315,7 @@ export class CdpFrame extends Frame {
315
315
  return this._frameManager._frameTree.childFrames(this._id);
316
316
  }
317
317
 
318
- #deviceRequestPromptManager(): DeviceRequestPromptManager {
318
+ #deviceRequestPromptManager(): CdpDeviceRequestPromptManager {
319
319
  return this._frameManager._deviceRequestPromptManager(this.#client);
320
320
  }
321
321
 
@@ -21,7 +21,7 @@ import type {Binding} from './Binding.js';
21
21
  import {CdpPreloadScript} from './CdpPreloadScript.js';
22
22
  import type {CdpCDPSession} from './CdpSession.js';
23
23
  import {isTargetClosedError} from './Connection.js';
24
- import {DeviceRequestPromptManager} from './DeviceRequestPrompt.js';
24
+ import {CdpDeviceRequestPromptManager} from './DeviceRequestPrompt.js';
25
25
  import {ExecutionContext} from './ExecutionContext.js';
26
26
  import {CdpFrame} from './Frame.js';
27
27
  import type {FrameManagerEvents} from './FrameManagerEvents.js';
@@ -60,7 +60,7 @@ export class FrameManager extends EventEmitter<FrameManagerEvents> {
60
60
 
61
61
  #deviceRequestPromptManagerMap = new WeakMap<
62
62
  CDPSession,
63
- DeviceRequestPromptManager
63
+ CdpDeviceRequestPromptManager
64
64
  >();
65
65
 
66
66
  #frameTreeHandled?: Deferred<void>;
@@ -344,10 +344,15 @@ export class FrameManager extends EventEmitter<FrameManagerEvents> {
344
344
  void this.initialize(target._session()!, frame);
345
345
  }
346
346
 
347
- _deviceRequestPromptManager(client: CDPSession): DeviceRequestPromptManager {
347
+ _deviceRequestPromptManager(
348
+ client: CDPSession,
349
+ ): CdpDeviceRequestPromptManager {
348
350
  let manager = this.#deviceRequestPromptManagerMap.get(client);
349
351
  if (manager === undefined) {
350
- manager = new DeviceRequestPromptManager(client, this.#timeoutSettings);
352
+ manager = new CdpDeviceRequestPromptManager(
353
+ client,
354
+ this.#timeoutSettings,
355
+ );
351
356
  this.#deviceRequestPromptManagerMap.set(client, manager);
352
357
  }
353
358
  return manager;
@@ -7,6 +7,7 @@
7
7
  import type {Protocol} from 'devtools-protocol';
8
8
 
9
9
  import {firstValueFrom, from, raceWith} from '../../third_party/rxjs/rxjs.js';
10
+ import type {BluetoothEmulation} from '../api/BluetoothEmulation.js';
10
11
  import type {Browser} from '../api/Browser.js';
11
12
  import type {BrowserContext} from '../api/BrowserContext.js';
12
13
  import {CDPSessionEvent, type CDPSession} from '../api/CDPSession.js';
@@ -59,6 +60,7 @@ import {AsyncDisposableStack} from '../util/disposable.js';
59
60
  import {isErrorLike} from '../util/ErrorLike.js';
60
61
 
61
62
  import {Binding} from './Binding.js';
63
+ import {CdpBluetoothEmulation} from './BluetoothEmulation.js';
62
64
  import type {CdpBrowser} from './Browser.js';
63
65
  import {CdpCDPSession} from './CdpSession.js';
64
66
  import {isTargetClosedError} from './Connection.js';
@@ -120,6 +122,7 @@ export class CdpPage extends Page {
120
122
 
121
123
  #closed = false;
122
124
  readonly #targetManager: TargetManager;
125
+ readonly #cdpBluetoothEmulation: CdpBluetoothEmulation;
123
126
 
124
127
  #primaryTargetClient: CdpCDPSession;
125
128
  #primaryTarget: CdpTarget;
@@ -159,6 +162,12 @@ export class CdpPage extends Page {
159
162
  this.#coverage = new Coverage(client);
160
163
  this.#viewport = null;
161
164
 
165
+ // Use browser context's connection, as current Bluetooth emulation in Chromium is
166
+ // implemented on the browser context level, and not tight to the specific tab.
167
+ this.#cdpBluetoothEmulation = new CdpBluetoothEmulation(
168
+ this.#primaryTargetClient.connection(),
169
+ );
170
+
162
171
  const frameManagerEmitter = new EventEmitter(this.#frameManager);
163
172
  frameManagerEmitter.on(FrameManagerEvent.FrameAttached, frame => {
164
173
  this.emit(PageEvent.FrameAttached, frame);
@@ -1232,6 +1241,10 @@ export class CdpPage extends Page {
1232
1241
  ): Promise<DeviceRequestPrompt> {
1233
1242
  return await this.mainFrame().waitForDevicePrompt(options);
1234
1243
  }
1244
+
1245
+ override get bluetooth(): BluetoothEmulation {
1246
+ return this.#cdpBluetoothEmulation;
1247
+ }
1235
1248
  }
1236
1249
 
1237
1250
  const supportedMetrics = new Set<string>([