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.
- package/ThirdPartyNotices.txt +3134 -560
- package/bin/install_webkit_wsl.ps1 +1 -3
- package/browsers.json +21 -22
- package/lib/cli/program.js +16 -60
- package/lib/client/api.js +3 -3
- package/lib/client/browser.js +3 -5
- package/lib/client/browserContext.js +62 -8
- package/lib/client/browserType.js +4 -3
- package/lib/client/connection.js +4 -0
- package/lib/client/consoleMessage.js +5 -1
- package/lib/client/electron.js +1 -1
- package/lib/client/elementHandle.js +3 -0
- package/lib/client/events.js +5 -1
- package/lib/client/fetch.js +3 -4
- package/lib/client/frame.js +10 -1
- package/lib/client/locator.js +12 -1
- package/lib/client/network.js +5 -1
- package/lib/client/page.js +31 -6
- package/lib/client/pageAgent.js +64 -0
- package/lib/client/platform.js +3 -0
- package/lib/client/playwright.js +1 -5
- package/lib/client/tracing.js +7 -5
- package/lib/client/worker.js +22 -0
- package/lib/generated/clockSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/inProcessFactory.js +0 -2
- package/lib/mcpBundle.js +84 -0
- package/lib/mcpBundleImpl/index.js +147 -0
- package/lib/protocol/serializers.js +5 -0
- package/lib/protocol/validator.js +112 -50
- package/lib/remote/playwrightServer.js +1 -2
- package/lib/server/agent/actionRunner.js +335 -0
- package/lib/server/agent/actions.js +128 -0
- package/lib/server/agent/codegen.js +111 -0
- package/lib/server/agent/context.js +150 -0
- package/lib/server/agent/expectTools.js +156 -0
- package/lib/server/agent/pageAgent.js +204 -0
- package/lib/server/agent/performTools.js +262 -0
- package/lib/server/agent/tool.js +109 -0
- package/lib/server/android/android.js +1 -1
- package/lib/server/artifact.js +1 -1
- package/lib/server/bidi/bidiBrowser.js +81 -22
- package/lib/server/bidi/bidiChromium.js +9 -13
- package/lib/server/bidi/bidiConnection.js +1 -0
- package/lib/server/bidi/bidiDeserializer.js +116 -0
- package/lib/server/bidi/bidiExecutionContext.js +75 -29
- package/lib/server/bidi/bidiFirefox.js +7 -9
- package/lib/server/bidi/bidiNetworkManager.js +1 -1
- package/lib/server/bidi/bidiPage.js +61 -30
- package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
- package/lib/server/browserContext.js +43 -36
- package/lib/server/browserType.js +12 -4
- package/lib/server/chromium/chromium.js +26 -21
- package/lib/server/chromium/chromiumSwitches.js +12 -3
- package/lib/server/chromium/crBrowser.js +30 -12
- package/lib/server/chromium/crConnection.js +0 -5
- package/lib/server/chromium/crCoverage.js +13 -1
- package/lib/server/chromium/crDevTools.js +0 -2
- package/lib/server/chromium/crNetworkManager.js +107 -18
- package/lib/server/chromium/crPage.js +68 -124
- package/lib/server/chromium/crServiceWorker.js +14 -1
- package/lib/server/codegen/javascript.js +6 -29
- package/lib/server/console.js +5 -1
- package/lib/server/deviceDescriptorsSource.json +56 -56
- package/lib/server/dispatchers/browserContextDispatcher.js +26 -8
- package/lib/server/dispatchers/dispatcher.js +6 -13
- package/lib/server/dispatchers/frameDispatcher.js +1 -1
- package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
- package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
- package/lib/server/dispatchers/pageDispatcher.js +14 -22
- package/lib/server/dispatchers/playwrightDispatcher.js +0 -4
- package/lib/server/dom.js +12 -3
- package/lib/server/electron/electron.js +6 -3
- package/lib/server/firefox/ffBrowser.js +10 -20
- package/lib/server/firefox/ffConnection.js +0 -5
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +18 -24
- package/lib/server/firefox/firefox.js +18 -9
- package/lib/server/frameSelectors.js +18 -8
- package/lib/server/frames.js +257 -87
- package/lib/server/input.js +7 -3
- package/lib/server/instrumentation.js +3 -0
- package/lib/server/javascript.js +8 -4
- package/lib/server/launchApp.js +2 -1
- package/lib/server/localUtils.js +4 -8
- package/lib/server/network.js +50 -12
- package/lib/server/page.js +112 -126
- package/lib/server/playwright.js +2 -4
- package/lib/server/progress.js +26 -6
- package/lib/server/recorder/recorderApp.js +80 -101
- package/lib/server/recorder.js +3 -2
- package/lib/server/registry/browserFetcher.js +6 -4
- package/lib/server/registry/index.js +278 -189
- package/lib/server/registry/oopDownloadBrowserMain.js +9 -2
- package/lib/server/screencast.js +190 -0
- package/lib/server/screenshotter.js +6 -0
- package/lib/server/socksClientCertificatesInterceptor.js +1 -1
- package/lib/server/trace/recorder/snapshotter.js +17 -8
- package/lib/server/trace/recorder/snapshotterInjected.js +30 -72
- package/lib/server/trace/recorder/tracing.js +31 -21
- package/lib/server/trace/viewer/traceParser.js +72 -0
- package/lib/server/trace/viewer/traceViewer.js +45 -40
- package/lib/server/utils/comparators.js +3 -25
- package/lib/server/utils/expectUtils.js +87 -2
- package/lib/server/utils/hostPlatform.js +30 -3
- package/lib/server/utils/httpServer.js +5 -20
- package/lib/server/utils/imageUtils.js +141 -0
- package/lib/server/utils/network.js +55 -40
- package/lib/server/utils/nodePlatform.js +6 -0
- package/lib/server/{chromium/videoRecorder.js → videoRecorder.js} +35 -24
- package/lib/server/webkit/webkit.js +5 -16
- package/lib/server/webkit/wkBrowser.js +2 -6
- package/lib/server/webkit/wkConnection.js +1 -6
- package/lib/server/webkit/wkInterceptableRequest.js +29 -1
- package/lib/server/webkit/wkPage.js +76 -51
- package/lib/server/webkit/wkWorkers.js +2 -1
- package/lib/utils/isomorphic/ariaSnapshot.js +63 -0
- package/lib/utils/isomorphic/locatorGenerators.js +24 -8
- package/lib/utils/isomorphic/lruCache.js +51 -0
- package/lib/utils/isomorphic/mimeType.js +1 -1
- package/lib/utils/isomorphic/protocolFormatter.js +3 -0
- package/lib/utils/isomorphic/protocolMetainfo.js +11 -2
- package/lib/utils/isomorphic/stringUtils.js +49 -0
- package/lib/utils/isomorphic/trace/entries.js +16 -0
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
- package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
- package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
- package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
- package/lib/utils/isomorphic/trace/traceModel.js +365 -0
- package/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
- package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
- package/lib/utils/isomorphic/urlMatch.js +19 -5
- package/lib/utils/isomorphic/yaml.js +84 -0
- package/lib/utils.js +4 -0
- package/lib/utilsBundle.js +1 -1
- package/lib/utilsBundleImpl/index.js +124 -124
- package/lib/vite/htmlReport/index.html +21 -21
- package/lib/vite/recorder/assets/codeMirrorModule-CFUTFUO7.js +32 -0
- package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
- package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
- package/lib/vite/recorder/assets/index-CVkBxsGf.js +193 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-BVA4h_ZY.js +32 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +266 -0
- package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
- package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
- package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
- package/lib/vite/traceViewer/index.BtyWtaE-.js +2 -0
- package/lib/vite/traceViewer/index.html +6 -6
- package/lib/vite/traceViewer/manifest.webmanifest +16 -0
- package/lib/vite/traceViewer/snapshot.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +5 -3
- package/lib/vite/traceViewer/uiMode.fyrXARf2.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/package.json +2 -1
- package/types/protocol.d.ts +939 -245
- package/types/types.d.ts +143 -153
- package/lib/client/accessibility.js +0 -49
- package/lib/server/accessibility.js +0 -69
- package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
- package/lib/server/chromium/crAccessibility.js +0 -263
- package/lib/server/firefox/ffAccessibility.js +0 -238
- package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
- package/lib/server/webkit/wkAccessibility.js +0 -237
- package/lib/server/webkit/wsl/webkit-wsl-transport-client.js +0 -74
- package/lib/server/webkit/wsl/webkit-wsl-transport-server.js +0 -113
- package/lib/vite/recorder/assets/codeMirrorModule-RJCXzfmE.js +0 -24
- package/lib/vite/recorder/assets/index-Y-X2TGJv.js +0 -193
- package/lib/vite/traceViewer/assets/codeMirrorModule-rbQPefq7.js +0 -24
- package/lib/vite/traceViewer/assets/defaultSettingsView-CLbol9XR.js +0 -265
- package/lib/vite/traceViewer/defaultSettingsView.TQ8_7ybu.css +0 -1
- package/lib/vite/traceViewer/index.I8N9v4jT.css +0 -1
- package/lib/vite/traceViewer/index.zIVi6mN9.js +0 -2
- 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
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
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
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
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
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
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
|
-
"
|
|
96
|
-
"
|
|
97
|
-
"
|
|
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
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
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
|
-
"
|
|
106
|
-
"
|
|
107
|
-
"
|
|
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": "
|
|
115
|
-
"ubuntu22.04-x64": "
|
|
116
|
-
"ubuntu24.04-x64": "
|
|
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": "
|
|
169
|
+
"debian11-x64": cftUrl("linux64/chrome-linux64.zip"),
|
|
122
170
|
"debian11-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
|
|
123
|
-
"debian12-x64": "
|
|
171
|
+
"debian12-x64": cftUrl("linux64/chrome-linux64.zip"),
|
|
124
172
|
"debian12-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
|
|
125
|
-
"debian13-x64": "
|
|
173
|
+
"debian13-x64": cftUrl("linux64/chrome-linux64.zip"),
|
|
126
174
|
"debian13-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
|
|
127
|
-
"mac10.13": "
|
|
128
|
-
"mac10.14": "
|
|
129
|
-
"mac10.15": "
|
|
130
|
-
"mac11": "
|
|
131
|
-
"mac11-arm64": "
|
|
132
|
-
"mac12": "
|
|
133
|
-
"mac12-arm64": "
|
|
134
|
-
"mac13": "
|
|
135
|
-
"mac13-arm64": "
|
|
136
|
-
"mac14": "
|
|
137
|
-
"mac14-arm64": "
|
|
138
|
-
"mac15": "
|
|
139
|
-
"mac15-arm64": "
|
|
140
|
-
"win64": "
|
|
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": "
|
|
146
|
-
"ubuntu22.04-x64": "
|
|
147
|
-
"ubuntu24.04-x64": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
162
|
-
"mac11-arm64": "
|
|
163
|
-
"mac12": "
|
|
164
|
-
"mac12-arm64": "
|
|
165
|
-
"mac13": "
|
|
166
|
-
"mac13-arm64": "
|
|
167
|
-
"mac14": "
|
|
168
|
-
"mac14-arm64": "
|
|
169
|
-
"mac15": "
|
|
170
|
-
"mac15-arm64": "
|
|
171
|
-
"win64": "
|
|
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": "
|
|
177
|
-
"ubuntu22.04-x64": "
|
|
178
|
-
"ubuntu24.04-x64": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
190
|
-
"mac10.14": "
|
|
191
|
-
"mac10.15": "
|
|
192
|
-
"mac11": "
|
|
193
|
-
"mac11-arm64": "
|
|
194
|
-
"mac12": "
|
|
195
|
-
"mac12-arm64": "
|
|
196
|
-
"mac13": "
|
|
197
|
-
"mac13-arm64": "
|
|
198
|
-
"mac14": "
|
|
199
|
-
"mac14-arm64": "
|
|
200
|
-
"mac15": "
|
|
201
|
-
"mac15-arm64": "
|
|
202
|
-
"win64": "
|
|
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": "
|
|
208
|
-
"ubuntu22.04-x64": "
|
|
209
|
-
"ubuntu24.04-x64": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
224
|
-
"mac11-arm64": "
|
|
225
|
-
"mac12": "
|
|
226
|
-
"mac12-arm64": "
|
|
227
|
-
"mac13": "
|
|
228
|
-
"mac13-arm64": "
|
|
229
|
-
"mac14": "
|
|
230
|
-
"mac14-arm64": "
|
|
231
|
-
"mac15": "
|
|
232
|
-
"mac15-arm64": "
|
|
233
|
-
"win64": "
|
|
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":
|
|
315
|
-
"mac10.15":
|
|
316
|
-
"mac11":
|
|
317
|
-
"mac11-arm64":
|
|
318
|
-
"mac12":
|
|
319
|
-
"mac12-arm64":
|
|
320
|
-
"mac13":
|
|
321
|
-
"mac13-arm64":
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
553
|
-
|
|
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
|
-
|
|
570
|
-
|
|
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: () =>
|
|
758
|
-
executablePathOrDie: () =>
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
|
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
|
-
|
|
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: "
|
|
968
|
+
browserName: "chromium",
|
|
938
969
|
directory: void 0,
|
|
939
970
|
executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
|
|
940
971
|
executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
|
|
941
|
-
installType:
|
|
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,
|
|
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 && !
|
|
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
|
-
|
|
1098
|
-
let
|
|
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
|
-
|
|
1109
|
-
return
|
|
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
|
|
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
|
|
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}
|
|
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;
|