patchright-core 1.52.5 → 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 +54 -32
  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 +30 -26
  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 +421 -345
  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 +43 -31
  72. package/lib/server/chromium/crPage.js +98 -72
  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 +98 -101
  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 +63 -20
  123. package/lib/server/frames.js +495 -555
  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 +8 -16
  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 +232 -177
  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 +128 -17
  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
@@ -29,8 +29,8 @@ class FrameSelectors {
29
29
  this.frame = frame;
30
30
  }
31
31
  _parseSelector(selector, options) {
32
- const strict = typeof options?.strict === "boolean" ? options.strict : !!this.frame._page.context()._options.strictSelectors;
33
- return this.frame._page.context().selectors().parseSelector(selector, strict);
32
+ const strict = typeof options?.strict === "boolean" ? options.strict : !!this.frame._page.browserContext._options.strictSelectors;
33
+ return this.frame._page.browserContext.selectors().parseSelector(selector, strict);
34
34
  }
35
35
  async query(selector, options, scope) {
36
36
  const resolved = await this.resolveInjectedForSelector(selector, options, scope);
@@ -54,10 +54,11 @@ class FrameSelectors {
54
54
  return injected.querySelectorAll(info.parsed, scope2 || document);
55
55
  }, { info: resolved.info, scope: resolved.scope });
56
56
  }
57
- async queryCount(selector) {
57
+ async queryCount(selector, options) {
58
58
  const resolved = await this.resolveInjectedForSelector(selector);
59
59
  if (!resolved)
60
60
  throw new Error(`Failed to find frame for selector "${selector}"`);
61
+ await options.__testHookBeforeQuery?.();
61
62
  return await resolved.injected.evaluate((injected, { info }) => {
62
63
  return injected.querySelectorAll(info.parsed, document).length;
63
64
  }, { info: resolved.info });
@@ -82,19 +83,35 @@ class FrameSelectors {
82
83
  }
83
84
  return Promise.all(result);
84
85
  }
86
+ _jumpToAriaRefFrameIfNeeded(selector, info, frame) {
87
+ if (info.parsed.parts[0].name !== "aria-ref")
88
+ return frame;
89
+ const body = info.parsed.parts[0].body;
90
+ const match = body.match(/^f(\d+)e\d+$/);
91
+ if (!match)
92
+ return frame;
93
+ const frameIndex = +match[1];
94
+ const page = this.frame._page;
95
+ const frameId = page.lastSnapshotFrameIds[frameIndex - 1];
96
+ const jumptToFrame = frameId ? page.frameManager.frame(frameId) : null;
97
+ if (!jumptToFrame)
98
+ throw new import_selectorParser.InvalidSelectorError(`Invalid frame in aria-ref selector "${selector}"`);
99
+ return jumptToFrame;
100
+ }
85
101
  async resolveFrameForSelector(selector, options = {}, scope) {
86
102
  let frame = this.frame;
87
103
  const frameChunks = (0, import_selectorParser.splitSelectorByFrame)(selector);
88
104
  for (const chunk of frameChunks) {
89
105
  (0, import_selectorParser.visitAllSelectorParts)(chunk, (part, nested) => {
90
106
  if (nested && part.name === "internal:control" && part.body === "enter-frame") {
91
- const locator = (0, import_utils.asLocator)(this.frame._page.attribution.playwright.options.sdkLanguage, selector);
107
+ const locator = (0, import_utils.asLocator)(this.frame._page.browserContext._browser.sdkLanguage(), selector);
92
108
  throw new import_selectorParser.InvalidSelectorError(`Frame locators are not allowed inside composite locators, while querying "${locator}"`);
93
109
  }
94
110
  });
95
111
  }
96
112
  for (let i = 0; i < frameChunks.length - 1; ++i) {
97
113
  const info = this._parseSelector(frameChunks[i], options);
114
+ frame = this._jumpToAriaRefFrameIfNeeded(selector, info, frame);
98
115
  const context = await frame._context(info.world);
99
116
  const injectedScript = await context.injectedScript();
100
117
  const handle = await injectedScript.evaluateHandle((injected, { info: info2, scope: scope2, selectorString }) => {
@@ -106,9 +123,9 @@ class FrameSelectors {
106
123
  let element = handle.asElement();
107
124
  if (!element) {
108
125
  try {
109
- var client = frame._page._delegate._sessionForFrame(frame)._client;
126
+ var client = frame._page.delegate._sessionForFrame(frame)._client;
110
127
  } catch (e) {
111
- var client = frame._page._delegate._mainFrameSession._client;
128
+ var client = frame._page.delegate._mainFrameSession._client;
112
129
  }
113
130
  var mainContext = await frame._context("main");
114
131
  const documentNode = await client.send("Runtime.evaluate", {
@@ -126,7 +143,7 @@ class FrameSelectors {
126
143
  return null;
127
144
  }
128
145
  }
129
- const maybeFrame = await frame._page._delegate.getContentFrame(element);
146
+ const maybeFrame = await frame._page.delegate.getContentFrame(element);
130
147
  element.dispose();
131
148
  if (!maybeFrame)
132
149
  return null;
@@ -134,7 +151,9 @@ class FrameSelectors {
134
151
  }
135
152
  if (frame !== this.frame)
136
153
  scope = void 0;
137
- return { frame, info: frame.selectors._parseSelector(frameChunks[frameChunks.length - 1], options), scope };
154
+ const lastChunk = frame.selectors._parseSelector(frameChunks[frameChunks.length - 1], options);
155
+ frame = this._jumpToAriaRefFrameIfNeeded(selector, lastChunk, frame);
156
+ return { frame, info: lastChunk, scope };
138
157
  }
139
158
  async resolveInjectedForSelector(selector, options, scope) {
140
159
  const resolved = await this.resolveFrameForSelector(selector, options, scope);
@@ -240,31 +259,55 @@ class FrameSelectors {
240
259
  depth: -1
241
260
  });
242
261
  elementToCheck.backendNodeId = resolvedElement.node.backendNodeId;
262
+ elementToCheck.nodePosition = this._findElementPositionInDomTree(elementToCheck, describedScope.node, describedScope.node, "");
243
263
  elements.push(elementToCheck);
244
264
  }
245
265
  }
246
266
  }
247
267
  }
248
- currentScopingElements = [];
249
- for (var element of elements) {
250
- var elemIndex = element.backendNodeId;
251
- var elemPos = elementsIndexes.findIndex((index) => index > elemIndex);
252
- if (elemPos === -1) {
253
- currentScopingElements.push(element);
254
- elementsIndexes.push(elemIndex);
255
- } else {
256
- currentScopingElements.splice(elemPos, 0, element);
257
- elementsIndexes.splice(elemPos, 0, elemIndex);
268
+ const getParts = (pos) => (pos?.match(/../g) || []).map(Number);
269
+ elements.sort((a, b) => {
270
+ const partA = getParts(a.nodePosition);
271
+ const partB = getParts(b.nodePosition);
272
+ const maxLength = Math.max(partA.length, partB.length);
273
+ for (let i2 = 0; i2 < maxLength; i2++) {
274
+ const aVal = partA[i2] ?? -1;
275
+ const bVal = partB[i2] ?? -1;
276
+ if (aVal !== bVal) return aVal - bVal;
258
277
  }
259
- }
278
+ return 0;
279
+ });
280
+ currentScopingElements = Array.from(
281
+ new Map(elements.map((e) => [e.nodePosition, e])).values()
282
+ );
260
283
  }
261
284
  return currentScopingElements;
262
285
  }
286
+ _findElementPositionInDomTree(element, queryingElement, documentScope, currentIndex) {
287
+ if (element.backendNodeId === queryingElement.backendNodeId) {
288
+ return currentIndex;
289
+ }
290
+ for (const child of queryingElement.children || []) {
291
+ const childrenNodeIndex = queryingElement.children.indexOf(child);
292
+ const childIndex = this._findElementPositionInDomTree(element, child, documentScope, currentIndex + childrenNodeIndex.toString());
293
+ if (childIndex !== null) return childIndex;
294
+ }
295
+ if (queryingElement.shadowRoots && Array.isArray(queryingElement.shadowRoots)) {
296
+ for (const shadowRoot of queryingElement.shadowRoots) {
297
+ if (shadowRoot.shadowRootType === "closed" && shadowRoot.backendNodeId) {
298
+ const shadowRootHandle = new dom.ElementHandle(documentScope, shadowRoot.backendNodeId);
299
+ const childIndex = this._findElementPositionInDomTree(element, shadowRootHandle, documentScope, currentIndex);
300
+ if (childIndex !== null) return childIndex;
301
+ }
302
+ }
303
+ }
304
+ return null;
305
+ }
263
306
  }
264
307
  async function adoptIfNeeded(handle, context) {
265
308
  if (handle._context === context)
266
309
  return handle;
267
- const adopted = await handle._page._delegate.adoptElementHandle(handle, context);
310
+ const adopted = await handle._page.delegate.adoptElementHandle(handle, context);
268
311
  handle.dispose();
269
312
  return adopted;
270
313
  }