chrome-devtools-frontend 1.0.1690531 → 1.0.1695017

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 (304) hide show
  1. package/.agents/skills/devtools-model-management/SKILL.md +3 -3
  2. package/.agents/skills/foundation-test-migration/SKILL.md +2 -2
  3. package/.agents/skills/merging-devtools-module/SKILL.md +5 -5
  4. package/.gitmodules +0 -4
  5. package/AUTHORS +3 -0
  6. package/config/typescript/tsconfig.base.json +1 -0
  7. package/docs/get_the_code.md +4 -9
  8. package/front_end/Images/src/comment-mode-cursor.svg +23 -0
  9. package/front_end/Tests.js +1 -1
  10. package/front_end/application_tokens.css +5 -0
  11. package/front_end/core/common/ColorConverter.ts +3 -3
  12. package/front_end/core/host/UserMetrics.ts +27 -0
  13. package/front_end/core/protocol_client/DevToolsCDPConnection.ts +0 -46
  14. package/front_end/core/protocol_client/InspectorBackend.ts +6 -6
  15. package/front_end/core/sdk/CSSLocation.ts +32 -0
  16. package/front_end/core/sdk/CSSModel.ts +2 -22
  17. package/front_end/core/sdk/CSSQuery.ts +2 -1
  18. package/front_end/core/sdk/CSSRule.ts +29 -0
  19. package/front_end/core/sdk/DebuggerModel.ts +5 -1
  20. package/front_end/core/sdk/NetworkManager.ts +2 -0
  21. package/front_end/core/sdk/NetworkRequest.ts +14 -1
  22. package/front_end/core/sdk/NetworkRequestAccess.ts +41 -22
  23. package/front_end/core/sdk/ResourceTreeModel.ts +72 -23
  24. package/front_end/core/sdk/SecurityOrigin.ts +89 -29
  25. package/front_end/core/sdk/Target.ts +18 -0
  26. package/front_end/core/sdk/sdk.ts +2 -0
  27. package/front_end/entrypoints/main/MainImpl.ts +8 -1
  28. package/front_end/foundation/Universe.ts +14 -11
  29. package/front_end/generated/Deprecation.ts +8 -0
  30. package/front_end/generated/InspectorBackendCommands.ts +9 -8
  31. package/front_end/generated/SupportedCSSProperties.ts +13 -3
  32. package/front_end/generated/protocol.ts +24 -0
  33. package/front_end/models/ai_assistance/AiAgent2.ts +42 -9
  34. package/front_end/models/ai_assistance/AiConversation.ts +6 -6
  35. package/front_end/models/ai_assistance/README.md +5 -3
  36. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +1 -0
  37. package/front_end/models/ai_assistance/agents/AiAgent.ts +28 -34
  38. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +13 -17
  39. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +5 -3
  40. package/front_end/models/ai_assistance/agents/StorageAgent.ts +16 -10
  41. package/front_end/models/ai_assistance/agents/StylingAgent.ts +3 -4
  42. package/front_end/models/ai_assistance/ai_assistance.ts +0 -2
  43. package/front_end/models/ai_assistance/contexts/AccessibilityContext.ts +11 -2
  44. package/front_end/models/ai_assistance/contexts/DOMNodeContext.ts +17 -5
  45. package/front_end/models/ai_assistance/contexts/FileContext.ts +13 -6
  46. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +52 -25
  47. package/front_end/models/ai_assistance/contexts/RequestContext.ts +18 -34
  48. package/front_end/models/ai_assistance/contexts/StorageContext.ts +14 -3
  49. package/front_end/models/ai_assistance/data_formatters/FileFormatter.ts +2 -5
  50. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +135 -58
  51. package/front_end/models/ai_assistance/tools/CookieUtils.ts +25 -35
  52. package/front_end/models/ai_assistance/tools/DOMStorageUtils.ts +6 -3
  53. package/front_end/models/ai_assistance/tools/ExecuteJavaScript.ts +9 -2
  54. package/front_end/models/ai_assistance/tools/GetCookieValues.ts +1 -1
  55. package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +3 -2
  56. package/front_end/models/ai_assistance/tools/GetFunctionCode.ts +3 -5
  57. package/front_end/models/ai_assistance/tools/GetInsightDetails.ts +1 -1
  58. package/front_end/models/ai_assistance/tools/GetNetworkRequestDetails.ts +8 -11
  59. package/front_end/models/ai_assistance/tools/GetResourceContent.ts +2 -4
  60. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +6 -13
  61. package/front_end/models/ai_assistance/tools/GetStorageBreakdown.ts +1 -1
  62. package/front_end/models/ai_assistance/tools/GetStorageValues.ts +9 -9
  63. package/front_end/models/ai_assistance/tools/GetStyles.ts +3 -2
  64. package/front_end/models/ai_assistance/tools/ListCookies.ts +1 -1
  65. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +6 -14
  66. package/front_end/models/ai_assistance/tools/ListPageOrigins.ts +10 -15
  67. package/front_end/models/ai_assistance/tools/ListSources.ts +5 -7
  68. package/front_end/models/ai_assistance/tools/ListStorageKeys.ts +9 -9
  69. package/front_end/models/ai_assistance/tools/README.md +4 -2
  70. package/front_end/models/ai_assistance/tools/ResolveDevtoolsNodePath.ts +3 -2
  71. package/front_end/models/ai_assistance/tools/Tool.ts +27 -3
  72. package/front_end/models/comment_manager/CD4ABridge.ts +128 -0
  73. package/front_end/models/comment_manager/CommentManager.ts +50 -8
  74. package/front_end/models/comment_manager/comment_manager.ts +2 -0
  75. package/front_end/models/emulation/DeviceModeModel.ts +37 -47
  76. package/front_end/models/javascript_metadata/NativeFunctions.ts +9 -1
  77. package/front_end/models/live-metrics/web-vitals-injected/README.md +1 -1
  78. package/front_end/models/source_map_scopes/NamesResolver.ts +9 -7
  79. package/front_end/models/trace/ModelImpl.ts +2 -0
  80. package/front_end/models/trace/Processor.ts +6 -4
  81. package/front_end/models/trace/handlers/LayerTreeHandler.ts +3 -3
  82. package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +1 -1
  83. package/front_end/models/trace/helpers/SyntheticEvents.ts +23 -1
  84. package/front_end/models/trace/types/Configuration.ts +7 -0
  85. package/front_end/models/trace/types/TraceEvents.ts +20 -4
  86. package/front_end/panels/accessibility/ARIAAttributesView.ts +3 -0
  87. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingListView.ts +177 -0
  88. package/front_end/panels/accessibility/accessibility.ts +2 -0
  89. package/front_end/panels/accessibility/accessibilityAnnouncementRecordingListView.css +33 -0
  90. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +25 -15
  91. package/front_end/panels/ai_assistance/components/ChatMessage.ts +6 -35
  92. package/front_end/panels/ai_assistance/components/DisabledWidget.ts +4 -3
  93. package/front_end/panels/animation/AnimationTimeline.ts +1 -0
  94. package/front_end/panels/application/CrashReportContextView.ts +0 -1
  95. package/front_end/panels/application/FrameDetailsView.ts +5 -4
  96. package/front_end/panels/application/IndexedDBViews.ts +4 -4
  97. package/front_end/panels/application/indexedDBViews.css +0 -14
  98. package/front_end/panels/console/ConsoleContextSelector.ts +12 -5
  99. package/front_end/panels/console/ConsoleViewMessage.ts +12 -8
  100. package/front_end/panels/coverage/coverageView.css +8 -8
  101. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +4 -5
  102. package/front_end/panels/developer_resources/developerResourcesView.css +3 -3
  103. package/front_end/panels/elements/ElementsTreeElement.ts +39 -12
  104. package/front_end/panels/elements/ElementsTreeOutline.ts +183 -107
  105. package/front_end/panels/elements/ShortcutTreeElement.ts +4 -0
  106. package/front_end/panels/elements/StylePropertiesSection.ts +1 -34
  107. package/front_end/panels/elements/components/CSSPropertyIconResolver.ts +5 -4
  108. package/front_end/panels/elements/components/StylePropertyEditor.ts +1 -0
  109. package/front_end/panels/elements/components/computedStyleProperty.css +5 -5
  110. package/front_end/panels/elements/components/computedStyleTrace.css +5 -5
  111. package/front_end/panels/elements/components/cssHintDetailsView.css +1 -1
  112. package/front_end/panels/elements/components/cssPropertyDocsView.css +3 -3
  113. package/front_end/panels/elements/components/cssVariableValueView.css +4 -4
  114. package/front_end/panels/elements/components/elementsBreadcrumbs.css +3 -3
  115. package/front_end/panels/elements/components/elementsTreeExpandButton.css +5 -5
  116. package/front_end/panels/elements/components/queryContainer.css +2 -2
  117. package/front_end/panels/elements/elementsTreeOutline.css +20 -4
  118. package/front_end/panels/event_listeners/eventListenersView.css +1 -1
  119. package/front_end/panels/issues/AffectedElementsView.ts +3 -0
  120. package/front_end/panels/issues/issues.ts +2 -0
  121. package/front_end/panels/layer_viewer/LayerDetailsView.ts +12 -10
  122. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +1 -0
  123. package/front_end/panels/layer_viewer/Layers3DView.ts +13 -11
  124. package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +1 -1
  125. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspectorUtils.ts +2 -2
  126. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +1 -1
  127. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
  128. package/front_end/panels/linear_memory_inspector/components/linearMemoryHighlightChipList.css +11 -11
  129. package/front_end/panels/media/PlayerPropertiesView.ts +1 -1
  130. package/front_end/panels/media/TickingFlameChart.ts +3 -2
  131. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +2 -1
  132. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -1
  133. package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +2 -1
  134. package/front_end/panels/network/NetworkLogViewColumns.ts +5 -2
  135. package/front_end/panels/network/RequestHeadersView.ts +46 -10
  136. package/front_end/panels/network/components/RequestHeadersView.css +12 -0
  137. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +3 -3
  138. package/front_end/panels/profiler/HeapProfileView.ts +1 -1
  139. package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +1 -1
  140. package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
  141. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +3 -3
  142. package/front_end/panels/recorder/RecordingListView.ts +0 -6
  143. package/front_end/panels/recorder/RecordingView.ts +0 -6
  144. package/front_end/panels/recorder/controlButton.css +10 -10
  145. package/front_end/panels/recorder/startView.css +1 -1
  146. package/front_end/panels/screencast/ScreencastView.ts +4 -2
  147. package/front_end/panels/search/SearchView.ts +1 -1
  148. package/front_end/panels/security/SecurityPanel.ts +46 -35
  149. package/front_end/panels/timeline/TimelineFlameChartView.ts +0 -32
  150. package/front_end/panels/timeline/TimelinePanel.ts +0 -17
  151. package/front_end/panels/timeline/components/cwvMetrics.css +2 -2
  152. package/front_end/panels/timeline/components/insights/checklist.css +1 -1
  153. package/front_end/panels/timeline/components/insights/table.css +3 -3
  154. package/front_end/panels/timeline/overlays/components/entriesLinkOverlay.css +4 -4
  155. package/front_end/panels/timeline/overlays/components/entryLabelOverlay.css +4 -4
  156. package/front_end/panels/timeline/overlays/components/timeRangeOverlay.css +2 -2
  157. package/front_end/panels/timeline/overlays/components/timespanBreakdownOverlay.css +4 -4
  158. package/front_end/panels/timeline/timelinePanel.css +0 -74
  159. package/front_end/panels/web_audio/webAudio.css +5 -5
  160. package/front_end/third_party/chromium/README.chromium +1 -1
  161. package/front_end/third_party/csp_evaluator/package/tsconfig.json +1 -0
  162. package/front_end/third_party/diff/DiffWrapper.ts +1 -8
  163. package/front_end/third_party/puppeteer/README.chromium +2 -2
  164. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +183 -4
  165. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +708 -122
  166. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +85 -3
  167. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  168. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +84 -11
  169. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.d.ts +75 -0
  171. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.d.ts.map +1 -0
  172. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.js +102 -0
  173. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ScreenRecording.js.map +1 -0
  174. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.d.ts +1 -0
  175. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.d.ts.map +1 -1
  176. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.js +1 -0
  177. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/api.js.map +1 -1
  178. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts +6 -1
  179. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts.map +1 -1
  180. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js +7 -0
  181. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js.map +1 -1
  182. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.d.ts +31 -0
  183. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.d.ts.map +1 -0
  184. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.js +138 -0
  185. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ScreenRecording.js.map +1 -0
  186. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.d.ts +1 -0
  187. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.d.ts.map +1 -1
  188. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.js +1 -0
  189. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/bidi.js.map +1 -1
  190. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts +6 -0
  191. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  192. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js +23 -0
  193. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  194. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts +6 -1
  195. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts.map +1 -1
  196. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js +7 -0
  197. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js.map +1 -1
  198. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.d.ts +31 -0
  199. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.d.ts.map +1 -0
  200. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.js +131 -0
  201. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.js.map +1 -0
  202. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.d.ts +1 -0
  203. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.d.ts.map +1 -1
  204. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.js +1 -0
  205. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/cdp.js.map +1 -1
  206. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js +7 -4
  207. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js.map +1 -1
  208. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.d.ts +4 -1
  209. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.d.ts.map +1 -1
  210. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js +5 -1
  211. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js.map +1 -1
  212. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts +42 -0
  213. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  214. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.d.ts +2 -2
  215. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.d.ts.map +1 -1
  216. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.js +265 -1
  217. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Device.js.map +1 -1
  218. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts +4 -0
  219. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  220. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +24 -3
  221. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  222. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.d.ts +23 -2
  223. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.d.ts.map +1 -1
  224. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js +49 -3
  225. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js.map +1 -1
  226. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  227. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  228. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  229. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts.map +1 -1
  230. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  231. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js.map +1 -1
  232. package/front_end/third_party/puppeteer/package/lib/types.d.ts +183 -4
  233. package/front_end/third_party/puppeteer/package/package.json +4 -4
  234. package/front_end/third_party/puppeteer/package/src/api/Page.ts +143 -11
  235. package/front_end/third_party/puppeteer/package/src/api/ScreenRecording.ts +145 -0
  236. package/front_end/third_party/puppeteer/package/src/api/api.ts +1 -0
  237. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +11 -0
  238. package/front_end/third_party/puppeteer/package/src/bidi/ScreenRecording.ts +106 -0
  239. package/front_end/third_party/puppeteer/package/src/bidi/bidi.ts +1 -0
  240. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +41 -0
  241. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +11 -0
  242. package/front_end/third_party/puppeteer/package/src/cdp/ScreenRecording.ts +101 -0
  243. package/front_end/third_party/puppeteer/package/src/cdp/cdp.ts +1 -0
  244. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +17 -9
  245. package/front_end/third_party/puppeteer/package/src/common/BrowserWebSocketTransport.ts +4 -0
  246. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +46 -0
  247. package/front_end/third_party/puppeteer/package/src/common/Device.ts +287 -1
  248. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +30 -1
  249. package/front_end/third_party/puppeteer/package/src/node/NodeWebSocketTransport.ts +73 -2
  250. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  251. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  252. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +194 -0
  253. package/front_end/tsconfig.json +1 -2
  254. package/front_end/ui/comments/CommentAnchorResolver.ts +8 -3
  255. package/front_end/ui/comments/CommentOverlayManager.ts +53 -12
  256. package/front_end/ui/comments/CommentsOverlayWidget.ts +3 -3
  257. package/front_end/ui/comments/CommentsStatusBarPill.ts +96 -0
  258. package/front_end/ui/comments/comments-meta.ts +21 -0
  259. package/front_end/ui/comments/comments.ts +2 -0
  260. package/front_end/ui/comments/commentsOverlay.css +22 -3
  261. package/front_end/ui/components/markdown_view/MarkdownView.ts +31 -1
  262. package/front_end/ui/kit/icons/Icon.ts +0 -1
  263. package/front_end/ui/kit/link/Link.ts +8 -1
  264. package/front_end/ui/legacy/InspectorView.ts +17 -1
  265. package/front_end/ui/legacy/SplitWidget.ts +16 -2
  266. package/front_end/ui/legacy/StatusBar.ts +78 -0
  267. package/front_end/ui/legacy/Toolbar.ts +4 -0
  268. package/front_end/ui/legacy/Treeoutline.ts +78 -11
  269. package/front_end/ui/legacy/UIUtils.ts +2 -1
  270. package/front_end/ui/legacy/ViewRegistration.ts +1 -0
  271. package/front_end/ui/legacy/components/data_grid/dataGrid.css +23 -23
  272. package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.docs.ts +83 -0
  273. package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.ts +600 -0
  274. package/front_end/ui/legacy/components/inline_editor/animationNameSwatch.css +1 -1
  275. package/front_end/ui/legacy/components/inline_editor/colorMixSwatch.css +4 -4
  276. package/front_end/ui/legacy/components/inline_editor/cssAngleSwatch.css +3 -3
  277. package/front_end/ui/legacy/components/inline_editor/inline_editor.ts +2 -0
  278. package/front_end/ui/legacy/components/inline_editor/linkSwatch.css +1 -1
  279. package/front_end/ui/legacy/components/inline_editor/positionAreaEditor.css +154 -0
  280. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +113 -51
  281. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +10 -7
  282. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +16 -97
  283. package/front_end/ui/legacy/components/object_ui/customPreviewComponent.css +7 -3
  284. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +1 -1
  285. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +0 -66
  286. package/front_end/ui/legacy/components/perf_ui/perf_ui.ts +0 -2
  287. package/front_end/ui/legacy/inspectorCommon.css +30 -6
  288. package/front_end/ui/legacy/legacy.ts +2 -0
  289. package/front_end/ui/legacy/statusBar.css +18 -0
  290. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  291. package/inspector_overlay/main.ts +8 -8
  292. package/mcp/mcp.ts +5 -0
  293. package/package.json +2 -9
  294. package/front_end/Images/generate-css-vars.js +0 -52
  295. package/front_end/Images/rollup.config.mjs +0 -36
  296. package/front_end/models/ai_assistance/AiOrigins.ts +0 -107
  297. package/front_end/models/live-metrics/web-vitals-injected/rollup.config.mjs +0 -20
  298. package/front_end/panels/recorder/injected/rollup.config.mjs +0 -20
  299. package/front_end/panels/timeline/EasterEgg.d.ts +0 -6
  300. package/front_end/panels/timeline/easter-egg-tsconfig.json +0 -8
  301. package/front_end/panels/timeline/enable-easter-egg.js +0 -20
  302. package/front_end/third_party/puppeteer-replay/puppeteer-replay-tsconfig.json +0 -8
  303. package/front_end/ui/legacy/components/perf_ui/BrickBreaker.ts +0 -606
  304. package/inspector_overlay/loadCSS.rollup.js +0 -29
@@ -2,9 +2,8 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
- import * as Common from '../../../core/common/common.js';
6
5
  import type * as Platform from '../../../core/platform/platform.js';
7
- import type * as SDK from '../../../core/sdk/sdk.js';
6
+ import * as SDK from '../../../core/sdk/sdk.js';
8
7
  import * as TextUtils from '../../../core/text_utils/text_utils.js';
9
8
  import * as Protocol from '../../../generated/protocol.js';
10
9
  import * as Logs from '../../logs/logs.js';
@@ -16,7 +15,10 @@ const MAX_HEADERS_SIZE = 1000;
16
15
  const MAX_BODY_SIZE = 10000;
17
16
 
18
17
  /**
19
- * Sanitizes the set of headers, removing values that are not on the allow-list and replacing them with '<redacted>'.
18
+ * Sanitizes headers by replacing unapproved header values with '<redacted>'.
19
+ *
20
+ * @param headers List of header name/value pairs to sanitize.
21
+ * @returns Sanitized list of headers with unapproved values redacted.
20
22
  */
21
23
  export function sanitizeHeaders(headers: Array<{name: string, value: string}>): Array<{name: string, value: string}> {
22
24
  return headers.map(header => {
@@ -27,9 +29,60 @@ export function sanitizeHeaders(headers: Array<{name: string, value: string}>):
27
29
  });
28
30
  }
29
31
 
32
+ /**
33
+ * Options for configuring {@link NetworkRequestFormatter}.
34
+ */
35
+ export interface NetworkRequestFormatterOptions {
36
+ /**
37
+ * The security origin used to evaluate Same-Origin Policy (SOP) and Cross-Origin
38
+ * Resource Sharing (CORS) access.
39
+ *
40
+ * This is required because evaluating access solely against `request.initiatorSecurityOrigin()`
41
+ * is unsafe in cross-origin embedded contexts.
42
+ *
43
+ * Example:
44
+ * When debugging a page at `https://example.com` (the active conversation origin), an embedded
45
+ * `<iframe>` at `https://third-party.com` may fetch `https://third-party.com/api/user.json`.
46
+ * Relative to the iframe, that request is same-origin (`request.initiatorSecurityOrigin() === https://third-party.com`).
47
+ * However, from the perspective of the top-level conversation (`https://example.com`), that request
48
+ * is cross-origin. Its response body and unexposed headers must be redacted to prevent leaking
49
+ * unauthorized data into the prompt.
50
+ */
51
+ accessingSecurityOrigin: SDK.SecurityOrigin.SecurityOrigin;
52
+ /** Optional network log instance for resolving initiator graphs. */
53
+ networkLog?: Logs.NetworkLog.NetworkLog;
54
+ }
55
+
30
56
  export class NetworkRequestFormatter {
31
57
  #calculator: NetworkTimeCalculator.NetworkTransferTimeCalculator;
32
58
  #request: SDK.NetworkRequest.NetworkRequest;
59
+ readonly #networkLog?: Logs.NetworkLog.NetworkLog;
60
+ readonly #accessingSecurityOrigin: SDK.SecurityOrigin.SecurityOrigin;
61
+
62
+ /**
63
+ * @param request The network request to format.
64
+ * @param calculator Calculator for request timing metrics.
65
+ * @param options Configuration options specifying the accessing security origin.
66
+ */
67
+ constructor(
68
+ request: SDK.NetworkRequest.NetworkRequest,
69
+ calculator: NetworkTimeCalculator.NetworkTransferTimeCalculator,
70
+ options: NetworkRequestFormatterOptions,
71
+ ) {
72
+ this.#request = request;
73
+ this.#calculator = calculator;
74
+ this.#networkLog = options.networkLog;
75
+ this.#accessingSecurityOrigin = options.accessingSecurityOrigin;
76
+ }
77
+
78
+ /**
79
+ * Evaluates the response access mode for this network request relative to the accessing security origin.
80
+ *
81
+ * @returns The evaluated `ResponseAccessMode`.
82
+ */
83
+ responseAccessMode(): SDK.NetworkRequestAccess.ResponseAccessMode {
84
+ return SDK.NetworkRequestAccess.evaluateResponseAccessMode(this.#request, this.#accessingSecurityOrigin);
85
+ }
33
86
 
34
87
  static allowHeader(headerName: string): boolean {
35
88
  return allowedHeaders.has(headerName.toLowerCase().trim());
@@ -73,9 +126,9 @@ export class NetworkRequestFormatter {
73
126
  initiatorUrl: Platform.DevToolsPath.UrlString,
74
127
  allowedOrigin: Platform.DevToolsPath.UrlString,
75
128
  ): string {
76
- // We extract the origin, and if it is invalid/empty we default to redacting.
77
- const initiatorOrigin = Common.ParsedURL.ParsedURL.extractOrigin(initiatorUrl);
78
- if (initiatorOrigin && initiatorOrigin === allowedOrigin) {
129
+ const initiatorOrigin = SDK.SecurityOrigin.SecurityOrigin.create(initiatorUrl);
130
+ const targetOrigin = SDK.SecurityOrigin.SecurityOrigin.create(allowedOrigin);
131
+ if (initiatorOrigin.isSameOriginWith(targetOrigin)) {
79
132
  return initiatorUrl;
80
133
  }
81
134
  return '<redacted cross-origin initiator URL>';
@@ -131,28 +184,35 @@ export class NetworkRequestFormatter {
131
184
  return lines.length > 0 ? `${lines.join('\n')}\n` : '';
132
185
  }
133
186
 
134
- readonly #networkLog: Logs.NetworkLog.NetworkLog;
135
-
136
- constructor(
137
- request: SDK.NetworkRequest.NetworkRequest,
138
- calculator: NetworkTimeCalculator.NetworkTransferTimeCalculator,
139
- // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
140
- networkLog: Logs.NetworkLog.NetworkLog = Logs.NetworkLog.NetworkLog.instance(),
141
- ) {
142
- this.#request = request;
143
- this.#calculator = calculator;
144
- this.#networkLog = networkLog;
145
- }
146
-
147
187
  formatRequestHeaders(): string {
148
188
  return NetworkRequestFormatter.formatHeaders('Request headers:', this.#request.requestHeaders());
149
189
  }
150
190
 
191
+ /**
192
+ * Formats response headers for the AI prompt.
193
+ *
194
+ * Headers are filtered based on the request's evaluated ResponseAccessMode:
195
+ * - Opaque cross-origin requests only include CORS-safelisted response headers.
196
+ * - CORS-authorized requests include CORS-safelisted and Access-Control-Expose-Headers.
197
+ * - Same-origin requests include all response headers.
198
+ * Values of headers not present on the global allowedHeaders list are then redacted.
199
+ */
151
200
  formatResponseHeaders(): string {
152
- return NetworkRequestFormatter.formatHeaders('Response headers:', this.#request.responseHeaders);
201
+ const accessMode = this.responseAccessMode();
202
+ const headers = SDK.NetworkRequestAccess.getFilterableResponseHeaders(this.#request, accessMode);
203
+ return NetworkRequestFormatter.formatHeaders('Response headers:', headers);
153
204
  }
154
205
 
206
+ /**
207
+ * Formats the response body for the AI prompt.
208
+ *
209
+ * For opaque cross-origin requests, the response body is redacted because the accessing
210
+ * security origin is forbidden by the Same-Origin Policy from reading it.
211
+ */
155
212
  async formatResponseBody(): Promise<string> {
213
+ if (this.responseAccessMode() === SDK.NetworkRequestAccess.ResponseAccessMode.OPAQUE_CROSS_ORIGIN) {
214
+ return SDK.NetworkRequestAccess.REDACTED_RESPONSE_BODY;
215
+ }
156
216
  return await NetworkRequestFormatter.formatBody('Response body:', this.#request, MAX_BODY_SIZE);
157
217
  }
158
218
 
@@ -203,22 +263,9 @@ Request initiator chain:\n${this.formatRequestInitiatorChain()}`;
203
263
  * the request's origin.
204
264
  */
205
265
  formatRequestInitiatorChain(): string {
206
- const allowedOrigin = Common.ParsedURL.ParsedURL.extractOrigin(this.#request.url());
207
- let initiatorChain = '';
208
- let lineStart = '- URL: ';
209
- const graph = this.#networkLog.initiatorGraphForRequest(this.#request);
210
-
211
- for (const initiator of Array.from(graph.initiators).reverse()) {
212
- initiatorChain = initiatorChain + lineStart +
213
- NetworkRequestFormatter.formatInitiatorUrl(initiator.url(), allowedOrigin) + '\n';
214
- lineStart = '\t' + lineStart;
215
- if (initiator === this.#request) {
216
- initiatorChain =
217
- this.#formatRequestInitiated(graph.initiated, this.#request, initiatorChain, lineStart, allowedOrigin);
218
- }
219
- }
220
-
221
- return initiatorChain.trim();
266
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
267
+ const networkLog = this.#networkLog ?? Logs.NetworkLog.NetworkLog.instance();
268
+ return formatRequestInitiatorChain(this.#request, networkLog);
222
269
  }
223
270
 
224
271
  formatNetworkRequestTiming(): string {
@@ -269,32 +316,62 @@ Request initiator chain:\n${this.formatRequestInitiatorChain()}`;
269
316
 
270
317
  return labels.filter(label => !!label.value).map(label => `${label.label}: ${label.value}`).join('\n');
271
318
  }
319
+ }
272
320
 
273
- #formatRequestInitiated(
274
- initiated: Map<SDK.NetworkRequest.NetworkRequest, SDK.NetworkRequest.NetworkRequest>,
275
- parentRequest: SDK.NetworkRequest.NetworkRequest,
276
- initiatorChain: string,
277
- lineStart: string,
278
- allowedOrigin: Platform.DevToolsPath.UrlString,
279
- ): string {
280
- const visited = new Set<SDK.NetworkRequest.NetworkRequest>();
281
-
282
- // this.request should be already in the tree when build initiator part
283
- visited.add(this.#request);
284
- for (const [keyRequest, initiatedRequest] of initiated.entries()) {
285
- if (initiatedRequest === parentRequest) {
286
- if (!visited.has(keyRequest)) {
287
- visited.add(keyRequest);
288
- initiatorChain = initiatorChain + lineStart +
289
- NetworkRequestFormatter.formatInitiatorUrl(keyRequest.url(), allowedOrigin) + '\n';
290
- initiatorChain =
291
- this.#formatRequestInitiated(initiated, keyRequest, initiatorChain, '\t' + lineStart, allowedOrigin);
292
- }
293
- }
321
+ /**
322
+ * Formats the initiator chain for a given network request into a formatted string.
323
+ *
324
+ * @param request The network request to format the initiator chain for.
325
+ * @param networkLog Network log instance used to build the initiator graph.
326
+ * @returns Formatted initiator chain.
327
+ */
328
+ export function formatRequestInitiatorChain(
329
+ request: SDK.NetworkRequest.NetworkRequest,
330
+ networkLog: Logs.NetworkLog.NetworkLog,
331
+ ): string {
332
+ const allowedOrigin = request.url();
333
+ let initiatorChain = '';
334
+ let lineStart = '- URL: ';
335
+ const graph = networkLog.initiatorGraphForRequest(request);
336
+
337
+ for (const initiator of Array.from(graph.initiators).reverse()) {
338
+ initiatorChain =
339
+ initiatorChain + lineStart + NetworkRequestFormatter.formatInitiatorUrl(initiator.url(), allowedOrigin) + '\n';
340
+ lineStart = '\t' + lineStart;
341
+ if (initiator === request) {
342
+ initiatorChain =
343
+ formatRequestInitiated(graph.initiated, request, request, initiatorChain, lineStart, allowedOrigin);
294
344
  }
345
+ }
295
346
 
296
- return initiatorChain;
347
+ return initiatorChain.trim();
348
+ }
349
+
350
+ function formatRequestInitiated(
351
+ initiated: Map<SDK.NetworkRequest.NetworkRequest, SDK.NetworkRequest.NetworkRequest>,
352
+ rootRequest: SDK.NetworkRequest.NetworkRequest,
353
+ parentRequest: SDK.NetworkRequest.NetworkRequest,
354
+ initiatorChain: string,
355
+ lineStart: string,
356
+ allowedOrigin: Platform.DevToolsPath.UrlString,
357
+ ): string {
358
+ const visited = new Set<SDK.NetworkRequest.NetworkRequest>();
359
+
360
+ // rootRequest should be already in the tree when building initiator part
361
+ visited.add(rootRequest);
362
+ for (const [keyRequest, initiatedRequest] of initiated.entries()) {
363
+ if (initiatedRequest === parentRequest) {
364
+ if (!visited.has(keyRequest)) {
365
+ visited.add(keyRequest);
366
+ initiatorChain = initiatorChain + lineStart +
367
+ NetworkRequestFormatter.formatInitiatorUrl(keyRequest.url(), allowedOrigin) + '\n';
368
+ initiatorChain =
369
+ formatRequestInitiated(initiated, rootRequest, keyRequest, initiatorChain, '\t' + lineStart, allowedOrigin);
370
+ }
371
+ }
297
372
  }
373
+
374
+ return initiatorChain;
298
375
  }
299
376
 
300
377
  // Header names that could be included in the prompt, lowercase.
@@ -2,10 +2,8 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
- import * as Common from '../../../core/common/common.js';
6
5
  import * as SDK from '../../../core/sdk/sdk.js';
7
6
  import type * as Protocol from '../../../generated/protocol.js';
8
- import {areOriginsEquivalent, extractContextOrigin, isOpaqueOrigin} from '../AiOrigins.js';
9
7
 
10
8
  import {MAX_TARGET_ORIGINS} from './DOMStorageUtils.js';
11
9
  import type {OriginLockCapability} from './Tool.js';
@@ -27,8 +25,16 @@ export interface CookieDetails {
27
25
  }
28
26
 
29
27
  /**
30
- * Resolves and validates target origins against origin-lock constraints and primary page target.
31
- * If `requestedOrigins` is omitted or empty, defaults to the established context origin.
28
+ * Resolves and validates target origins against the established context origin and primary page target.
29
+ *
30
+ * When `requestedOrigins` is empty or omitted, defaults to the established context origin.
31
+ * Rejects opaque origins, mismatches with the primary page origin, and cross-origin targets.
32
+ * Limits results to at most `MAX_TARGET_ORIGINS` unique origins.
33
+ *
34
+ * @param requestedOrigins Optional list of origin URLs to validate.
35
+ * @param context The origin lock capability containing the established origin.
36
+ * @param targetManager The target manager used to resolve the primary page target.
37
+ * @returns An object with validated target origins and the primary page target, or an error object.
32
38
  */
33
39
  export function resolveAllowedTargetOrigins(
34
40
  requestedOrigins: string[]|undefined,
@@ -38,8 +44,8 @@ export function resolveAllowedTargetOrigins(
38
44
  error: string,
39
45
  }
40
46
  {
41
- const allowedOrigin = context.getEstablishedOrigin();
42
- if (!allowedOrigin || isOpaqueOrigin(allowedOrigin) || isOpaqueOrigin(extractContextOrigin(allowedOrigin))) {
47
+ const establishedOrigin = context.getEstablishedOrigin();
48
+ if (!establishedOrigin || establishedOrigin.isOpaque()) {
43
49
  return {error: 'No origin available or not allowed.'};
44
50
  }
45
51
 
@@ -48,15 +54,19 @@ export function resolveAllowedTargetOrigins(
48
54
  return {error: 'Primary page target not found.'};
49
55
  }
50
56
 
51
- const pageOrigin = Common.ParsedURL.ParsedURL.extractOrigin(primaryPageTarget.inspectedURL());
52
- if (!pageOrigin || !areOriginsEquivalent(pageOrigin, allowedOrigin)) {
57
+ const pageOrigin = primaryPageTarget.inspectedSecurityOrigin();
58
+ if (!pageOrigin.isSameOriginWith(establishedOrigin)) {
53
59
  return {error: 'Page origin does not match allowed origin.'};
54
60
  }
55
61
 
56
- const rawOrigins =
57
- (Array.isArray(requestedOrigins) && requestedOrigins.length > 0) ? requestedOrigins : [allowedOrigin];
58
- const validOrigins = rawOrigins.map(origin => extractContextOrigin(origin))
59
- .filter(origin => areOriginsEquivalent(origin, allowedOrigin));
62
+ const candidateOrigins: SDK.SecurityOrigin.SecurityOrigin[] =
63
+ (Array.isArray(requestedOrigins) && requestedOrigins.length > 0) ?
64
+ requestedOrigins.map(origin => SDK.SecurityOrigin.SecurityOrigin.create(origin)) :
65
+ [establishedOrigin];
66
+
67
+ const validOrigins =
68
+ candidateOrigins.filter(origin => origin.isSameOriginWith(establishedOrigin)).map(origin => origin.siteId());
69
+
60
70
  const targetOrigins = Array.from(new Set(validOrigins)).slice(0, MAX_TARGET_ORIGINS);
61
71
  if (targetOrigins.length === 0) {
62
72
  return {error: 'No valid origins found.'};
@@ -72,36 +82,16 @@ export type GetCookiesForOriginResult = {
72
82
  };
73
83
 
74
84
  /**
75
- * Finds the resource tree frame matching the target origin within the primary page's outermost target tree.
76
- */
77
- export function findFrameForOrigin(
78
- origin: string,
79
- targetManager: SDK.TargetManager.TargetManager,
80
- primaryPageTarget: SDK.Target.Target,
81
- ): SDK.ResourceTreeModel.ResourceTreeFrame|null {
82
- const targetOrigin = extractContextOrigin(origin);
83
- for (const frame of SDK.ResourceTreeModel.ResourceTreeModel.frames(targetManager)) {
84
- if (frame.resourceTreeModel().target().outermostTarget() !== primaryPageTarget) {
85
- continue;
86
- }
87
- if (frame.securityOrigin && areOriginsEquivalent(frame.securityOrigin, targetOrigin)) {
88
- return frame;
89
- }
90
- }
91
- return null;
92
- }
93
-
94
- /**
95
- * Retrieves all cookies accessible to the target origin, strictly excluding HttpOnly cookies.
85
+ * Retrieves all cookies accessible to the target origin, excluding HttpOnly cookies.
96
86
  * Locates the matching frame within the primary page target tree, queries its CookieModel,
97
87
  * and filters cookies by security origin.
98
88
  */
99
89
  export async function getCookiesForOrigin(
100
90
  origin: string,
101
- targetManager: SDK.TargetManager.TargetManager,
102
91
  primaryPageTarget: SDK.Target.Target,
103
92
  ): Promise<GetCookiesForOriginResult> {
104
- const frame = findFrameForOrigin(origin, targetManager, primaryPageTarget);
93
+ const targetOrigin = SDK.SecurityOrigin.SecurityOrigin.create(origin);
94
+ const frame = SDK.ResourceTreeModel.ResourceTreeModel.frameForOrigin(primaryPageTarget, targetOrigin);
105
95
  if (!frame) {
106
96
  return {error: `Frame not found or origin disallowed for ${origin}`};
107
97
  }
@@ -3,7 +3,6 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import * as SDK from '../../../core/sdk/sdk.js';
6
- import {areOriginsEquivalent, extractContextOrigin} from '../AiOrigins.js';
7
6
 
8
7
  /**
9
8
  * Maximum number of target origins allowed in a single batch query to bound
@@ -42,7 +41,10 @@ export function resolveDOMStorages(
42
41
  const resolvedStorages: SDK.DOMStorageModel.DOMStorage[] = [];
43
42
  const seenStorageKeys = new Set<string>();
44
43
  const isLocalStorage = type === 'localStorage';
45
- const targetOrigin = extractContextOrigin(origin);
44
+ const targetOrigin = SDK.SecurityOrigin.SecurityOrigin.create(origin);
45
+ if (targetOrigin.isOpaque()) {
46
+ return [];
47
+ }
46
48
 
47
49
  const domStorageModels = targetManager.models(SDK.DOMStorageModel.DOMStorageModel);
48
50
  for (const domStorageModel of domStorageModels) {
@@ -78,7 +80,8 @@ export function resolveDOMStorages(
78
80
  // Parse the serialized StorageKey (e.g. "https://example.com/^0https://top.com") to
79
81
  // extract the partition's origin for equivalence comparison.
80
82
  const parsedKey = SDK.StorageKeyManager.parseStorageKey(currentStorageKey);
81
- if (areOriginsEquivalent(parsedKey.origin, targetOrigin)) {
83
+ const parsedOrigin = SDK.SecurityOrigin.SecurityOrigin.create(parsedKey.origin);
84
+ if (parsedOrigin.isSameOriginWith(targetOrigin)) {
82
85
  resolvedStorages.push(storage);
83
86
  }
84
87
  }
@@ -13,6 +13,8 @@ import {
13
13
  type BaseToolCapability,
14
14
  type DataHandlerResult,
15
15
  type DataTool,
16
+ isOriginAllowedByLock,
17
+ type OriginLockCapability,
16
18
  type PageExecutionCapability,
17
19
  type StyleMutationCapability,
18
20
  type ToolArgs,
@@ -30,7 +32,8 @@ export interface ExecuteJavaScriptArgs extends ToolArgs {
30
32
  }
31
33
 
32
34
  export class ExecuteJavaScriptTool implements
33
- DataTool<ExecuteJavaScriptArgs, unknown, BaseToolCapability&PageExecutionCapability&StyleMutationCapability> {
35
+ DataTool<ExecuteJavaScriptArgs, unknown,
36
+ BaseToolCapability&PageExecutionCapability&StyleMutationCapability&OriginLockCapability> {
34
37
  readonly name: ToolName = ToolName.EXECUTE_JAVASCRIPT;
35
38
 
36
39
  readonly description: string =
@@ -120,7 +123,7 @@ const data = {
120
123
 
121
124
  async handler(
122
125
  params: ExecuteJavaScriptArgs,
123
- context: BaseToolCapability&PageExecutionCapability&StyleMutationCapability,
126
+ context: BaseToolCapability&PageExecutionCapability&StyleMutationCapability&OriginLockCapability,
124
127
  options?: FunctionHandlerOptions,
125
128
  ): Promise<DataHandlerResult<unknown>> {
126
129
  const executionNode = context.getExecutionContextNode();
@@ -128,6 +131,10 @@ const data = {
128
131
  return {error: 'Error: Could not find the context node for execution.'};
129
132
  }
130
133
 
134
+ if (!isOriginAllowedByLock(context.getEstablishedOrigin(), executionNode.securityOrigin())) {
135
+ return {error: 'Error: Cannot execute JavaScript on cross-origin target.'};
136
+ }
137
+
131
138
  if (Root.Runtime.hostConfig.devToolsAiV2Architecture?.enabled) {
132
139
  const validationResult = await ExecuteJavaScriptTool.validateAndFormatCode(params.code);
133
140
  if (validationResult.error) {
@@ -110,7 +110,7 @@ export class GetCookieValuesTool implements DataTool<GetCookieValuesArgs, GetCoo
110
110
  const cookiesByOrigin: GetCookieValuesResult['cookiesByOrigin'] = {};
111
111
 
112
112
  await Promise.all(targetOrigins.map(async origin => {
113
- const result = await getCookiesForOrigin(origin, targetManager, primaryPageTarget);
113
+ const result = await getCookiesForOrigin(origin, primaryPageTarget);
114
114
  if ('error' in result) {
115
115
  cookiesByOrigin[origin] = {error: result.error};
116
116
  return;
@@ -12,6 +12,7 @@ import {
12
12
  type BaseToolCapability,
13
13
  type DataHandlerResult,
14
14
  type DataTool,
15
+ isOriginAllowedByLock,
15
16
  type OriginLockCapability,
16
17
  type TargetCapability,
17
18
  type ToolArgs,
@@ -81,7 +82,7 @@ export class GetElementAccessibilityDetailsTool implements
81
82
  context: BaseToolCapability&TargetCapability&OriginLockCapability,
82
83
  ): Promise<DataHandlerResult<string>> {
83
84
  const establishedOrigin = context.getEstablishedOrigin();
84
- if (!establishedOrigin) {
85
+ if (!establishedOrigin || establishedOrigin.isOpaque()) {
85
86
  return {error: 'Error: Origin lock is not established.'};
86
87
  }
87
88
 
@@ -101,7 +102,7 @@ export class GetElementAccessibilityDetailsTool implements
101
102
 
102
103
  const nodeContext = new DOMNodeContext(resolved);
103
104
  // Security check: Ensure the element matches the active conversation's origin lock.
104
- if (!nodeContext.isOriginAllowed(establishedOrigin)) {
105
+ if (!isOriginAllowedByLock(establishedOrigin, nodeContext.getOrigin())) {
105
106
  return {error: 'Error: Node does not belong to the locked origin.'};
106
107
  }
107
108
 
@@ -5,7 +5,6 @@
5
5
  import * as Host from '../../../core/host/host.js';
6
6
  import * as i18n from '../../../core/i18n/i18n.js';
7
7
  import type * as Platform from '../../../core/platform/platform.js';
8
- import {canResourceContentsBeReadForTrace} from '../AiOrigins.js';
9
8
 
10
9
  import {
11
10
  type BaseToolCapability,
@@ -77,7 +76,7 @@ export class GetFunctionCodeTool implements
77
76
  return {error: 'Performance trace context is not available.'};
78
77
  }
79
78
 
80
- if (performanceTraceContext.getOrigin().startsWith('imported-trace://')) {
79
+ if (performanceTraceContext.isImported()) {
81
80
  return {error: 'Cannot use this tool on an imported file.'};
82
81
  }
83
82
 
@@ -85,9 +84,8 @@ export class GetFunctionCodeTool implements
85
84
  return {error: 'Missing arg: scriptUrl'};
86
85
  }
87
86
 
88
- const allowedOrigin = performanceTraceContext.getOrigin();
89
- if (!canResourceContentsBeReadForTrace(params.scriptUrl, allowedOrigin)) {
90
- return {error: 'Script not found'};
87
+ if (!performanceTraceContext.canAccessResource(params.scriptUrl)) {
88
+ return {error: 'Resource not found'};
91
89
  }
92
90
 
93
91
  if (params.line === undefined) {
@@ -205,7 +205,7 @@ export class GetInsightDetailsTool implements
205
205
  }
206
206
 
207
207
  const widgets: AiWidget[] = [];
208
- const isImportedTrace = performanceTraceContext.getOrigin().startsWith('imported-trace://');
208
+ const isImportedTrace = performanceTraceContext.isImported();
209
209
  if (!isImportedTrace) {
210
210
  const domTreeWidget = await this.#generateDOMTreeWidget(insight, insightSet, capabilities.getTarget());
211
211
  if (domTreeWidget) {
@@ -6,14 +6,13 @@ import * as Host from '../../../core/host/host.js';
6
6
  import * as i18n from '../../../core/i18n/i18n.js';
7
7
  import * as Logs from '../../logs/logs.js';
8
8
  import * as NetworkTimeCalculator from '../../network_time_calculator/network_time_calculator.js';
9
- import {isOpaqueOrigin} from '../AiOrigins.js';
10
- import {getRequestContextOrigin} from '../contexts/RequestContext.js';
11
9
  import {NetworkRequestFormatter} from '../data_formatters/NetworkRequestFormatter.js';
12
10
 
13
11
  import {
14
12
  type BaseToolCapability,
15
13
  type DataHandlerResult,
16
14
  type DataTool,
15
+ isOriginAllowedByLock,
17
16
  type OriginLockCapability,
18
17
  type ToolArgs,
19
18
  ToolName,
@@ -78,10 +77,10 @@ export class GetNetworkRequestDetailsTool implements
78
77
  ): Promise<DataHandlerResult<unknown>> {
79
78
  // A conversation is locked to an origin once the first query is made.
80
79
  // We only allow inspecting requests matching the conversation's established origin.
81
- const origin = context.getEstablishedOrigin();
80
+ const establishedOrigin = context.getEstablishedOrigin();
82
81
 
83
82
  // Opaque origins are never allowed to be used as context.
84
- if (origin && isOpaqueOrigin(origin)) {
83
+ if (!establishedOrigin || establishedOrigin.isOpaque()) {
85
84
  return {
86
85
  error: 'Opaque origin not allowed',
87
86
  };
@@ -94,13 +93,8 @@ export class GetNetworkRequestDetailsTool implements
94
93
  return false;
95
94
  }
96
95
 
97
- // To prevent cross-origin prompt injection attacks, HAR-imported requests
98
- // are assigned a virtual origin (e.g., `imported-har://${domain}`) rather than
99
- // sharing the origin of live pages.
100
- const requestOrigin = getRequestContextOrigin(req);
101
-
102
96
  // If the conversation is locked to an origin, only allow accessing requests from that origin.
103
- return !origin || requestOrigin === origin;
97
+ return isOriginAllowedByLock(establishedOrigin, req.initiatorSecurityOrigin());
104
98
  });
105
99
 
106
100
  if (!request) {
@@ -110,7 +104,10 @@ export class GetNetworkRequestDetailsTool implements
110
104
  }
111
105
 
112
106
  const calculator = new NetworkTimeCalculator.NetworkTransferTimeCalculator();
113
- const formatter = new NetworkRequestFormatter(request, calculator, networkLog);
107
+ const formatter = new NetworkRequestFormatter(request, calculator, {
108
+ accessingSecurityOrigin: establishedOrigin,
109
+ networkLog,
110
+ });
114
111
  const formattedDetails = await formatter.formatNetworkRequest();
115
112
 
116
113
  return {
@@ -8,7 +8,6 @@ import type * as Platform from '../../../core/platform/platform.js';
8
8
  import * as Root from '../../../core/root/root.js';
9
9
  import * as SDK from '../../../core/sdk/sdk.js';
10
10
  import * as TextUtils from '../../../core/text_utils/text_utils.js';
11
- import {canResourceContentsBeReadForTrace} from '../AiOrigins.js';
12
11
 
13
12
  import {
14
13
  type BaseToolCapability,
@@ -69,12 +68,11 @@ export class GetResourceContentTool implements DataTool<
69
68
  return {error: 'Performance trace context is not available.'};
70
69
  }
71
70
 
72
- if (performanceTraceContext.getOrigin().startsWith('imported-trace://')) {
71
+ if (performanceTraceContext.isImported()) {
73
72
  return {error: 'Cannot use this tool on an imported file.'};
74
73
  }
75
74
 
76
- const allowedOrigin = performanceTraceContext.getOrigin();
77
- if (!canResourceContentsBeReadForTrace(params.url, allowedOrigin)) {
75
+ if (!performanceTraceContext.canAccessResource(params.url)) {
78
76
  return {error: 'Resource not found'};
79
77
  }
80
78
 
@@ -2,10 +2,10 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
- import * as Common from '../../../core/common/common.js';
6
5
  import * as Host from '../../../core/host/host.js';
7
6
  import * as i18n from '../../../core/i18n/i18n.js';
8
7
  import * as TextUtils from '../../../core/text_utils/text_utils.js';
8
+ import {FileContext} from '../contexts/FileContext.js';
9
9
  import {FileFormatter} from '../data_formatters/FileFormatter.js';
10
10
 
11
11
  import {ListSourcesTool} from './ListSources.js';
@@ -13,6 +13,7 @@ import {
13
13
  type BaseToolCapability,
14
14
  type DataHandlerResult,
15
15
  type DataTool,
16
+ isOriginAllowedByLock,
16
17
  type OriginLockCapability,
17
18
  type ToolArgs,
18
19
  ToolName,
@@ -65,10 +66,10 @@ export class GetSourceContentTool implements
65
66
  args: GetSourceContentArgs,
66
67
  context: BaseToolCapability&OriginLockCapability,
67
68
  ): Promise<DataHandlerResult<{content: string}>> {
68
- const origin = context.getEstablishedOrigin();
69
- const file = ListSourcesTool.getUISourceCodes().find(
70
- f => ListSourcesTool.uiSourceCodeId.get(f) === args.id,
71
- );
69
+ const establishedOrigin = context.getEstablishedOrigin();
70
+ const file = ListSourcesTool.getUISourceCodes()
71
+ .filter(f => isOriginAllowedByLock(establishedOrigin, FileContext.originForUISourceCode(f)))
72
+ .find(f => ListSourcesTool.uiSourceCodeId.get(f) === args.id);
72
73
 
73
74
  if (!file) {
74
75
  return {
@@ -76,14 +77,6 @@ export class GetSourceContentTool implements
76
77
  };
77
78
  }
78
79
 
79
- const fileUrl = file.url();
80
- const fileOrigin = Common.ParsedURL.ParsedURL.extractOrigin(fileUrl);
81
- if (origin && fileOrigin !== origin) {
82
- return {
83
- error: 'Cross-origin access blocked.',
84
- };
85
- }
86
-
87
80
  const contentData = await file.requestContentData();
88
81
  if (TextUtils.ContentData.ContentData.isError(contentData)) {
89
82
  return {
@@ -78,7 +78,7 @@ export class GetStorageBreakdownTool implements
78
78
  primaryPageTarget.storageAgent().invoke_getUsageAndQuota({origin: pageOrigin}),
79
79
  calculateDOMStoragesUsage(localStorages),
80
80
  calculateDOMStoragesUsage(sessionStorages),
81
- getCookiesForOrigin(pageOrigin, targetManager, primaryPageTarget),
81
+ getCookiesForOrigin(pageOrigin, primaryPageTarget),
82
82
  ]);
83
83
 
84
84
  if (response.getError()) {