patchright-core 1.52.4 → 1.55.0

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 (218) hide show
  1. package/ThirdPartyNotices.txt +65 -123
  2. package/bin/reinstall_chrome_beta_mac.sh +1 -1
  3. package/bin/reinstall_chrome_stable_mac.sh +1 -1
  4. package/bin/reinstall_msedge_beta_mac.sh +1 -1
  5. package/bin/reinstall_msedge_dev_mac.sh +1 -1
  6. package/bin/reinstall_msedge_stable_mac.sh +1 -1
  7. package/browsers.json +14 -14
  8. package/index.js +1 -1
  9. package/lib/androidServerImpl.js +4 -2
  10. package/lib/browserServerImpl.js +47 -12
  11. package/lib/cli/program.js +116 -50
  12. package/lib/cli/programWithTestStub.js +1 -1
  13. package/lib/client/android.js +30 -34
  14. package/lib/client/browser.js +54 -17
  15. package/lib/client/browserContext.js +67 -71
  16. package/lib/client/browserType.js +25 -34
  17. package/lib/client/channelOwner.js +20 -24
  18. package/lib/client/connection.js +6 -10
  19. package/lib/client/electron.js +8 -3
  20. package/lib/client/elementHandle.js +18 -21
  21. package/lib/client/fetch.js +5 -3
  22. package/lib/client/frame.js +57 -35
  23. package/lib/client/input.js +3 -1
  24. package/lib/client/jsHandle.js +4 -0
  25. package/lib/client/localUtils.js +0 -1
  26. package/lib/client/locator.js +32 -28
  27. package/lib/client/network.js +5 -12
  28. package/lib/client/page.js +32 -32
  29. package/lib/client/playwright.js +6 -16
  30. package/lib/client/selectors.js +18 -38
  31. package/lib/client/timeoutSettings.js +12 -8
  32. package/lib/client/tracing.js +24 -20
  33. package/lib/client/waiter.js +2 -2
  34. package/lib/client/webSocket.js +4 -22
  35. package/lib/generated/bindingsControllerSource.js +28 -0
  36. package/lib/generated/clockSource.js +1 -1
  37. package/lib/generated/injectedScriptSource.js +1 -1
  38. package/lib/generated/pollingRecorderSource.js +1 -1
  39. package/lib/generated/storageScriptSource.js +28 -0
  40. package/lib/generated/utilityScriptSource.js +1 -1
  41. package/lib/generated/webSocketMockSource.js +12 -50
  42. package/lib/inProcessFactory.js +9 -6
  43. package/lib/outofprocess.js +0 -2
  44. package/lib/protocol/validator.js +423 -346
  45. package/lib/protocol/validatorPrimitives.js +18 -4
  46. package/lib/remote/playwrightConnection.js +29 -166
  47. package/lib/remote/playwrightServer.js +233 -35
  48. package/lib/server/android/android.js +97 -83
  49. package/lib/server/android/backendAdb.js +0 -2
  50. package/lib/server/bidi/bidiBrowser.js +139 -73
  51. package/lib/server/bidi/bidiChromium.js +23 -22
  52. package/lib/server/bidi/bidiExecutionContext.js +2 -1
  53. package/lib/server/bidi/bidiFirefox.js +17 -14
  54. package/lib/server/bidi/bidiInput.js +22 -22
  55. package/lib/server/bidi/bidiNetworkManager.js +8 -11
  56. package/lib/server/bidi/bidiPage.js +42 -86
  57. package/lib/server/bidi/third_party/bidiProtocol.js +5 -133
  58. package/lib/server/bidi/third_party/bidiProtocolCore.js +179 -0
  59. package/lib/server/{dispatchers/selectorsDispatcher.js → bidi/third_party/bidiProtocolPermissions.js} +20 -18
  60. package/lib/server/browser.js +30 -21
  61. package/lib/server/browserContext.js +203 -165
  62. package/lib/server/browserType.js +109 -107
  63. package/lib/server/chromium/chromium.js +84 -69
  64. package/lib/server/chromium/chromiumSwitches.js +13 -20
  65. package/lib/server/chromium/crBrowser.js +74 -40
  66. package/lib/server/chromium/crConnection.js +8 -9
  67. package/lib/server/chromium/crCoverage.js +11 -8
  68. package/lib/server/chromium/crDragDrop.js +25 -20
  69. package/lib/server/chromium/crExecutionContext.js +2 -1
  70. package/lib/server/chromium/crInput.js +32 -29
  71. package/lib/server/chromium/crNetworkManager.js +45 -33
  72. package/lib/server/chromium/crPage.js +98 -73
  73. package/lib/server/chromium/crServiceWorker.js +13 -18
  74. package/lib/server/chromium/videoRecorder.js +10 -18
  75. package/lib/server/clock.js +51 -39
  76. package/lib/server/codegen/csharp.js +10 -5
  77. package/lib/server/codegen/java.js +1 -1
  78. package/lib/server/codegen/javascript.js +1 -1
  79. package/lib/server/codegen/jsonl.js +2 -1
  80. package/lib/server/codegen/language.js +22 -1
  81. package/lib/server/codegen/languages.js +4 -4
  82. package/lib/server/codegen/python.js +1 -1
  83. package/lib/server/cookieStore.js +3 -1
  84. package/lib/server/debugController.js +105 -71
  85. package/lib/server/debugger.js +6 -23
  86. package/lib/server/deviceDescriptorsSource.json +237 -127
  87. package/lib/server/dialog.js +50 -6
  88. package/lib/server/dispatchers/androidDispatcher.js +77 -62
  89. package/lib/server/dispatchers/artifactDispatcher.js +18 -18
  90. package/lib/server/dispatchers/browserContextDispatcher.js +141 -91
  91. package/lib/server/dispatchers/browserDispatcher.js +55 -88
  92. package/lib/server/dispatchers/browserTypeDispatcher.js +18 -9
  93. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -4
  94. package/lib/server/dispatchers/debugControllerDispatcher.js +12 -21
  95. package/lib/server/dispatchers/dialogDispatcher.js +4 -4
  96. package/lib/server/dispatchers/dispatcher.js +78 -53
  97. package/lib/server/dispatchers/electronDispatcher.js +19 -20
  98. package/lib/server/dispatchers/elementHandlerDispatcher.js +83 -93
  99. package/lib/server/dispatchers/frameDispatcher.js +99 -102
  100. package/lib/server/dispatchers/jsHandleDispatcher.js +21 -16
  101. package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -4
  102. package/lib/server/dispatchers/localUtilsDispatcher.js +53 -59
  103. package/lib/server/dispatchers/networkDispatchers.js +41 -35
  104. package/lib/server/dispatchers/pageDispatcher.js +156 -107
  105. package/lib/server/dispatchers/playwrightDispatcher.js +37 -25
  106. package/lib/server/dispatchers/streamDispatcher.js +15 -8
  107. package/lib/server/dispatchers/tracingDispatcher.js +22 -13
  108. package/lib/server/dispatchers/webSocketRouteDispatcher.js +46 -35
  109. package/lib/server/dispatchers/writableStreamDispatcher.js +16 -10
  110. package/lib/server/dom.js +198 -266
  111. package/lib/server/download.js +3 -3
  112. package/lib/server/electron/electron.js +96 -103
  113. package/lib/server/electron/loader.js +1 -1
  114. package/lib/server/fetch.js +22 -41
  115. package/lib/server/fileUploadUtils.js +1 -1
  116. package/lib/server/firefox/ffBrowser.js +79 -55
  117. package/lib/server/firefox/ffExecutionContext.js +2 -1
  118. package/lib/server/firefox/ffInput.js +23 -23
  119. package/lib/server/firefox/ffNetworkManager.js +8 -6
  120. package/lib/server/firefox/ffPage.js +39 -36
  121. package/lib/server/firefox/firefox.js +9 -10
  122. package/lib/server/frameSelectors.js +65 -22
  123. package/lib/server/frames.js +516 -544
  124. package/lib/server/har/harRecorder.js +1 -1
  125. package/lib/server/har/harTracer.js +4 -2
  126. package/lib/server/helper.js +3 -7
  127. package/lib/server/index.js +0 -3
  128. package/lib/server/input.js +47 -54
  129. package/lib/server/instrumentation.js +8 -14
  130. package/lib/server/javascript.js +9 -17
  131. package/lib/server/launchApp.js +48 -30
  132. package/lib/server/localUtils.js +45 -38
  133. package/lib/server/network.js +44 -10
  134. package/lib/server/page.js +233 -178
  135. package/lib/server/pageBinding.js +6 -7
  136. package/lib/server/playwright.js +4 -14
  137. package/lib/server/progress.js +57 -49
  138. package/lib/server/recorder/recorderApp.js +298 -95
  139. package/lib/server/recorder/recorderRunner.js +23 -24
  140. package/lib/server/recorder/recorderSignalProcessor.js +83 -0
  141. package/lib/server/recorder/recorderUtils.js +67 -10
  142. package/lib/server/recorder.js +284 -146
  143. package/lib/server/registry/index.js +83 -48
  144. package/lib/server/registry/nativeDeps.js +175 -0
  145. package/lib/server/registry/oopDownloadBrowserMain.js +1 -1
  146. package/lib/server/screenshotter.js +84 -83
  147. package/lib/server/selectors.js +12 -12
  148. package/lib/server/socksClientCertificatesInterceptor.js +198 -136
  149. package/lib/server/trace/recorder/snapshotter.js +12 -19
  150. package/lib/server/trace/recorder/tracing.js +36 -27
  151. package/lib/server/trace/viewer/traceViewer.js +11 -20
  152. package/lib/server/transport.js +20 -22
  153. package/lib/server/utils/comparators.js +2 -2
  154. package/lib/server/utils/debug.js +3 -8
  155. package/lib/server/utils/debugLogger.js +8 -0
  156. package/lib/server/utils/hostPlatform.js +3 -1
  157. package/lib/server/utils/network.js +35 -25
  158. package/lib/server/utils/nodePlatform.js +1 -1
  159. package/lib/server/utils/processLauncher.js +4 -1
  160. package/lib/server/utils/wsServer.js +11 -17
  161. package/lib/server/webkit/webkit.js +5 -2
  162. package/lib/server/webkit/wkBrowser.js +51 -28
  163. package/lib/server/webkit/wkExecutionContext.js +2 -1
  164. package/lib/server/webkit/wkInput.js +25 -25
  165. package/lib/server/webkit/wkInterceptableRequest.js +1 -1
  166. package/lib/server/webkit/wkPage.js +80 -59
  167. package/lib/server/webkit/wkProvisionalPage.js +1 -1
  168. package/lib/server/webkit/wkWorkers.js +7 -7
  169. package/lib/utils/isomorphic/ariaSnapshot.js +13 -7
  170. package/lib/utils/isomorphic/cssParser.js +1 -2
  171. package/lib/utils/isomorphic/locatorGenerators.js +18 -0
  172. package/lib/utils/isomorphic/manualPromise.js +1 -2
  173. package/lib/utils/isomorphic/mimeType.js +1 -2
  174. package/lib/utils/isomorphic/multimap.js +1 -2
  175. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +248 -0
  176. package/lib/utils/isomorphic/protocolFormatter.js +78 -0
  177. package/lib/utils/isomorphic/protocolMetainfo.js +318 -0
  178. package/lib/utils/isomorphic/selectorParser.js +3 -4
  179. package/lib/utils/isomorphic/stringUtils.js +3 -24
  180. package/lib/utils/isomorphic/time.js +9 -4
  181. package/lib/utils/isomorphic/timeoutRunner.js +3 -4
  182. package/lib/utils/isomorphic/traceUtils.js +2 -3
  183. package/lib/utils/isomorphic/urlMatch.js +21 -7
  184. package/lib/utils/isomorphic/utilityScriptSerializers.js +208 -205
  185. package/lib/utils.js +8 -2
  186. package/lib/utilsBundleImpl/index.js +160 -150
  187. package/lib/vite/htmlReport/index.html +17 -17
  188. package/lib/vite/recorder/assets/{codeMirrorModule-CXVeovup.js → codeMirrorModule-DzQ0k89p.js} +1 -1
  189. package/lib/vite/recorder/assets/{index-eHBmevrY.css → index-CI4HQ-Zb.css} +1 -1
  190. package/lib/vite/recorder/assets/index-D7C7daHH.js +184 -0
  191. package/lib/vite/recorder/index.html +3 -3
  192. package/lib/vite/traceViewer/assets/{codeMirrorModule-_GLjJL-7.js → codeMirrorModule-Di48jgWx.js} +1 -1
  193. package/lib/vite/traceViewer/assets/defaultSettingsView-szBn8781.js +256 -0
  194. package/lib/vite/traceViewer/defaultSettingsView.DVJHpiGt.css +1 -0
  195. package/lib/vite/traceViewer/index.BFsek2M6.css +1 -0
  196. package/lib/vite/traceViewer/index.DQvXoPLL.js +2 -0
  197. package/lib/vite/traceViewer/index.html +6 -6
  198. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  199. package/lib/vite/traceViewer/uiMode.dBV3oN9h.js +5 -0
  200. package/lib/vite/traceViewer/uiMode.html +4 -4
  201. package/lib/zipBundleImpl.js +4 -4
  202. package/package.json +1 -1
  203. package/types/protocol.d.ts +712 -107
  204. package/types/types.d.ts +148 -37
  205. package/lib/generated/consoleApiSource.js +0 -28
  206. package/lib/protocol/debug.js +0 -211
  207. package/lib/server/recorder/contextRecorder.js +0 -286
  208. package/lib/server/recorder/recorderCollection.js +0 -116
  209. package/lib/server/recorder/recorderFrontend.js +0 -16
  210. package/lib/server/storageScript.js +0 -154
  211. package/lib/server/timeoutSettings.js +0 -89
  212. package/lib/utils/isomorphic/builtins.js +0 -86
  213. package/lib/vite/recorder/assets/index-BsWQsSGl.js +0 -184
  214. package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +0 -265
  215. package/lib/vite/traceViewer/defaultSettingsView.QdHITyLI.css +0 -1
  216. package/lib/vite/traceViewer/index.CFOW-Ezb.css +0 -1
  217. package/lib/vite/traceViewer/index.cFZzK9RN.js +0 -2
  218. package/lib/vite/traceViewer/uiMode.XVPIqBeS.js +0 -5
@@ -130,11 +130,10 @@ class Screenshotter {
130
130
  this._queue = new TaskQueue();
131
131
  }
132
132
  async _originalViewportSize(progress) {
133
- const originalViewportSize = this._page.viewportSize();
134
- let viewportSize = originalViewportSize;
133
+ let viewportSize = this._page.emulatedSize()?.viewport;
135
134
  if (!viewportSize)
136
135
  viewportSize = await this._page.mainFrame().waitForFunctionValueInUtility(progress, () => ({ width: window.innerWidth, height: window.innerHeight }));
137
- return { viewportSize, originalViewportSize };
136
+ return viewportSize;
138
137
  }
139
138
  async _fullPageSize(progress) {
140
139
  const fullPageSize = await this._page.mainFrame().waitForFunctionValueInUtility(progress, () => {
@@ -165,116 +164,118 @@ class Screenshotter {
165
164
  const format = validateScreenshotOptions(options);
166
165
  return this._queue.postTask(async () => {
167
166
  progress.log("taking page screenshot");
168
- const { viewportSize } = await this._originalViewportSize(progress);
167
+ const viewportSize = await this._originalViewportSize(progress);
169
168
  await this._preparePageForScreenshot(progress, this._page.mainFrame(), options.style, options.caret !== "initial", options.animations === "disabled");
170
- progress.throwIfAborted();
171
- if (options.fullPage) {
172
- const fullPageSize = await this._fullPageSize(progress);
173
- let documentRect = { x: 0, y: 0, width: fullPageSize.width, height: fullPageSize.height };
174
- const fitsViewport = fullPageSize.width <= viewportSize.width && fullPageSize.height <= viewportSize.height;
175
- if (options.clip)
176
- documentRect = trimClipToSize(options.clip, documentRect);
177
- const buffer2 = await this._screenshot(progress, format, documentRect, void 0, fitsViewport, options);
178
- progress.throwIfAborted();
169
+ try {
170
+ if (options.fullPage) {
171
+ const fullPageSize = await this._fullPageSize(progress);
172
+ let documentRect = { x: 0, y: 0, width: fullPageSize.width, height: fullPageSize.height };
173
+ const fitsViewport = fullPageSize.width <= viewportSize.width && fullPageSize.height <= viewportSize.height;
174
+ if (options.clip)
175
+ documentRect = trimClipToSize(options.clip, documentRect);
176
+ return await this._screenshot(progress, format, documentRect, void 0, fitsViewport, options);
177
+ }
178
+ const viewportRect = options.clip ? trimClipToSize(options.clip, viewportSize) : { x: 0, y: 0, ...viewportSize };
179
+ return await this._screenshot(progress, format, void 0, viewportRect, true, options);
180
+ } finally {
179
181
  await this._restorePageAfterScreenshot();
180
- return buffer2;
181
182
  }
182
- const viewportRect = options.clip ? trimClipToSize(options.clip, viewportSize) : { x: 0, y: 0, ...viewportSize };
183
- const buffer = await this._screenshot(progress, format, void 0, viewportRect, true, options);
184
- progress.throwIfAborted();
185
- await this._restorePageAfterScreenshot();
186
- return buffer;
187
183
  });
188
184
  }
189
185
  async screenshotElement(progress, handle, options) {
190
186
  const format = validateScreenshotOptions(options);
191
187
  return this._queue.postTask(async () => {
192
188
  progress.log("taking element screenshot");
193
- const { viewportSize } = await this._originalViewportSize(progress);
189
+ const viewportSize = await this._originalViewportSize(progress);
194
190
  await this._preparePageForScreenshot(progress, handle._frame, options.style, options.caret !== "initial", options.animations === "disabled");
195
- progress.throwIfAborted();
196
- await handle._waitAndScrollIntoViewIfNeeded(
197
- progress,
198
- true
199
- /* waitForVisible */
200
- );
201
- progress.throwIfAborted();
202
- const boundingBox = await handle.boundingBox();
203
- (0, import_utils.assert)(boundingBox, "Node is either not visible or not an HTMLElement");
204
- (0, import_utils.assert)(boundingBox.width !== 0, "Node has 0 width.");
205
- (0, import_utils.assert)(boundingBox.height !== 0, "Node has 0 height.");
206
- const fitsViewport = boundingBox.width <= viewportSize.width && boundingBox.height <= viewportSize.height;
207
- progress.throwIfAborted();
208
- const scrollOffset = await this._page.mainFrame().waitForFunctionValueInUtility(progress, () => ({ x: window.scrollX, y: window.scrollY }));
209
- const documentRect = { ...boundingBox };
210
- documentRect.x += scrollOffset.x;
211
- documentRect.y += scrollOffset.y;
212
- const buffer = await this._screenshot(progress, format, import_helper.helper.enclosingIntRect(documentRect), void 0, fitsViewport, options);
213
- progress.throwIfAborted();
214
- await this._restorePageAfterScreenshot();
215
- return buffer;
191
+ try {
192
+ await handle._waitAndScrollIntoViewIfNeeded(
193
+ progress,
194
+ true
195
+ /* waitForVisible */
196
+ );
197
+ const boundingBox = await progress.race(handle.boundingBox());
198
+ (0, import_utils.assert)(boundingBox, "Node is either not visible or not an HTMLElement");
199
+ (0, import_utils.assert)(boundingBox.width !== 0, "Node has 0 width.");
200
+ (0, import_utils.assert)(boundingBox.height !== 0, "Node has 0 height.");
201
+ const fitsViewport = boundingBox.width <= viewportSize.width && boundingBox.height <= viewportSize.height;
202
+ const scrollOffset = await this._page.mainFrame().waitForFunctionValueInUtility(progress, () => ({ x: window.scrollX, y: window.scrollY }));
203
+ const documentRect = { ...boundingBox };
204
+ documentRect.x += scrollOffset.x;
205
+ documentRect.y += scrollOffset.y;
206
+ return await this._screenshot(progress, format, import_helper.helper.enclosingIntRect(documentRect), void 0, fitsViewport, options);
207
+ } finally {
208
+ await this._restorePageAfterScreenshot();
209
+ }
216
210
  });
217
211
  }
218
212
  async _preparePageForScreenshot(progress, frame, screenshotStyle, hideCaret, disableAnimations) {
219
213
  if (disableAnimations)
220
214
  progress.log(" disabled all CSS animations");
221
- const syncAnimations = this._page._delegate.shouldToggleStyleSheetToSyncAnimations();
222
- await this._page.safeNonStallingEvaluateInAllFrames("(" + inPagePrepareForScreenshots.toString() + `)(${JSON.stringify(screenshotStyle)}, ${hideCaret}, ${disableAnimations}, ${syncAnimations})`, "utility");
223
- if (!process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY) {
224
- progress.log("waiting for fonts to load...");
225
- await frame.nonStallingEvaluateInExistingContext("document.fonts.ready", "utility").catch(() => {
226
- });
227
- progress.log("fonts loaded");
215
+ const syncAnimations = this._page.delegate.shouldToggleStyleSheetToSyncAnimations();
216
+ await progress.race(this._page.safeNonStallingEvaluateInAllFrames("(" + inPagePrepareForScreenshots.toString() + `)(${JSON.stringify(screenshotStyle)}, ${hideCaret}, ${disableAnimations}, ${syncAnimations})`, "utility"));
217
+ try {
218
+ if (!process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY) {
219
+ progress.log("waiting for fonts to load...");
220
+ await progress.race(frame.nonStallingEvaluateInExistingContext("document.fonts.ready", "utility").catch(() => {
221
+ }));
222
+ progress.log("fonts loaded");
223
+ }
224
+ } catch (error) {
225
+ await this._restorePageAfterScreenshot();
226
+ throw error;
228
227
  }
229
- progress.cleanupWhenAborted(() => this._restorePageAfterScreenshot());
230
228
  }
231
229
  async _restorePageAfterScreenshot() {
232
230
  await this._page.safeNonStallingEvaluateInAllFrames("window.__pwCleanupScreenshot && window.__pwCleanupScreenshot()", "utility");
233
231
  }
234
232
  async _maskElements(progress, options) {
235
- const framesToParsedSelectors = new import_multimap.MultiMap();
236
- const cleanup = async () => {
237
- await Promise.all([...framesToParsedSelectors.keys()].map(async (frame) => {
238
- await frame.hideHighlight();
239
- }));
240
- };
241
233
  if (!options.mask || !options.mask.length)
242
- return cleanup;
243
- await Promise.all((options.mask || []).map(async ({ frame, selector }) => {
234
+ return () => Promise.resolve();
235
+ const framesToParsedSelectors = new import_multimap.MultiMap();
236
+ await progress.race(Promise.all((options.mask || []).map(async ({ frame, selector }) => {
244
237
  const pair = await frame.selectors.resolveFrameForSelector(selector);
245
238
  if (pair)
246
239
  framesToParsedSelectors.set(pair.frame, pair.info.parsed);
247
- }));
248
- progress.throwIfAborted();
249
- await Promise.all([...framesToParsedSelectors.keys()].map(async (frame) => {
250
- await frame.maskSelectors(framesToParsedSelectors.get(frame), options.maskColor || "#F0F");
251
- }));
252
- progress.cleanupWhenAborted(cleanup);
253
- return cleanup;
240
+ })));
241
+ const frames = [...framesToParsedSelectors.keys()];
242
+ const cleanup = async () => {
243
+ await Promise.all(frames.map((frame) => frame.hideHighlight()));
244
+ };
245
+ try {
246
+ const promises = frames.map((frame) => frame.maskSelectors(framesToParsedSelectors.get(frame), options.maskColor || "#F0F"));
247
+ await progress.race(Promise.all(promises));
248
+ return cleanup;
249
+ } catch (error) {
250
+ cleanup().catch(() => {
251
+ });
252
+ throw error;
253
+ }
254
254
  }
255
255
  async _screenshot(progress, format, documentRect, viewportRect, fitsViewport, options) {
256
256
  if (options.__testHookBeforeScreenshot)
257
- await options.__testHookBeforeScreenshot();
258
- progress.throwIfAborted();
257
+ await progress.race(options.__testHookBeforeScreenshot());
259
258
  const shouldSetDefaultBackground = options.omitBackground && format === "png";
260
- if (shouldSetDefaultBackground) {
261
- await this._page._delegate.setBackgroundColor({ r: 0, g: 0, b: 0, a: 0 });
262
- progress.cleanupWhenAborted(() => this._page._delegate.setBackgroundColor());
263
- }
264
- progress.throwIfAborted();
265
- const cleanupHighlight = await this._maskElements(progress, options);
266
- progress.throwIfAborted();
267
- const quality = format === "jpeg" ? options.quality ?? 80 : void 0;
268
- const buffer = await this._page._delegate.takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, options.scale || "device");
269
- progress.throwIfAborted();
270
- await cleanupHighlight();
271
- progress.throwIfAborted();
272
259
  if (shouldSetDefaultBackground)
273
- await this._page._delegate.setBackgroundColor();
274
- progress.throwIfAborted();
275
- if (options.__testHookAfterScreenshot)
276
- await options.__testHookAfterScreenshot();
277
- return buffer;
260
+ await progress.race(this._page.delegate.setBackgroundColor({ r: 0, g: 0, b: 0, a: 0 }));
261
+ const cleanupHighlight = await this._maskElements(progress, options);
262
+ try {
263
+ const quality = format === "jpeg" ? options.quality ?? 80 : void 0;
264
+ const buffer = await this._page.delegate.takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, options.scale || "device");
265
+ await cleanupHighlight();
266
+ if (shouldSetDefaultBackground)
267
+ await this._page.delegate.setBackgroundColor();
268
+ if (options.__testHookAfterScreenshot)
269
+ await progress.race(options.__testHookAfterScreenshot());
270
+ return buffer;
271
+ } catch (error) {
272
+ cleanupHighlight().catch(() => {
273
+ });
274
+ if (shouldSetDefaultBackground)
275
+ this._page.delegate.setBackgroundColor().catch(() => {
276
+ });
277
+ throw error;
278
+ }
278
279
  }
279
280
  }
280
281
  class TaskQueue {
@@ -24,9 +24,8 @@ module.exports = __toCommonJS(selectors_exports);
24
24
  var import_crypto = require("./utils/crypto");
25
25
  var import_selectorParser = require("../utils/isomorphic/selectorParser");
26
26
  class Selectors {
27
- constructor() {
27
+ constructor(engines, testIdAttributeName) {
28
28
  this.guid = `selectors@${(0, import_crypto.createGuid)()}`;
29
- this._testIdAttributeName = "data-testid";
30
29
  this._builtinEngines = /* @__PURE__ */ new Set([
31
30
  "css",
32
31
  "css:light",
@@ -60,6 +59,7 @@ class Selectors {
60
59
  "internal:text",
61
60
  "internal:role",
62
61
  "internal:testid",
62
+ "internal:describe",
63
63
  "aria-ref"
64
64
  ]);
65
65
  this._builtinEnginesInMainWorld = /* @__PURE__ */ new Set([
@@ -67,15 +67,18 @@ class Selectors {
67
67
  "_vue"
68
68
  ]);
69
69
  this._engines = /* @__PURE__ */ new Map();
70
+ this._testIdAttributeName = testIdAttributeName ?? "data-testid";
71
+ for (const engine of engines)
72
+ this.register(engine);
70
73
  }
71
- async register(name, source, contentScript = false) {
72
- if (!name.match(/^[a-zA-Z_0-9-]+$/))
74
+ register(engine) {
75
+ if (!engine.name.match(/^[a-zA-Z_0-9-]+$/))
73
76
  throw new Error("Selector engine name may only contain [a-zA-Z0-9_] characters");
74
- if (this._builtinEngines.has(name) || name === "zs" || name === "zs:light")
75
- throw new Error(`"${name}" is a predefined selector engine`);
76
- if (this._engines.has(name))
77
- throw new Error(`"${name}" selector engine has been already registered`);
78
- this._engines.set(name, { source, contentScript });
77
+ if (this._builtinEngines.has(engine.name) || engine.name === "zs" || engine.name === "zs:light")
78
+ throw new Error(`"${engine.name}" is a predefined selector engine`);
79
+ if (this._engines.has(engine.name))
80
+ throw new Error(`"${engine.name}" selector engine has been already registered`);
81
+ this._engines.set(engine.name, engine);
79
82
  }
80
83
  testIdAttributeName() {
81
84
  return this._testIdAttributeName;
@@ -83,9 +86,6 @@ class Selectors {
83
86
  setTestIdAttributeName(testIdAttributeName) {
84
87
  this._testIdAttributeName = testIdAttributeName;
85
88
  }
86
- unregisterAll() {
87
- this._engines.clear();
88
- }
89
89
  parseSelector(selector, strict) {
90
90
  const parsed = typeof selector === "string" ? (0, import_selectorParser.parseSelector)(selector) : selector;
91
91
  let needsMainWorld = false;