patchright-core 1.56.1 → 1.58.2

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 (180) hide show
  1. package/ThirdPartyNotices.txt +3134 -560
  2. package/bin/install_webkit_wsl.ps1 +1 -3
  3. package/browsers.json +21 -22
  4. package/lib/cli/program.js +16 -60
  5. package/lib/client/api.js +3 -3
  6. package/lib/client/browser.js +3 -5
  7. package/lib/client/browserContext.js +62 -8
  8. package/lib/client/browserType.js +4 -3
  9. package/lib/client/connection.js +4 -0
  10. package/lib/client/consoleMessage.js +5 -1
  11. package/lib/client/electron.js +1 -1
  12. package/lib/client/elementHandle.js +3 -0
  13. package/lib/client/events.js +5 -1
  14. package/lib/client/fetch.js +3 -4
  15. package/lib/client/frame.js +10 -1
  16. package/lib/client/locator.js +12 -1
  17. package/lib/client/network.js +5 -1
  18. package/lib/client/page.js +31 -6
  19. package/lib/client/pageAgent.js +64 -0
  20. package/lib/client/platform.js +3 -0
  21. package/lib/client/playwright.js +1 -5
  22. package/lib/client/tracing.js +7 -5
  23. package/lib/client/worker.js +22 -0
  24. package/lib/generated/clockSource.js +1 -1
  25. package/lib/generated/injectedScriptSource.js +1 -1
  26. package/lib/generated/pollingRecorderSource.js +1 -1
  27. package/lib/inProcessFactory.js +0 -2
  28. package/lib/mcpBundle.js +84 -0
  29. package/lib/mcpBundleImpl/index.js +147 -0
  30. package/lib/protocol/serializers.js +5 -0
  31. package/lib/protocol/validator.js +112 -50
  32. package/lib/remote/playwrightServer.js +1 -2
  33. package/lib/server/agent/actionRunner.js +335 -0
  34. package/lib/server/agent/actions.js +128 -0
  35. package/lib/server/agent/codegen.js +111 -0
  36. package/lib/server/agent/context.js +150 -0
  37. package/lib/server/agent/expectTools.js +156 -0
  38. package/lib/server/agent/pageAgent.js +204 -0
  39. package/lib/server/agent/performTools.js +262 -0
  40. package/lib/server/agent/tool.js +109 -0
  41. package/lib/server/android/android.js +1 -1
  42. package/lib/server/artifact.js +1 -1
  43. package/lib/server/bidi/bidiBrowser.js +81 -22
  44. package/lib/server/bidi/bidiChromium.js +9 -13
  45. package/lib/server/bidi/bidiConnection.js +1 -0
  46. package/lib/server/bidi/bidiDeserializer.js +116 -0
  47. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  48. package/lib/server/bidi/bidiFirefox.js +7 -9
  49. package/lib/server/bidi/bidiNetworkManager.js +1 -1
  50. package/lib/server/bidi/bidiPage.js +61 -30
  51. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  52. package/lib/server/browserContext.js +43 -36
  53. package/lib/server/browserType.js +12 -4
  54. package/lib/server/chromium/chromium.js +26 -21
  55. package/lib/server/chromium/chromiumSwitches.js +12 -3
  56. package/lib/server/chromium/crBrowser.js +30 -12
  57. package/lib/server/chromium/crConnection.js +0 -5
  58. package/lib/server/chromium/crCoverage.js +13 -1
  59. package/lib/server/chromium/crDevTools.js +0 -2
  60. package/lib/server/chromium/crNetworkManager.js +107 -18
  61. package/lib/server/chromium/crPage.js +68 -124
  62. package/lib/server/chromium/crServiceWorker.js +14 -1
  63. package/lib/server/codegen/javascript.js +6 -29
  64. package/lib/server/console.js +5 -1
  65. package/lib/server/deviceDescriptorsSource.json +56 -56
  66. package/lib/server/dispatchers/browserContextDispatcher.js +26 -8
  67. package/lib/server/dispatchers/dispatcher.js +6 -13
  68. package/lib/server/dispatchers/frameDispatcher.js +1 -1
  69. package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
  70. package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
  71. package/lib/server/dispatchers/pageDispatcher.js +14 -22
  72. package/lib/server/dispatchers/playwrightDispatcher.js +0 -4
  73. package/lib/server/dom.js +12 -3
  74. package/lib/server/electron/electron.js +6 -3
  75. package/lib/server/firefox/ffBrowser.js +10 -20
  76. package/lib/server/firefox/ffConnection.js +0 -5
  77. package/lib/server/firefox/ffNetworkManager.js +2 -2
  78. package/lib/server/firefox/ffPage.js +18 -24
  79. package/lib/server/firefox/firefox.js +18 -9
  80. package/lib/server/frameSelectors.js +18 -8
  81. package/lib/server/frames.js +257 -87
  82. package/lib/server/input.js +7 -3
  83. package/lib/server/instrumentation.js +3 -0
  84. package/lib/server/javascript.js +8 -4
  85. package/lib/server/launchApp.js +2 -1
  86. package/lib/server/localUtils.js +4 -8
  87. package/lib/server/network.js +50 -12
  88. package/lib/server/page.js +112 -126
  89. package/lib/server/playwright.js +2 -4
  90. package/lib/server/progress.js +26 -6
  91. package/lib/server/recorder/recorderApp.js +80 -101
  92. package/lib/server/recorder.js +3 -2
  93. package/lib/server/registry/browserFetcher.js +6 -4
  94. package/lib/server/registry/index.js +278 -189
  95. package/lib/server/registry/oopDownloadBrowserMain.js +9 -2
  96. package/lib/server/screencast.js +190 -0
  97. package/lib/server/screenshotter.js +6 -0
  98. package/lib/server/socksClientCertificatesInterceptor.js +1 -1
  99. package/lib/server/trace/recorder/snapshotter.js +17 -8
  100. package/lib/server/trace/recorder/snapshotterInjected.js +30 -72
  101. package/lib/server/trace/recorder/tracing.js +31 -21
  102. package/lib/server/trace/viewer/traceParser.js +72 -0
  103. package/lib/server/trace/viewer/traceViewer.js +45 -40
  104. package/lib/server/utils/comparators.js +3 -25
  105. package/lib/server/utils/expectUtils.js +87 -2
  106. package/lib/server/utils/hostPlatform.js +30 -3
  107. package/lib/server/utils/httpServer.js +5 -20
  108. package/lib/server/utils/imageUtils.js +141 -0
  109. package/lib/server/utils/network.js +55 -40
  110. package/lib/server/utils/nodePlatform.js +6 -0
  111. package/lib/server/{chromium/videoRecorder.js → videoRecorder.js} +35 -24
  112. package/lib/server/webkit/webkit.js +5 -16
  113. package/lib/server/webkit/wkBrowser.js +2 -6
  114. package/lib/server/webkit/wkConnection.js +1 -6
  115. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  116. package/lib/server/webkit/wkPage.js +76 -51
  117. package/lib/server/webkit/wkWorkers.js +2 -1
  118. package/lib/utils/isomorphic/ariaSnapshot.js +63 -0
  119. package/lib/utils/isomorphic/locatorGenerators.js +24 -8
  120. package/lib/utils/isomorphic/lruCache.js +51 -0
  121. package/lib/utils/isomorphic/mimeType.js +1 -1
  122. package/lib/utils/isomorphic/protocolFormatter.js +3 -0
  123. package/lib/utils/isomorphic/protocolMetainfo.js +11 -2
  124. package/lib/utils/isomorphic/stringUtils.js +49 -0
  125. package/lib/utils/isomorphic/trace/entries.js +16 -0
  126. package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
  127. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  128. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  129. package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
  130. package/lib/utils/isomorphic/trace/traceModel.js +365 -0
  131. package/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
  132. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  133. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  134. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  135. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  136. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  137. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  138. package/lib/utils/isomorphic/urlMatch.js +19 -5
  139. package/lib/utils/isomorphic/yaml.js +84 -0
  140. package/lib/utils.js +4 -0
  141. package/lib/utilsBundle.js +1 -1
  142. package/lib/utilsBundleImpl/index.js +124 -124
  143. package/lib/vite/htmlReport/index.html +21 -21
  144. package/lib/vite/recorder/assets/codeMirrorModule-CFUTFUO7.js +32 -0
  145. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  146. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  147. package/lib/vite/recorder/assets/index-CVkBxsGf.js +193 -0
  148. package/lib/vite/recorder/index.html +2 -2
  149. package/lib/vite/traceViewer/assets/codeMirrorModule-BVA4h_ZY.js +32 -0
  150. package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +266 -0
  151. package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
  152. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
  153. package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
  154. package/lib/vite/traceViewer/index.BtyWtaE-.js +2 -0
  155. package/lib/vite/traceViewer/index.html +6 -6
  156. package/lib/vite/traceViewer/manifest.webmanifest +16 -0
  157. package/lib/vite/traceViewer/snapshot.html +3 -3
  158. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  159. package/lib/vite/traceViewer/uiMode.fyrXARf2.js +5 -0
  160. package/lib/vite/traceViewer/uiMode.html +3 -3
  161. package/package.json +2 -1
  162. package/types/protocol.d.ts +939 -245
  163. package/types/types.d.ts +143 -153
  164. package/lib/client/accessibility.js +0 -49
  165. package/lib/server/accessibility.js +0 -69
  166. package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
  167. package/lib/server/chromium/crAccessibility.js +0 -263
  168. package/lib/server/firefox/ffAccessibility.js +0 -238
  169. package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
  170. package/lib/server/webkit/wkAccessibility.js +0 -237
  171. package/lib/server/webkit/wsl/webkit-wsl-transport-client.js +0 -74
  172. package/lib/server/webkit/wsl/webkit-wsl-transport-server.js +0 -113
  173. package/lib/vite/recorder/assets/codeMirrorModule-RJCXzfmE.js +0 -24
  174. package/lib/vite/recorder/assets/index-Y-X2TGJv.js +0 -193
  175. package/lib/vite/traceViewer/assets/codeMirrorModule-rbQPefq7.js +0 -24
  176. package/lib/vite/traceViewer/assets/defaultSettingsView-CLbol9XR.js +0 -265
  177. package/lib/vite/traceViewer/defaultSettingsView.TQ8_7ybu.css +0 -1
  178. package/lib/vite/traceViewer/index.I8N9v4jT.css +0 -1
  179. package/lib/vite/traceViewer/index.zIVi6mN9.js +0 -2
  180. package/lib/vite/traceViewer/uiMode.B_CpmIpF.js +0 -5
@@ -77,160 +77,208 @@ if (process.env.PW_TEST_CDN_THAT_SHOULD_WORK) {
77
77
  }
78
78
  const EXECUTABLE_PATHS = {
79
79
  "chromium": {
80
- "linux": ["chrome-linux", "chrome"],
81
- "mac": ["chrome-mac", "Chromium.app", "Contents", "MacOS", "Chromium"],
82
- "win": ["chrome-win", "chrome.exe"]
80
+ "<unknown>": void 0,
81
+ "linux-x64": ["chrome-linux64", "chrome"],
82
+ "linux-arm64": ["chrome-linux", "chrome"],
83
+ // non-cft build
84
+ "mac-x64": ["chrome-mac-x64", "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing"],
85
+ "mac-arm64": ["chrome-mac-arm64", "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing"],
86
+ "win-x64": ["chrome-win64", "chrome.exe"]
83
87
  },
84
88
  "chromium-headless-shell": {
85
- "linux": ["chrome-linux", "headless_shell"],
86
- "mac": ["chrome-mac", "headless_shell"],
87
- "win": ["chrome-win", "headless_shell.exe"]
89
+ "<unknown>": void 0,
90
+ "linux-x64": ["chrome-headless-shell-linux64", "chrome-headless-shell"],
91
+ "linux-arm64": ["chrome-linux", "headless_shell"],
92
+ // non-cft build
93
+ "mac-x64": ["chrome-headless-shell-mac-x64", "chrome-headless-shell"],
94
+ "mac-arm64": ["chrome-headless-shell-mac-arm64", "chrome-headless-shell"],
95
+ "win-x64": ["chrome-headless-shell-win64", "chrome-headless-shell.exe"]
96
+ },
97
+ "chromium-tip-of-tree": {
98
+ "<unknown>": void 0,
99
+ "linux-x64": ["chrome-linux64", "chrome"],
100
+ "linux-arm64": ["chrome-linux", "chrome"],
101
+ // non-cft build
102
+ "mac-x64": ["chrome-mac-x64", "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing"],
103
+ "mac-arm64": ["chrome-mac-arm64", "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing"],
104
+ "win-x64": ["chrome-win64", "chrome.exe"]
105
+ },
106
+ "chromium-tip-of-tree-headless-shell": {
107
+ "<unknown>": void 0,
108
+ "linux-x64": ["chrome-headless-shell-linux64", "chrome-headless-shell"],
109
+ "linux-arm64": ["chrome-linux", "headless_shell"],
110
+ // non-cft build
111
+ "mac-x64": ["chrome-headless-shell-mac-x64", "chrome-headless-shell"],
112
+ "mac-arm64": ["chrome-headless-shell-mac-arm64", "chrome-headless-shell"],
113
+ "win-x64": ["chrome-headless-shell-win64", "chrome-headless-shell.exe"]
88
114
  },
89
115
  "firefox": {
90
- "linux": ["firefox", "firefox"],
91
- "mac": ["firefox", "Nightly.app", "Contents", "MacOS", "firefox"],
92
- "win": ["firefox", "firefox.exe"]
116
+ "<unknown>": void 0,
117
+ "linux-x64": ["firefox", "firefox"],
118
+ "linux-arm64": ["firefox", "firefox"],
119
+ "mac-x64": ["firefox", "Nightly.app", "Contents", "MacOS", "firefox"],
120
+ "mac-arm64": ["firefox", "Nightly.app", "Contents", "MacOS", "firefox"],
121
+ "win-x64": ["firefox", "firefox.exe"]
93
122
  },
94
123
  "webkit": {
95
- "linux": ["pw_run.sh"],
96
- "mac": ["pw_run.sh"],
97
- "win": ["Playwright.exe"]
124
+ "<unknown>": void 0,
125
+ "linux-x64": ["pw_run.sh"],
126
+ "linux-arm64": ["pw_run.sh"],
127
+ "mac-x64": ["pw_run.sh"],
128
+ "mac-arm64": ["pw_run.sh"],
129
+ "win-x64": ["Playwright.exe"]
98
130
  },
99
131
  "ffmpeg": {
100
- "linux": ["ffmpeg-linux"],
101
- "mac": ["ffmpeg-mac"],
102
- "win": ["ffmpeg-win64.exe"]
132
+ "<unknown>": void 0,
133
+ "linux-x64": ["ffmpeg-linux"],
134
+ "linux-arm64": ["ffmpeg-linux"],
135
+ "mac-x64": ["ffmpeg-mac"],
136
+ "mac-arm64": ["ffmpeg-mac"],
137
+ "win-x64": ["ffmpeg-win64.exe"]
103
138
  },
104
139
  "winldd": {
105
- "linux": void 0,
106
- "mac": void 0,
107
- "win": ["PrintDeps.exe"]
140
+ "<unknown>": void 0,
141
+ "linux-x64": void 0,
142
+ "linux-arm64": void 0,
143
+ "mac-x64": void 0,
144
+ "mac-arm64": void 0,
145
+ "win-x64": ["PrintDeps.exe"]
108
146
  }
109
147
  };
148
+ function cftUrl(suffix) {
149
+ return ({ browserVersion }) => {
150
+ return {
151
+ path: `builds/cft/${browserVersion}/${suffix}`,
152
+ mirrors: [
153
+ "https://cdn.playwright.dev"
154
+ ]
155
+ };
156
+ };
157
+ }
110
158
  const DOWNLOAD_PATHS = {
111
159
  "chromium": {
112
160
  "<unknown>": void 0,
113
161
  "ubuntu18.04-x64": void 0,
114
- "ubuntu20.04-x64": "builds/chromium/%s/chromium-linux.zip",
115
- "ubuntu22.04-x64": "builds/chromium/%s/chromium-linux.zip",
116
- "ubuntu24.04-x64": "builds/chromium/%s/chromium-linux.zip",
162
+ "ubuntu20.04-x64": cftUrl("linux64/chrome-linux64.zip"),
163
+ "ubuntu22.04-x64": cftUrl("linux64/chrome-linux64.zip"),
164
+ "ubuntu24.04-x64": cftUrl("linux64/chrome-linux64.zip"),
117
165
  "ubuntu18.04-arm64": void 0,
118
166
  "ubuntu20.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
119
167
  "ubuntu22.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
120
168
  "ubuntu24.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
121
- "debian11-x64": "builds/chromium/%s/chromium-linux.zip",
169
+ "debian11-x64": cftUrl("linux64/chrome-linux64.zip"),
122
170
  "debian11-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
123
- "debian12-x64": "builds/chromium/%s/chromium-linux.zip",
171
+ "debian12-x64": cftUrl("linux64/chrome-linux64.zip"),
124
172
  "debian12-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
125
- "debian13-x64": "builds/chromium/%s/chromium-linux.zip",
173
+ "debian13-x64": cftUrl("linux64/chrome-linux64.zip"),
126
174
  "debian13-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
127
- "mac10.13": "builds/chromium/%s/chromium-mac.zip",
128
- "mac10.14": "builds/chromium/%s/chromium-mac.zip",
129
- "mac10.15": "builds/chromium/%s/chromium-mac.zip",
130
- "mac11": "builds/chromium/%s/chromium-mac.zip",
131
- "mac11-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
132
- "mac12": "builds/chromium/%s/chromium-mac.zip",
133
- "mac12-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
134
- "mac13": "builds/chromium/%s/chromium-mac.zip",
135
- "mac13-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
136
- "mac14": "builds/chromium/%s/chromium-mac.zip",
137
- "mac14-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
138
- "mac15": "builds/chromium/%s/chromium-mac.zip",
139
- "mac15-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
140
- "win64": "builds/chromium/%s/chromium-win64.zip"
175
+ "mac10.13": cftUrl("mac-x64/chrome-mac-x64.zip"),
176
+ "mac10.14": cftUrl("mac-x64/chrome-mac-x64.zip"),
177
+ "mac10.15": cftUrl("mac-x64/chrome-mac-x64.zip"),
178
+ "mac11": cftUrl("mac-x64/chrome-mac-x64.zip"),
179
+ "mac11-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
180
+ "mac12": cftUrl("mac-x64/chrome-mac-x64.zip"),
181
+ "mac12-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
182
+ "mac13": cftUrl("mac-x64/chrome-mac-x64.zip"),
183
+ "mac13-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
184
+ "mac14": cftUrl("mac-x64/chrome-mac-x64.zip"),
185
+ "mac14-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
186
+ "mac15": cftUrl("mac-x64/chrome-mac-x64.zip"),
187
+ "mac15-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
188
+ "win64": cftUrl("win64/chrome-win64.zip")
141
189
  },
142
190
  "chromium-headless-shell": {
143
191
  "<unknown>": void 0,
144
192
  "ubuntu18.04-x64": void 0,
145
- "ubuntu20.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
146
- "ubuntu22.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
147
- "ubuntu24.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
193
+ "ubuntu20.04-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
194
+ "ubuntu22.04-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
195
+ "ubuntu24.04-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
148
196
  "ubuntu18.04-arm64": void 0,
149
197
  "ubuntu20.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
150
198
  "ubuntu22.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
151
199
  "ubuntu24.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
152
- "debian11-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
200
+ "debian11-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
153
201
  "debian11-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
154
- "debian12-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
202
+ "debian12-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
155
203
  "debian12-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
156
- "debian13-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
204
+ "debian13-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
157
205
  "debian13-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
158
206
  "mac10.13": void 0,
159
207
  "mac10.14": void 0,
160
208
  "mac10.15": void 0,
161
- "mac11": "builds/chromium/%s/chromium-headless-shell-mac.zip",
162
- "mac11-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
163
- "mac12": "builds/chromium/%s/chromium-headless-shell-mac.zip",
164
- "mac12-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
165
- "mac13": "builds/chromium/%s/chromium-headless-shell-mac.zip",
166
- "mac13-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
167
- "mac14": "builds/chromium/%s/chromium-headless-shell-mac.zip",
168
- "mac14-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
169
- "mac15": "builds/chromium/%s/chromium-headless-shell-mac.zip",
170
- "mac15-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
171
- "win64": "builds/chromium/%s/chromium-headless-shell-win64.zip"
209
+ "mac11": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
210
+ "mac11-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
211
+ "mac12": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
212
+ "mac12-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
213
+ "mac13": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
214
+ "mac13-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
215
+ "mac14": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
216
+ "mac14-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
217
+ "mac15": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
218
+ "mac15-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
219
+ "win64": cftUrl("win64/chrome-headless-shell-win64.zip")
172
220
  },
173
221
  "chromium-tip-of-tree": {
174
222
  "<unknown>": void 0,
175
223
  "ubuntu18.04-x64": void 0,
176
- "ubuntu20.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
177
- "ubuntu22.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
178
- "ubuntu24.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
224
+ "ubuntu20.04-x64": cftUrl("linux64/chrome-linux64.zip"),
225
+ "ubuntu22.04-x64": cftUrl("linux64/chrome-linux64.zip"),
226
+ "ubuntu24.04-x64": cftUrl("linux64/chrome-linux64.zip"),
179
227
  "ubuntu18.04-arm64": void 0,
180
228
  "ubuntu20.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
181
229
  "ubuntu22.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
182
230
  "ubuntu24.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
183
- "debian11-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
231
+ "debian11-x64": cftUrl("linux64/chrome-linux64.zip"),
184
232
  "debian11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
185
- "debian12-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
233
+ "debian12-x64": cftUrl("linux64/chrome-linux64.zip"),
186
234
  "debian12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
187
- "debian13-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
235
+ "debian13-x64": cftUrl("linux64/chrome-linux64.zip"),
188
236
  "debian13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
189
- "mac10.13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
190
- "mac10.14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
191
- "mac10.15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
192
- "mac11": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
193
- "mac11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
194
- "mac12": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
195
- "mac12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
196
- "mac13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
197
- "mac13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
198
- "mac14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
199
- "mac14-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
200
- "mac15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
201
- "mac15-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
202
- "win64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-win64.zip"
237
+ "mac10.13": cftUrl("mac-x64/chrome-mac-x64.zip"),
238
+ "mac10.14": cftUrl("mac-x64/chrome-mac-x64.zip"),
239
+ "mac10.15": cftUrl("mac-x64/chrome-mac-x64.zip"),
240
+ "mac11": cftUrl("mac-x64/chrome-mac-x64.zip"),
241
+ "mac11-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
242
+ "mac12": cftUrl("mac-x64/chrome-mac-x64.zip"),
243
+ "mac12-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
244
+ "mac13": cftUrl("mac-x64/chrome-mac-x64.zip"),
245
+ "mac13-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
246
+ "mac14": cftUrl("mac-x64/chrome-mac-x64.zip"),
247
+ "mac14-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
248
+ "mac15": cftUrl("mac-x64/chrome-mac-x64.zip"),
249
+ "mac15-arm64": cftUrl("mac-arm64/chrome-mac-arm64.zip"),
250
+ "win64": cftUrl("win64/chrome-win64.zip")
203
251
  },
204
252
  "chromium-tip-of-tree-headless-shell": {
205
253
  "<unknown>": void 0,
206
254
  "ubuntu18.04-x64": void 0,
207
- "ubuntu20.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
208
- "ubuntu22.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
209
- "ubuntu24.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
255
+ "ubuntu20.04-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
256
+ "ubuntu22.04-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
257
+ "ubuntu24.04-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
210
258
  "ubuntu18.04-arm64": void 0,
211
259
  "ubuntu20.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
212
260
  "ubuntu22.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
213
261
  "ubuntu24.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
214
- "debian11-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
262
+ "debian11-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
215
263
  "debian11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
216
- "debian12-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
264
+ "debian12-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
217
265
  "debian12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
218
- "debian13-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
266
+ "debian13-x64": cftUrl("linux64/chrome-headless-shell-linux64.zip"),
219
267
  "debian13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
220
268
  "mac10.13": void 0,
221
269
  "mac10.14": void 0,
222
270
  "mac10.15": void 0,
223
- "mac11": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
224
- "mac11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
225
- "mac12": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
226
- "mac12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
227
- "mac13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
228
- "mac13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
229
- "mac14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
230
- "mac14-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
231
- "mac15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
232
- "mac15-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
233
- "win64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-win64.zip"
271
+ "mac11": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
272
+ "mac11-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
273
+ "mac12": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
274
+ "mac12-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
275
+ "mac13": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
276
+ "mac13-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
277
+ "mac14": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
278
+ "mac14-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
279
+ "mac15": cftUrl("mac-x64/chrome-headless-shell-mac-x64.zip"),
280
+ "mac15-arm64": cftUrl("mac-arm64/chrome-headless-shell-mac-arm64.zip"),
281
+ "win64": cftUrl("win64/chrome-headless-shell-win64.zip")
234
282
  },
235
283
  "firefox": {
236
284
  "<unknown>": void 0,
@@ -311,14 +359,14 @@ const DOWNLOAD_PATHS = {
311
359
  "debian13-x64": "builds/webkit/%s/webkit-debian-13.zip",
312
360
  "debian13-arm64": "builds/webkit/%s/webkit-debian-13-arm64.zip",
313
361
  "mac10.13": void 0,
314
- "mac10.14": "builds/deprecated-webkit-mac-10.14/%s/deprecated-webkit-mac-10.14.zip",
315
- "mac10.15": "builds/deprecated-webkit-mac-10.15/%s/deprecated-webkit-mac-10.15.zip",
316
- "mac11": "builds/webkit/%s/webkit-mac-11.zip",
317
- "mac11-arm64": "builds/webkit/%s/webkit-mac-11-arm64.zip",
318
- "mac12": "builds/webkit/%s/webkit-mac-12.zip",
319
- "mac12-arm64": "builds/webkit/%s/webkit-mac-12-arm64.zip",
320
- "mac13": "builds/webkit/%s/webkit-mac-13.zip",
321
- "mac13-arm64": "builds/webkit/%s/webkit-mac-13-arm64.zip",
362
+ "mac10.14": void 0,
363
+ "mac10.15": void 0,
364
+ "mac11": void 0,
365
+ "mac11-arm64": void 0,
366
+ "mac12": void 0,
367
+ "mac12-arm64": void 0,
368
+ "mac13": void 0,
369
+ "mac13-arm64": void 0,
322
370
  "mac14": "builds/webkit/%s/webkit-mac-14.zip",
323
371
  "mac14-arm64": "builds/webkit/%s/webkit-mac-14-arm64.zip",
324
372
  "mac15": "builds/webkit/%s/webkit-mac-15.zip",
@@ -417,10 +465,7 @@ const DOWNLOAD_PATHS = {
417
465
  "mac15": "builds/android/%s/android.zip",
418
466
  "mac15-arm64": "builds/android/%s/android.zip",
419
467
  "win64": "builds/android/%s/android.zip"
420
- },
421
- // TODO(bidi): implement downloads.
422
- "_bidiFirefox": {},
423
- "_bidiChromium": {}
468
+ }
424
469
  };
425
470
  const registryDirectory = (() => {
426
471
  let result;
@@ -448,7 +493,7 @@ const registryDirectory = (() => {
448
493
  })();
449
494
  function isBrowserDirectory(browserDirectory) {
450
495
  const baseName = import_path.default.basename(browserDirectory);
451
- for (const browserName of allDownloadable) {
496
+ for (const browserName of allDownloadableDirectoriesThatEverExisted) {
452
497
  if (baseName.startsWith(browserName.replace(/-/g, "_") + "-"))
453
498
  return true;
454
499
  }
@@ -466,6 +511,7 @@ function readDescriptors(browsersJSON) {
466
511
  hasRevisionOverride: !!revisionOverride,
467
512
  // We only put browser version for the supported operating systems.
468
513
  browserVersion: revisionOverride ? void 0 : obj.browserVersion,
514
+ title: obj["title"],
469
515
  installByDefault: !!obj.installByDefault,
470
516
  // Method `isBrowserDirectory` determines directory to be browser iff
471
517
  // it starts with some browser name followed by '-'. Some browser names
@@ -477,18 +523,13 @@ function readDescriptors(browsersJSON) {
477
523
  return descriptor;
478
524
  });
479
525
  }
480
- const allDownloadable = ["android", "chromium", "firefox", "webkit", "ffmpeg", "firefox-beta", "chromium-tip-of-tree", "chromium-headless-shell", "chromium-tip-of-tree-headless-shell"];
526
+ const allDownloadableDirectoriesThatEverExisted = ["android", "chromium", "firefox", "webkit", "ffmpeg", "firefox-beta", "chromium-tip-of-tree", "chromium-headless-shell", "chromium-tip-of-tree-headless-shell", "winldd"];
527
+ const chromiumAliases = ["bidi-chromium", "chrome-for-testing"];
481
528
  class Registry {
482
529
  constructor(browsersJSON) {
483
530
  const descriptors = readDescriptors(browsersJSON);
484
531
  const findExecutablePath = (dir, name) => {
485
- let tokens = void 0;
486
- if (process.platform === "linux")
487
- tokens = EXECUTABLE_PATHS[name]["linux"];
488
- else if (process.platform === "darwin")
489
- tokens = EXECUTABLE_PATHS[name]["mac"];
490
- else if (process.platform === "win32")
491
- tokens = EXECUTABLE_PATHS[name]["win"];
532
+ const tokens = EXECUTABLE_PATHS[name][import_hostPlatform.shortPlatform];
492
533
  return tokens ? import_path.default.join(dir, ...tokens) : void 0;
493
534
  };
494
535
  const executablePathOrDie = (name, e, installByDefault, sdkLanguage) => {
@@ -523,7 +564,6 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
523
564
  const chromium = descriptors.find((d) => d.name === "chromium");
524
565
  const chromiumExecutable = findExecutablePath(chromium.dir, "chromium");
525
566
  this._executables.push({
526
- type: "browser",
527
567
  name: "chromium",
528
568
  browserName: "chromium",
529
569
  directory: chromium.dir,
@@ -532,15 +572,16 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
532
572
  installType: chromium.installByDefault ? "download-by-default" : "download-on-demand",
533
573
  _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromium.dir, ["chrome-linux"], [], ["chrome-win"]),
534
574
  downloadURLs: this._downloadURLs(chromium),
575
+ title: chromium.title,
576
+ revision: chromium.revision,
535
577
  browserVersion: chromium.browserVersion,
536
- _install: () => this._downloadExecutable(chromium, chromiumExecutable),
578
+ _install: (force) => this._downloadExecutable(chromium, force, chromiumExecutable),
537
579
  _dependencyGroup: "chromium",
538
580
  _isHermeticInstallation: true
539
581
  });
540
582
  const chromiumHeadlessShell = descriptors.find((d) => d.name === "chromium-headless-shell");
541
583
  const chromiumHeadlessShellExecutable = findExecutablePath(chromiumHeadlessShell.dir, "chromium-headless-shell");
542
584
  this._executables.push({
543
- type: "channel",
544
585
  name: "chromium-headless-shell",
545
586
  browserName: "chromium",
546
587
  directory: chromiumHeadlessShell.dir,
@@ -549,15 +590,16 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
549
590
  installType: chromiumHeadlessShell.installByDefault ? "download-by-default" : "download-on-demand",
550
591
  _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumHeadlessShell.dir, ["chrome-linux"], [], ["chrome-win"]),
551
592
  downloadURLs: this._downloadURLs(chromiumHeadlessShell),
552
- browserVersion: chromium.browserVersion,
553
- _install: () => this._downloadExecutable(chromiumHeadlessShell, chromiumHeadlessShellExecutable),
593
+ title: chromiumHeadlessShell.title,
594
+ revision: chromiumHeadlessShell.revision,
595
+ browserVersion: chromiumHeadlessShell.browserVersion,
596
+ _install: (force) => this._downloadExecutable(chromiumHeadlessShell, force, chromiumHeadlessShellExecutable),
554
597
  _dependencyGroup: "chromium",
555
598
  _isHermeticInstallation: true
556
599
  });
557
600
  const chromiumTipOfTreeHeadlessShell = descriptors.find((d) => d.name === "chromium-tip-of-tree-headless-shell");
558
- const chromiumTipOfTreeHeadlessShellExecutable = findExecutablePath(chromiumTipOfTreeHeadlessShell.dir, "chromium-headless-shell");
601
+ const chromiumTipOfTreeHeadlessShellExecutable = findExecutablePath(chromiumTipOfTreeHeadlessShell.dir, "chromium-tip-of-tree-headless-shell");
559
602
  this._executables.push({
560
- type: "channel",
561
603
  name: "chromium-tip-of-tree-headless-shell",
562
604
  browserName: "chromium",
563
605
  directory: chromiumTipOfTreeHeadlessShell.dir,
@@ -566,15 +608,16 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
566
608
  installType: chromiumTipOfTreeHeadlessShell.installByDefault ? "download-by-default" : "download-on-demand",
567
609
  _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumTipOfTreeHeadlessShell.dir, ["chrome-linux"], [], ["chrome-win"]),
568
610
  downloadURLs: this._downloadURLs(chromiumTipOfTreeHeadlessShell),
569
- browserVersion: chromium.browserVersion,
570
- _install: () => this._downloadExecutable(chromiumTipOfTreeHeadlessShell, chromiumTipOfTreeHeadlessShellExecutable),
611
+ title: chromiumTipOfTreeHeadlessShell.title,
612
+ revision: chromiumTipOfTreeHeadlessShell.revision,
613
+ browserVersion: chromiumTipOfTreeHeadlessShell.browserVersion,
614
+ _install: (force) => this._downloadExecutable(chromiumTipOfTreeHeadlessShell, force, chromiumTipOfTreeHeadlessShellExecutable),
571
615
  _dependencyGroup: "chromium",
572
616
  _isHermeticInstallation: true
573
617
  });
574
618
  const chromiumTipOfTree = descriptors.find((d) => d.name === "chromium-tip-of-tree");
575
- const chromiumTipOfTreeExecutable = findExecutablePath(chromiumTipOfTree.dir, "chromium");
619
+ const chromiumTipOfTreeExecutable = findExecutablePath(chromiumTipOfTree.dir, "chromium-tip-of-tree");
576
620
  this._executables.push({
577
- type: "tool",
578
621
  name: "chromium-tip-of-tree",
579
622
  browserName: "chromium",
580
623
  directory: chromiumTipOfTree.dir,
@@ -583,8 +626,10 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
583
626
  installType: chromiumTipOfTree.installByDefault ? "download-by-default" : "download-on-demand",
584
627
  _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumTipOfTree.dir, ["chrome-linux"], [], ["chrome-win"]),
585
628
  downloadURLs: this._downloadURLs(chromiumTipOfTree),
629
+ title: chromiumTipOfTree.title,
630
+ revision: chromiumTipOfTree.revision,
586
631
  browserVersion: chromiumTipOfTree.browserVersion,
587
- _install: () => this._downloadExecutable(chromiumTipOfTree, chromiumTipOfTreeExecutable),
632
+ _install: (force) => this._downloadExecutable(chromiumTipOfTree, force, chromiumTipOfTreeExecutable),
588
633
  _dependencyGroup: "chromium",
589
634
  _isHermeticInstallation: true
590
635
  });
@@ -673,25 +718,9 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
673
718
  "darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
674
719
  "win32": `\\Google\\Chrome SxS\\Application\\chrome.exe`
675
720
  }));
676
- this._executables.push({
677
- type: "browser",
678
- name: "_bidiChromium",
679
- browserName: "_bidiChromium",
680
- directory: chromium.dir,
681
- executablePath: () => chromiumExecutable,
682
- executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumExecutable, chromium.installByDefault, sdkLanguage),
683
- installType: "download-on-demand",
684
- _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromium.dir, ["chrome-linux"], [], ["chrome-win"]),
685
- downloadURLs: this._downloadURLs(chromium),
686
- browserVersion: chromium.browserVersion,
687
- _install: () => this._downloadExecutable(chromium, chromiumExecutable),
688
- _dependencyGroup: "chromium",
689
- _isHermeticInstallation: true
690
- });
691
721
  const firefox = descriptors.find((d) => d.name === "firefox");
692
722
  const firefoxExecutable = findExecutablePath(firefox.dir, "firefox");
693
723
  this._executables.push({
694
- type: "browser",
695
724
  name: "firefox",
696
725
  browserName: "firefox",
697
726
  directory: firefox.dir,
@@ -700,15 +729,16 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
700
729
  installType: firefox.installByDefault ? "download-by-default" : "download-on-demand",
701
730
  _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, firefox.dir, ["firefox"], [], ["firefox"]),
702
731
  downloadURLs: this._downloadURLs(firefox),
732
+ title: firefox.title,
733
+ revision: firefox.revision,
703
734
  browserVersion: firefox.browserVersion,
704
- _install: () => this._downloadExecutable(firefox, firefoxExecutable),
735
+ _install: (force) => this._downloadExecutable(firefox, force, firefoxExecutable),
705
736
  _dependencyGroup: "firefox",
706
737
  _isHermeticInstallation: true
707
738
  });
708
739
  const firefoxBeta = descriptors.find((d) => d.name === "firefox-beta");
709
740
  const firefoxBetaExecutable = findExecutablePath(firefoxBeta.dir, "firefox");
710
741
  this._executables.push({
711
- type: "tool",
712
742
  name: "firefox-beta",
713
743
  browserName: "firefox",
714
744
  directory: firefoxBeta.dir,
@@ -717,8 +747,10 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
717
747
  installType: firefoxBeta.installByDefault ? "download-by-default" : "download-on-demand",
718
748
  _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, firefoxBeta.dir, ["firefox"], [], ["firefox"]),
719
749
  downloadURLs: this._downloadURLs(firefoxBeta),
750
+ title: firefoxBeta.title,
751
+ revision: firefoxBeta.revision,
720
752
  browserVersion: firefoxBeta.browserVersion,
721
- _install: () => this._downloadExecutable(firefoxBeta, firefoxBetaExecutable),
753
+ _install: (force) => this._downloadExecutable(firefoxBeta, force, firefoxBetaExecutable),
722
754
  _dependencyGroup: "firefox",
723
755
  _isHermeticInstallation: true
724
756
  });
@@ -735,7 +767,6 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
735
767
  import_path.default.join("minibrowser-wpe", "sys", "lib")
736
768
  ];
737
769
  this._executables.push({
738
- type: "browser",
739
770
  name: "webkit",
740
771
  browserName: "webkit",
741
772
  directory: webkit.dir,
@@ -744,20 +775,21 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
744
775
  installType: webkit.installByDefault ? "download-by-default" : "download-on-demand",
745
776
  _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, webkit.dir, webkitLinuxLddDirectories, ["libGLESv2.so.2", "libx264.so"], [""]),
746
777
  downloadURLs: this._downloadURLs(webkit),
778
+ title: webkit.title,
779
+ revision: webkit.revision,
747
780
  browserVersion: webkit.browserVersion,
748
- _install: () => this._downloadExecutable(webkit, webkitExecutable),
781
+ _install: (force) => this._downloadExecutable(webkit, force, webkitExecutable),
749
782
  _dependencyGroup: "webkit",
750
783
  _isHermeticInstallation: true
751
784
  });
752
785
  this._executables.push({
753
- type: "channel",
754
786
  name: "webkit-wsl",
755
787
  browserName: "webkit",
756
788
  directory: webkit.dir,
757
- executablePath: () => process.execPath,
758
- executablePathOrDie: () => process.execPath,
759
- wslExecutablePath: `/home/pwuser/.cache/ms-playwright/webkit-${webkit.revision}/pw_run.sh`,
789
+ executablePath: () => webkitExecutable,
790
+ executablePathOrDie: (sdkLanguage) => executablePathOrDie("webkit", webkitExecutable, webkit.installByDefault, sdkLanguage),
760
791
  installType: "download-on-demand",
792
+ title: "Webkit in WSL",
761
793
  _validateHostRequirements: (sdkLanguage) => Promise.resolve(),
762
794
  _isHermeticInstallation: true,
763
795
  _install: async () => {
@@ -779,7 +811,6 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
779
811
  const ffmpeg = descriptors.find((d) => d.name === "ffmpeg");
780
812
  const ffmpegExecutable = findExecutablePath(ffmpeg.dir, "ffmpeg");
781
813
  this._executables.push({
782
- type: "tool",
783
814
  name: "ffmpeg",
784
815
  browserName: void 0,
785
816
  directory: ffmpeg.dir,
@@ -788,14 +819,15 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
788
819
  installType: ffmpeg.installByDefault ? "download-by-default" : "download-on-demand",
789
820
  _validateHostRequirements: () => Promise.resolve(),
790
821
  downloadURLs: this._downloadURLs(ffmpeg),
791
- _install: () => this._downloadExecutable(ffmpeg, ffmpegExecutable),
822
+ title: ffmpeg.title,
823
+ revision: ffmpeg.revision,
824
+ _install: (force) => this._downloadExecutable(ffmpeg, force, ffmpegExecutable),
792
825
  _dependencyGroup: "tools",
793
826
  _isHermeticInstallation: true
794
827
  });
795
828
  const winldd = descriptors.find((d) => d.name === "winldd");
796
829
  const winlddExecutable = findExecutablePath(winldd.dir, "winldd");
797
830
  this._executables.push({
798
- type: "tool",
799
831
  name: "winldd",
800
832
  browserName: void 0,
801
833
  directory: winldd.dir,
@@ -804,13 +836,14 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
804
836
  installType: process.platform === "win32" ? "download-by-default" : "none",
805
837
  _validateHostRequirements: () => Promise.resolve(),
806
838
  downloadURLs: this._downloadURLs(winldd),
807
- _install: () => this._downloadExecutable(winldd, winlddExecutable),
839
+ title: winldd.title,
840
+ revision: winldd.revision,
841
+ _install: (force) => this._downloadExecutable(winldd, force, winlddExecutable),
808
842
  _dependencyGroup: "tools",
809
843
  _isHermeticInstallation: true
810
844
  });
811
845
  const android = descriptors.find((d) => d.name === "android");
812
846
  this._executables.push({
813
- type: "tool",
814
847
  name: "android",
815
848
  browserName: void 0,
816
849
  directory: android.dir,
@@ -819,7 +852,9 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
819
852
  installType: "download-on-demand",
820
853
  _validateHostRequirements: () => Promise.resolve(),
821
854
  downloadURLs: this._downloadURLs(android),
822
- _install: () => this._downloadExecutable(android),
855
+ title: android.title,
856
+ revision: android.revision,
857
+ _install: (force) => this._downloadExecutable(android, force),
823
858
  _dependencyGroup: "tools",
824
859
  _isHermeticInstallation: true
825
860
  });
@@ -853,7 +888,6 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
853
888
  throw new Error(`Chromium distribution '${name}' is not found${location}${installation}`);
854
889
  };
855
890
  return {
856
- type: "channel",
857
891
  name,
858
892
  browserName: "chromium",
859
893
  directory: void 0,
@@ -887,13 +921,13 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
887
921
  return executablePath2;
888
922
  }
889
923
  if (shouldThrow)
890
- throw new Error(`Cannot find Firefox installation for channel '${name}' at the standard system paths.`);
924
+ throw new Error(`Cannot find Firefox installation for channel '${name}' at the standard system paths. ${`Tried paths:
925
+ ${prefixes.map((p) => import_path.default.join(p, suffix)).join("\n ")}`}`);
891
926
  return void 0;
892
927
  };
893
928
  return {
894
- type: "channel",
895
929
  name,
896
- browserName: "_bidiFirefox",
930
+ browserName: "firefox",
897
931
  directory: void 0,
898
932
  executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
899
933
  executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
@@ -903,7 +937,7 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
903
937
  _install: install
904
938
  };
905
939
  }
906
- _createBidiChromiumChannel(name, lookAt, install) {
940
+ _createBidiChromiumChannel(name, lookAt) {
907
941
  const executablePath = (sdkLanguage, shouldThrow) => {
908
942
  const suffix = lookAt[process.platform];
909
943
  if (!suffix) {
@@ -927,21 +961,17 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
927
961
  if (!shouldThrow)
928
962
  return void 0;
929
963
  const location = prefixes.length ? ` at ${import_path.default.join(prefixes[0], suffix)}` : ``;
930
- const installation = install ? `
931
- Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
932
- throw new Error(`Chromium distribution '${name}' is not found${location}${installation}`);
964
+ throw new Error(`Chromium distribution '${name}' is not found${location}`);
933
965
  };
934
966
  return {
935
- type: "channel",
936
967
  name,
937
- browserName: "_bidiChromium",
968
+ browserName: "chromium",
938
969
  directory: void 0,
939
970
  executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
940
971
  executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
941
- installType: install ? "install-script" : "none",
972
+ installType: "none",
942
973
  _validateHostRequirements: () => Promise.resolve(),
943
- _isHermeticInstallation: false,
944
- _install: install
974
+ _isHermeticInstallation: false
945
975
  };
946
976
  }
947
977
  executables() {
@@ -975,7 +1005,7 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
975
1005
  if (import_os.default.platform() === "linux")
976
1006
  return await (0, import_dependencies2.installDependenciesLinux)(targets, dryRun);
977
1007
  }
978
- async install(executablesToInstall, forceReinstall) {
1008
+ async install(executablesToInstall, options) {
979
1009
  const executables = this._dedupe(executablesToInstall);
980
1010
  await import_fs.default.promises.mkdir(registryDirectory, { recursive: true });
981
1011
  const lockfilePath = import_path.default.join(registryDirectory, "__dirlock");
@@ -1003,7 +1033,7 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
1003
1033
  if (!executable._install)
1004
1034
  throw new Error(`ERROR: Playwright does not support installing ${executable.name}`);
1005
1035
  const { embedderName } = (0, import_userAgent.getEmbedderName)();
1006
- if (!(0, import_utils.getAsBooleanFromENV)("CI") && !executable._isHermeticInstallation && !forceReinstall && executable.executablePath(embedderName)) {
1036
+ if (!(0, import_utils.getAsBooleanFromENV)("CI") && !executable._isHermeticInstallation && !options?.force && executable.executablePath(embedderName)) {
1007
1037
  const command = buildPlaywrightCLICommand(embedderName, "install --force " + executable.name);
1008
1038
  process.stderr.write("\n" + (0, import_ascii.wrapInASCIIBox)([
1009
1039
  `ATTENTION: "${executable.name}" is already installed on the system!`,
@@ -1022,7 +1052,7 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
1022
1052
  ].join("\n"), 1) + "\n\n");
1023
1053
  return;
1024
1054
  }
1025
- await executable._install();
1055
+ await executable._install(!!options?.force);
1026
1056
  }
1027
1057
  } catch (e) {
1028
1058
  if (e.code === "ELOCKED") {
@@ -1094,8 +1124,16 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
1094
1124
  const downloadPathTemplate = paths[import_hostPlatform.hostPlatform] || paths["<unknown>"];
1095
1125
  if (!downloadPathTemplate)
1096
1126
  return [];
1097
- const downloadPath = util.format(downloadPathTemplate, descriptor.revision);
1098
- let downloadURLs = PLAYWRIGHT_CDN_MIRRORS.map((mirror) => `${mirror}/${downloadPath}`);
1127
+ let downloadPath;
1128
+ let mirrors;
1129
+ if (typeof downloadPathTemplate === "function") {
1130
+ const result = downloadPathTemplate(descriptor);
1131
+ downloadPath = result.path;
1132
+ mirrors = result.mirrors;
1133
+ } else {
1134
+ downloadPath = util.format(downloadPathTemplate, descriptor.revision);
1135
+ mirrors = PLAYWRIGHT_CDN_MIRRORS;
1136
+ }
1099
1137
  let downloadHostEnv;
1100
1138
  if (descriptor.name.startsWith("chromium"))
1101
1139
  downloadHostEnv = "PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST";
@@ -1105,10 +1143,10 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
1105
1143
  downloadHostEnv = "PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST";
1106
1144
  const customHostOverride = downloadHostEnv && (0, import_utils.getFromENV)(downloadHostEnv) || (0, import_utils.getFromENV)("PLAYWRIGHT_DOWNLOAD_HOST");
1107
1145
  if (customHostOverride)
1108
- downloadURLs = [`${customHostOverride}/${downloadPath}`];
1109
- return downloadURLs;
1146
+ mirrors = [customHostOverride];
1147
+ return mirrors.map((mirror) => `${mirror}/${downloadPath}`);
1110
1148
  }
1111
- async _downloadExecutable(descriptor, executablePath) {
1149
+ async _downloadExecutable(descriptor, force, executablePath) {
1112
1150
  const downloadURLs = this._downloadURLs(descriptor);
1113
1151
  if (!downloadURLs.length)
1114
1152
  throw new Error(`ERROR: Playwright does not support ${descriptor.name} on ${import_hostPlatform.hostPlatform}`);
@@ -1121,18 +1159,22 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
1121
1159
  else
1122
1160
  (0, import_browserFetcher.logPolitely)(message);
1123
1161
  }
1124
- const displayName = descriptor.name.split("-").map((word) => {
1125
- return word === "ffmpeg" ? "FFMPEG" : word.charAt(0).toUpperCase() + word.slice(1);
1126
- }).join(" ");
1127
- const title = descriptor.browserVersion ? `${displayName} ${descriptor.browserVersion} (playwright build v${descriptor.revision})` : `${displayName} playwright build v${descriptor.revision}`;
1162
+ const title = this.calculateDownloadTitle(descriptor);
1128
1163
  const downloadFileName = `playwright-download-${descriptor.name}-${import_hostPlatform.hostPlatform}-${descriptor.revision}.zip`;
1129
1164
  const downloadSocketTimeoutEnv = (0, import_utils.getFromENV)("PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT");
1130
1165
  const downloadSocketTimeout = +(downloadSocketTimeoutEnv || "0") || import_network.NET_DEFAULT_TIMEOUT;
1131
- await (0, import_browserFetcher.downloadBrowserWithProgressBar)(title, descriptor.dir, executablePath, downloadURLs, downloadFileName, downloadSocketTimeout).catch((e) => {
1166
+ await (0, import_browserFetcher.downloadBrowserWithProgressBar)(title, descriptor.dir, executablePath, downloadURLs, downloadFileName, downloadSocketTimeout, force).catch((e) => {
1132
1167
  throw new Error(`Failed to download ${title}, caused by
1133
1168
  ${e.stack}`);
1134
1169
  });
1135
1170
  }
1171
+ calculateDownloadTitle(descriptor) {
1172
+ const title = descriptor.title ?? descriptor.name.split("-").map((word) => {
1173
+ return word === "ffmpeg" ? "FFmpeg" : word.charAt(0).toUpperCase() + word.slice(1);
1174
+ }).join(" ");
1175
+ const version = descriptor.browserVersion ? " " + descriptor.browserVersion : "";
1176
+ return `${title}${version} (playwright ${descriptor.name} v${descriptor.revision})`;
1177
+ }
1136
1178
  async _installMSEdgeChannel(channel, scripts) {
1137
1179
  const scriptArgs = [];
1138
1180
  if (process.platform !== "linux") {
@@ -1205,7 +1247,7 @@ ${e.stack}`);
1205
1247
  linkTarget = (await import_fs.default.promises.readFile(linkPath)).toString();
1206
1248
  const browsersJSON = require(import_path.default.join(linkTarget, "browsers.json"));
1207
1249
  const descriptors = readDescriptors(browsersJSON);
1208
- for (const browserName of allDownloadable) {
1250
+ for (const browserName of allDownloadableDirectoriesThatEverExisted) {
1209
1251
  const descriptor = descriptors.find((d) => d.name === browserName);
1210
1252
  if (!descriptor)
1211
1253
  continue;
@@ -1247,6 +1289,57 @@ ${e.stack}`);
1247
1289
  await import_fs.default.promises.unlink(linkPath).catch((e) => {
1248
1290
  });
1249
1291
  }
1292
+ _defaultBrowsersToInstall(options) {
1293
+ let executables = this.defaultExecutables();
1294
+ if (options.shell === "no")
1295
+ executables = executables.filter((e) => e.name !== "chromium-headless-shell" && e.name !== "chromium-tip-of-tree-headless-shell");
1296
+ if (options.shell === "only")
1297
+ executables = executables.filter((e) => e.name !== "chromium" && e.name !== "chromium-tip-of-tree");
1298
+ return executables;
1299
+ }
1300
+ suggestedBrowsersToInstall() {
1301
+ const names = this.executables().filter((e) => e.installType !== "none").map((e) => e.name);
1302
+ names.push(...chromiumAliases);
1303
+ return names.sort().join(", ");
1304
+ }
1305
+ isChromiumAlias(name) {
1306
+ return chromiumAliases.includes(name);
1307
+ }
1308
+ resolveBrowsers(aliases, options) {
1309
+ if (aliases.length === 0)
1310
+ return this._defaultBrowsersToInstall(options);
1311
+ const faultyArguments = [];
1312
+ const executables = [];
1313
+ const handleArgument = (arg) => {
1314
+ const executable = this.findExecutable(arg);
1315
+ if (!executable || executable.installType === "none")
1316
+ faultyArguments.push(arg);
1317
+ else
1318
+ executables.push(executable);
1319
+ if (executable?.browserName)
1320
+ executables.push(this.findExecutable("ffmpeg"));
1321
+ };
1322
+ for (const alias of aliases) {
1323
+ if (alias === "chromium" || chromiumAliases.includes(alias)) {
1324
+ if (options.shell !== "only")
1325
+ handleArgument("chromium");
1326
+ if (options.shell !== "no")
1327
+ handleArgument("chromium-headless-shell");
1328
+ } else if (alias === "chromium-tip-of-tree") {
1329
+ if (options.shell !== "only")
1330
+ handleArgument("chromium-tip-of-tree");
1331
+ if (options.shell !== "no")
1332
+ handleArgument("chromium-tip-of-tree-headless-shell");
1333
+ } else {
1334
+ handleArgument(alias);
1335
+ }
1336
+ }
1337
+ if (process.platform === "win32")
1338
+ executables.push(this.findExecutable("winldd"));
1339
+ if (faultyArguments.length)
1340
+ throw new Error(`Invalid installation targets: ${faultyArguments.map((name) => `'${name}'`).join(", ")}. Expecting one of: ${this.suggestedBrowsersToInstall()}`);
1341
+ return executables;
1342
+ }
1250
1343
  }
1251
1344
  function browserDirectoryToMarkerFilePath(browserDirectory) {
1252
1345
  return import_path.default.join(browserDirectory, "INSTALLATION_COMPLETE");
@@ -1261,7 +1354,7 @@ function buildPlaywrightCLICommand(sdkLanguage, parameters) {
1261
1354
  return `pwsh bin/Debug/netX/playwright.ps1 ${parameters}`;
1262
1355
  default: {
1263
1356
  const packageManagerCommand = (0, import_utils.getPackageManagerExecCommand)();
1264
- return `${packageManagerCommand} playwright ${parameters}`;
1357
+ return `${packageManagerCommand} patchright ${parameters}`;
1265
1358
  }
1266
1359
  }
1267
1360
  }
@@ -1279,11 +1372,7 @@ async function installBrowsersForNpmInstall(browsers) {
1279
1372
  throw new Error(`Cannot install ${browserName}`);
1280
1373
  executables.push(executable);
1281
1374
  }
1282
- await registry.install(
1283
- executables,
1284
- false
1285
- /* forceReinstall */
1286
- );
1375
+ await registry.install(executables);
1287
1376
  }
1288
1377
  function findChromiumChannelBestEffort(sdkLanguage) {
1289
1378
  let channel = null;