patchright-core 1.50.1 → 1.51.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 (242) hide show
  1. package/ThirdPartyNotices.txt +1 -43
  2. package/browsers.json +22 -10
  3. package/index.js +0 -1
  4. package/lib/androidServerImpl.js +4 -4
  5. package/lib/browserServerImpl.js +18 -9
  6. package/lib/cli/driver.js +6 -6
  7. package/lib/cli/program.js +9 -9
  8. package/lib/cli/programWithTestStub.js +2 -1
  9. package/lib/client/android.js +37 -58
  10. package/lib/client/artifact.js +4 -7
  11. package/lib/client/browser.js +10 -15
  12. package/lib/client/browserContext.js +77 -73
  13. package/lib/client/browserType.js +30 -64
  14. package/lib/client/channelOwner.js +23 -20
  15. package/lib/client/clientHelper.js +5 -7
  16. package/lib/client/clientStackTrace.js +65 -0
  17. package/lib/client/connection.js +46 -39
  18. package/lib/client/consoleMessage.js +4 -7
  19. package/lib/client/electron.js +10 -10
  20. package/lib/client/elementHandle.js +32 -33
  21. package/lib/client/errors.js +2 -2
  22. package/lib/client/eventEmitter.js +5 -8
  23. package/lib/client/fetch.js +60 -61
  24. package/lib/client/fileUtils.js +31 -0
  25. package/lib/client/frame.js +30 -29
  26. package/lib/client/harRouter.js +7 -9
  27. package/lib/client/jsHandle.js +3 -4
  28. package/lib/client/localUtils.js +24 -0
  29. package/lib/client/locator.js +37 -18
  30. package/lib/client/network.js +40 -40
  31. package/lib/client/page.js +59 -55
  32. package/lib/client/platform.js +71 -0
  33. package/lib/client/playwright.js +21 -1
  34. package/lib/client/selectors.js +8 -2
  35. package/lib/client/stream.js +2 -21
  36. package/lib/client/timeoutSettings.js +65 -0
  37. package/lib/client/tracing.js +10 -7
  38. package/lib/client/video.js +2 -2
  39. package/lib/client/waiter.js +5 -6
  40. package/lib/client/webSocket.js +106 -0
  41. package/lib/client/worker.js +12 -10
  42. package/lib/client/writableStream.js +2 -21
  43. package/lib/generated/consoleApiSource.js +1 -1
  44. package/lib/generated/injectedScriptSource.js +1 -1
  45. package/lib/inProcessFactory.js +6 -3
  46. package/lib/outofprocess.js +12 -8
  47. package/lib/protocol/validator.js +64 -13
  48. package/lib/protocol/validatorPrimitives.js +1 -2
  49. package/lib/remote/playwrightConnection.js +18 -10
  50. package/lib/remote/playwrightServer.js +20 -7
  51. package/lib/server/android/android.js +17 -14
  52. package/lib/server/android/backendAdb.js +14 -14
  53. package/lib/server/artifact.js +3 -3
  54. package/lib/server/bidi/bidiBrowser.js +2 -2
  55. package/lib/server/bidi/bidiChromium.js +4 -3
  56. package/lib/server/bidi/bidiConnection.js +1 -1
  57. package/lib/server/bidi/bidiExecutionContext.js +70 -40
  58. package/lib/server/bidi/bidiFirefox.js +4 -3
  59. package/lib/server/bidi/bidiInput.js +5 -8
  60. package/lib/server/bidi/bidiNetworkManager.js +3 -3
  61. package/lib/server/bidi/bidiOverCdp.js +2 -2
  62. package/lib/server/bidi/bidiPage.js +30 -46
  63. package/lib/server/bidi/third_party/firefoxPrefs.js +19 -3
  64. package/lib/server/browser.js +2 -2
  65. package/lib/server/browserContext.js +37 -40
  66. package/lib/server/browserType.js +18 -17
  67. package/lib/{utils/sequence.js → server/callLog.js} +18 -3
  68. package/lib/server/chromium/chromium.js +14 -14
  69. package/lib/server/chromium/chromiumSwitches.js +32 -1
  70. package/lib/server/chromium/crBrowser.js +15 -14
  71. package/lib/server/chromium/crConnection.js +2 -2
  72. package/lib/server/chromium/crCoverage.js +1 -1
  73. package/lib/server/chromium/crDevTools.js +1 -1
  74. package/lib/server/chromium/crDragDrop.js +1 -1
  75. package/lib/server/chromium/crExecutionContext.js +25 -17
  76. package/lib/server/chromium/crInput.js +2 -2
  77. package/lib/server/chromium/crNetworkManager.js +73 -26
  78. package/lib/server/chromium/crPage.js +22 -23
  79. package/lib/server/chromium/crPdf.js +1 -1
  80. package/lib/server/chromium/crProtocolHelper.js +3 -3
  81. package/lib/server/chromium/crServiceWorker.js +2 -2
  82. package/lib/server/chromium/videoRecorder.js +2 -2
  83. package/lib/server/clock.js +1 -1
  84. package/lib/server/codegen/javascript.js +1 -1
  85. package/lib/server/codegen/languages.js +2 -2
  86. package/lib/server/debugController.js +3 -3
  87. package/lib/server/deviceDescriptors.js +1 -1
  88. package/lib/server/deviceDescriptorsSource.json +131 -131
  89. package/lib/server/dispatchers/androidDispatcher.js +1 -1
  90. package/lib/server/dispatchers/artifactDispatcher.js +3 -3
  91. package/lib/server/dispatchers/browserContextDispatcher.js +19 -19
  92. package/lib/server/dispatchers/browserTypeDispatcher.js +1 -1
  93. package/lib/server/dispatchers/cdpSessionDispatcher.js +1 -1
  94. package/lib/server/dispatchers/dispatcher.js +27 -25
  95. package/lib/server/dispatchers/electronDispatcher.js +3 -3
  96. package/lib/server/dispatchers/elementHandlerDispatcher.js +7 -2
  97. package/lib/server/dispatchers/frameDispatcher.js +4 -4
  98. package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
  99. package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
  100. package/lib/server/dispatchers/localUtilsDispatcher.js +25 -298
  101. package/lib/server/dispatchers/networkDispatchers.js +3 -3
  102. package/lib/server/dispatchers/pageDispatcher.js +11 -9
  103. package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
  104. package/lib/server/dispatchers/streamDispatcher.js +4 -3
  105. package/lib/server/dispatchers/webSocketRouteDispatcher.js +8 -7
  106. package/lib/server/dispatchers/writableStreamDispatcher.js +5 -6
  107. package/lib/server/dom.js +18 -12
  108. package/lib/server/download.js +1 -1
  109. package/lib/server/electron/electron.js +17 -16
  110. package/lib/server/errors.js +1 -1
  111. package/lib/server/fetch.js +36 -25
  112. package/lib/server/fileUploadUtils.js +7 -4
  113. package/lib/server/firefox/ffBrowser.js +8 -2
  114. package/lib/server/firefox/ffConnection.js +1 -1
  115. package/lib/server/firefox/ffExecutionContext.js +25 -17
  116. package/lib/server/firefox/ffNetworkManager.js +2 -2
  117. package/lib/server/firefox/ffPage.js +15 -21
  118. package/lib/server/firefox/firefox.js +7 -9
  119. package/lib/server/frameSelectors.js +1 -1
  120. package/lib/server/frames.js +366 -209
  121. package/lib/server/har/harRecorder.js +4 -4
  122. package/lib/server/har/harTracer.js +7 -8
  123. package/lib/server/harBackend.js +157 -0
  124. package/lib/server/helper.js +2 -2
  125. package/lib/server/index.js +1 -8
  126. package/lib/server/input.js +1 -1
  127. package/lib/server/instrumentation.js +2 -2
  128. package/lib/server/isomorphic/utilityScriptSerializers.js +3 -0
  129. package/lib/server/javascript.js +46 -33
  130. package/lib/server/launchApp.js +2 -2
  131. package/lib/server/localUtils.js +203 -0
  132. package/lib/server/network.js +3 -3
  133. package/lib/server/page.js +41 -22
  134. package/lib/server/pipeTransport.js +1 -1
  135. package/lib/server/playwright.js +5 -5
  136. package/lib/server/progress.js +1 -1
  137. package/lib/server/protocolError.js +1 -1
  138. package/lib/server/recorder/contextRecorder.js +3 -3
  139. package/lib/server/recorder/recorderApp.js +18 -12
  140. package/lib/server/recorder/recorderCollection.js +3 -3
  141. package/lib/server/recorder/throttledFile.js +3 -4
  142. package/lib/server/recorder.js +7 -5
  143. package/lib/server/registry/browserFetcher.js +9 -7
  144. package/lib/server/registry/dependencies.js +15 -15
  145. package/lib/server/registry/index.js +38 -44
  146. package/lib/server/registry/oopDownloadBrowserMain.js +3 -3
  147. package/lib/server/screenshotter.js +1 -1
  148. package/lib/server/selectors.js +3 -3
  149. package/lib/server/socksClientCertificatesInterceptor.js +8 -8
  150. package/lib/server/socksInterceptor.js +8 -5
  151. package/lib/server/storageScript.js +160 -0
  152. package/lib/{common → server}/timeoutSettings.js +6 -5
  153. package/lib/server/trace/recorder/snapshotter.js +9 -8
  154. package/lib/server/trace/recorder/tracing.js +40 -31
  155. package/lib/server/trace/test/inMemorySnapshotter.js +4 -4
  156. package/lib/server/trace/viewer/traceViewer.js +13 -5
  157. package/lib/server/transport.js +2 -2
  158. package/lib/{utils → server/utils}/comparators.js +4 -4
  159. package/lib/{utils → server/utils}/crypto.js +4 -4
  160. package/lib/{utils → server/utils}/debug.js +4 -12
  161. package/lib/{utils → server/utils}/debugLogger.js +2 -2
  162. package/lib/{utils → server/utils}/env.js +4 -0
  163. package/lib/{utils → server/utils}/expectUtils.js +1 -1
  164. package/lib/{utils → server/utils}/fileUtils.js +4 -5
  165. package/lib/{utils/happy-eyeballs.js → server/utils/happyEyeballs.js} +22 -24
  166. package/lib/{utils → server/utils}/hostPlatform.js +1 -1
  167. package/lib/{utils → server/utils}/httpServer.js +8 -8
  168. package/lib/{utils → server/utils}/linuxUtils.js +3 -23
  169. package/lib/{utils → server/utils}/network.js +4 -4
  170. package/lib/server/utils/nodePlatform.js +140 -0
  171. package/lib/{protocol/transport.js → server/utils/pipeTransport.js} +2 -2
  172. package/lib/{utils → server/utils}/processLauncher.js +5 -5
  173. package/lib/{utils → server/utils}/profiler.js +5 -6
  174. package/lib/{common → server/utils}/socksProxy.js +10 -9
  175. package/lib/{utils → server/utils}/userAgent.js +2 -16
  176. package/lib/{utils → server/utils}/wsServer.js +3 -3
  177. package/lib/{utils → server/utils}/zipFile.js +1 -1
  178. package/lib/{utils → server/utils}/zones.js +9 -24
  179. package/lib/server/webkit/webkit.js +4 -4
  180. package/lib/server/webkit/wkBrowser.js +4 -4
  181. package/lib/server/webkit/wkConnection.js +1 -1
  182. package/lib/server/webkit/wkExecutionContext.js +25 -17
  183. package/lib/server/webkit/wkInput.js +2 -2
  184. package/lib/server/webkit/wkInterceptableRequest.js +2 -2
  185. package/lib/server/webkit/wkPage.js +41 -40
  186. package/lib/server/webkit/wkProvisionalPage.js +1 -1
  187. package/lib/server/webkit/wkWorkers.js +2 -2
  188. package/lib/utils/isomorphic/ariaSnapshot.js +2 -1
  189. package/lib/utils/isomorphic/assert.js +25 -0
  190. package/lib/utils/isomorphic/colors.js +65 -0
  191. package/lib/utils/isomorphic/cssParser.js +1 -1
  192. package/lib/utils/isomorphic/locatorGenerators.js +13 -1
  193. package/lib/utils/isomorphic/locatorParser.js +2 -2
  194. package/lib/utils/{manualPromise.js → isomorphic/manualPromise.js} +3 -5
  195. package/lib/utils/isomorphic/mimeType.js +11 -3
  196. package/lib/utils/{multimap.js → isomorphic/multimap.js} +1 -3
  197. package/lib/utils/{rtti.js → isomorphic/rtti.js} +2 -5
  198. package/lib/utils/isomorphic/stackTrace.js +169 -0
  199. package/lib/utils/isomorphic/stringUtils.js +1 -1
  200. package/lib/utils/{time.js → isomorphic/time.js} +1 -13
  201. package/lib/utils/{timeoutRunner.js → isomorphic/timeoutRunner.js} +4 -4
  202. package/lib/utils/isomorphic/traceUtils.js +23 -0
  203. package/lib/{utils/index.js → utils.js} +200 -121
  204. package/lib/utilsBundle.js +1 -25
  205. package/lib/utilsBundleImpl/index.js +114 -116
  206. package/lib/vite/htmlReport/index.html +20 -20
  207. package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +24 -0
  208. package/lib/vite/recorder/assets/index-ELPgmkwA.js +184 -0
  209. package/lib/vite/recorder/index.html +1 -1
  210. package/lib/vite/traceViewer/assets/codeMirrorModule-DpJ-EmBQ.js +24 -0
  211. package/lib/vite/traceViewer/assets/defaultSettingsView-DTenqiGw.js +259 -0
  212. package/lib/vite/traceViewer/assets/{xtermModule-c-SNdYZy.js → xtermModule-BoAIEibi.js} +7 -7
  213. package/lib/vite/traceViewer/defaultSettingsView.5fN5lw10.css +1 -0
  214. package/lib/vite/traceViewer/index.CUq7VgrV.js +2 -0
  215. package/lib/vite/traceViewer/index.html +3 -3
  216. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  217. package/lib/vite/traceViewer/uiMode.CHJSAD7F.js +5 -0
  218. package/lib/vite/traceViewer/uiMode.html +3 -3
  219. package/lib/zipBundleImpl.js +4 -4
  220. package/package.json +7 -7
  221. package/types/protocol.d.ts +123 -99
  222. package/types/types.d.ts +91 -37
  223. package/lib/utils/stackTrace.js +0 -134
  224. package/lib/utils/traceUtils.js +0 -44
  225. package/lib/vite/recorder/assets/codeMirrorModule-CNAqJrkA.js +0 -24
  226. package/lib/vite/recorder/assets/index-DGS0JLxS.js +0 -184
  227. package/lib/vite/traceViewer/assets/codeMirrorModule-D55P_UuL.js +0 -24
  228. package/lib/vite/traceViewer/assets/defaultSettingsView-B-uNoFsX.js +0 -243
  229. package/lib/vite/traceViewer/defaultSettingsView.2xeEXCXv.css +0 -1
  230. package/lib/vite/traceViewer/index.BfvuujqP.js +0 -2
  231. package/lib/vite/traceViewer/uiMode.CStJu6jo.js +0 -5
  232. /package/lib/{utils → server/utils}/ascii.js +0 -0
  233. /package/lib/{utils → server/utils}/eventsHelper.js +0 -0
  234. /package/lib/{image_tools → server/utils/image_tools}/colorUtils.js +0 -0
  235. /package/lib/{image_tools → server/utils/image_tools}/compare.js +0 -0
  236. /package/lib/{image_tools → server/utils/image_tools}/imageChannel.js +0 -0
  237. /package/lib/{image_tools → server/utils/image_tools}/stats.js +0 -0
  238. /package/lib/{utils → server/utils}/spawnAsync.js +0 -0
  239. /package/lib/{utils → server/utils}/task.js +0 -0
  240. /package/lib/utils/{headers.js → isomorphic/headers.js} +0 -0
  241. /package/lib/utils/{semaphore.js → isomorphic/semaphore.js} +0 -0
  242. /package/lib/{common → utils/isomorphic}/types.js +0 -0
@@ -8,26 +8,27 @@ var _crExecutionContext = require("./chromium/crExecutionContext");
8
8
  var _dom = _interopRequireWildcard(require("./dom"));
9
9
  var dom = _dom;
10
10
  var _crypto = _interopRequireDefault(require("crypto"));
11
+ var _browserContext = require("./browserContext");
12
+ var _errors = require("./errors");
13
+ var _fileUploadUtils = require("./fileUploadUtils");
14
+ var _frameSelectors = require("./frameSelectors");
11
15
  var _helper = require("./helper");
12
- var _eventsHelper = require("../utils/eventsHelper");
16
+ var _instrumentation = require("./instrumentation");
13
17
  var js = _interopRequireWildcard(require("./javascript"));
14
18
  var network = _interopRequireWildcard(require("./network"));
15
19
  var _page = require("./page");
16
- var types = _interopRequireWildcard(require("./types"));
17
- var _browserContext = require("./browserContext");
18
20
  var _progress = require("./progress");
21
+ var types = _interopRequireWildcard(require("./types"));
19
22
  var _utils = require("../utils");
20
- var _manualPromise = require("../utils/manualPromise");
21
- var _debugLogger = require("../utils/debugLogger");
22
- var _instrumentation = require("./instrumentation");
23
- var _protocolError = require("./protocolError");
24
- var _selectorParser = require("../utils/isomorphic/selectorParser");
25
- var _frameSelectors = require("./frameSelectors");
26
- var _errors = require("./errors");
27
- var _fileUploadUtils = require("./fileUploadUtils");
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+ var _protocolError2 = require("./protocolError");
24
+ var _debugLogger = require("./utils/debugLogger");
25
+ var _eventsHelper = require("./utils/eventsHelper");
26
+ var _selectorParser2 = require("../utils/isomorphic/selectorParser");
27
+ var _manualPromise = require("../utils/isomorphic/manualPromise");
28
+ var _callLog = require("./callLog");
29
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
29
30
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
30
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
31
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
31
32
  // undetected-undetected_playwright-patch - custom imports
32
33
 
33
34
  /**
@@ -735,49 +736,28 @@ class Frame extends _instrumentation.SdkObject {
735
736
  const {
736
737
  state = 'visible'
737
738
  } = options;
738
- const promise = this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
739
- if (performActionPreChecks) await this._page.performActionPreChecks(progress);
740
- const resolved = await this.selectors.resolveInjectedForSelector(selector, options, scope);
741
- progress.throwIfAborted();
742
- if (!resolved) {
743
- if (state === 'hidden' || state === 'detached') return null;
744
- return continuePolling;
745
- }
746
- const result = await resolved.injected.evaluateHandle((injected, {
747
- info,
748
- root
749
- }) => {
750
- if (root && !root.isConnected) throw injected.createStacklessError('Element is not attached to the DOM');
751
- const elements = injected.querySelectorAll(info.parsed, root || document);
752
- const element = elements[0];
753
- const visible = element ? injected.utils.isElementVisible(element) : false;
754
- let log = '';
755
- if (elements.length > 1) {
756
- if (info.strict) throw injected.strictModeViolationError(info.parsed, elements);
757
- log = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`;
758
- } else if (element) {
759
- log = ` locator resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`;
739
+ const promise = this._retryWithProgressIfNotConnected(progress, selector, options.strict, true, async handle => {
740
+ const attached = !!handle;
741
+ var visible = false;
742
+ if (attached) {
743
+ if (handle.parentNode.constructor.name == "ElementHandle") {
744
+ visible = await handle.parentNode.evaluateInUtility(([injected, node, {
745
+ handle
746
+ }]) => {
747
+ return handle ? injected.utils.isElementVisible(handle) : false;
748
+ }, {
749
+ handle
750
+ });
751
+ } else {
752
+ visible = await handle.parentNode.evaluate((injected, {
753
+ handle
754
+ }) => {
755
+ return handle ? injected.utils.isElementVisible(handle) : false;
756
+ }, {
757
+ handle
758
+ });
760
759
  }
761
- return {
762
- log,
763
- element,
764
- visible,
765
- attached: !!element
766
- };
767
- }, {
768
- info: resolved.info,
769
- root: resolved.frame === this ? scope : undefined
770
- });
771
- const {
772
- log,
773
- visible,
774
- attached
775
- } = await result.evaluate(r => ({
776
- log: r.log,
777
- visible: r.visible,
778
- attached: r.attached
779
- }));
780
- if (log) progress.log(log);
760
+ }
781
761
  const success = {
782
762
  attached,
783
763
  detached: !attached,
@@ -785,23 +765,20 @@ class Frame extends _instrumentation.SdkObject {
785
765
  hidden: !visible
786
766
  }[state];
787
767
  if (!success) {
788
- result.dispose();
789
- return continuePolling;
768
+ return "internal:continuepolling";
790
769
  }
791
770
  if (options.omitReturnValue) {
792
- result.dispose();
793
771
  return null;
794
772
  }
795
- const element = state === 'attached' || state === 'visible' ? await result.evaluateHandle(r => r.element) : null;
796
- result.dispose();
773
+ const element = state === 'attached' || state === 'visible' ? handle : null;
797
774
  if (!element) return null;
798
775
  if (options.__testHookBeforeAdoptNode) await options.__testHookBeforeAdoptNode();
799
776
  try {
800
- return await element._adoptTo(await resolved.frame._mainContext());
777
+ return element;
801
778
  } catch (e) {
802
- return continuePolling;
779
+ return "internal:continuepolling";
803
780
  }
804
- });
781
+ }, 'returnOnNotResolved');
805
782
  return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
806
783
  }
807
784
  async dispatchEvent(metadata, selector, type, eventInit = {}, options = {}, scope) {
@@ -863,7 +840,7 @@ class Frame extends _instrumentation.SdkObject {
863
840
  return retVal;
864
841
  });
865
842
  } catch (e) {
866
- if (js.isJavaScriptErrorInEvaluate(e) || (0, _protocolError.isSessionClosedError)(e)) throw e;
843
+ if (js.isJavaScriptErrorInEvaluate(e) || (0, _protocolError2.isSessionClosedError)(e)) throw e;
867
844
  throw new Error(`Unable to retrieve content because the page is navigating and changing the content.`);
868
845
  }
869
846
  }
@@ -1053,70 +1030,78 @@ class Frame extends _instrumentation.SdkObject {
1053
1030
  }
1054
1031
  _isErrorThatCannotBeRetried(e) {
1055
1032
  // Always fail on JavaScript errors or when the main connection is closed.
1056
- if (js.isJavaScriptErrorInEvaluate(e) || (0, _protocolError.isSessionClosedError)(e)) return true;
1033
+ if (js.isJavaScriptErrorInEvaluate(e) || (0, _protocolError2.isSessionClosedError)(e)) return true;
1057
1034
  // Certain errors opt-out of the retries, throw.
1058
- if (dom.isNonRecoverableDOMError(e) || (0, _selectorParser.isInvalidSelectorError)(e)) return true;
1035
+ if (dom.isNonRecoverableDOMError(e) || (0, _selectorParser2.isInvalidSelectorError)(e)) return true;
1059
1036
  // If the call is made on the detached frame - throw.
1060
1037
  if (this.isDetached()) return true;
1061
1038
  // Retry upon all other errors.
1062
1039
  return false;
1063
1040
  }
1064
- async _retryWithProgressIfNotConnected(progress, selector, strict, performActionPreChecks, action) {
1065
- progress.log(`waiting for ${this._asLocator(selector)}`);
1041
+ async _retryWithProgressIfNotConnected(progress, selector, strict, performActionPreChecks, action, returnAction) {
1042
+ progress.log("waiting for " + this._asLocator(selector));
1066
1043
  return this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
1067
1044
  if (performActionPreChecks) await this._page.performActionPreChecks(progress);
1068
1045
  const resolved = await this.selectors.resolveInjectedForSelector(selector, {
1069
1046
  strict
1070
1047
  });
1071
1048
  progress.throwIfAborted();
1072
- if (!resolved) return continuePolling;
1073
- const result = await resolved.injected.evaluateHandle((injected, {
1074
- info,
1075
- callId
1076
- }) => {
1077
- const elements = injected.querySelectorAll(info.parsed, document);
1078
- if (callId) injected.markTargetElements(new Set(elements), callId);
1079
- const element = elements[0];
1080
- let log = '';
1081
- if (elements.length > 1) {
1082
- if (info.strict) throw injected.strictModeViolationError(info.parsed, elements);
1083
- log = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`;
1084
- } else if (element) {
1085
- log = ` locator resolved to ${injected.previewNode(element)}`;
1086
- }
1087
- return {
1088
- log,
1089
- success: !!element,
1090
- element
1091
- };
1092
- }, {
1093
- info: resolved.info,
1094
- callId: progress.metadata.id
1049
+ if (!resolved) {
1050
+ if (returnAction === 'returnOnNotResolved' || returnAction === 'returnAll') return null;
1051
+ return continuePolling;
1052
+ }
1053
+ try {
1054
+ var client = this._page._delegate._sessionForFrame(resolved.frame)._client;
1055
+ } catch (e) {
1056
+ var client = this._page._delegate._mainFrameSession._client;
1057
+ }
1058
+ var context = await resolved.frame._context("main");
1059
+ const documentNode = await client.send('Runtime.evaluate', {
1060
+ expression: "document",
1061
+ serializationOptions: {
1062
+ serialization: "idOnly"
1063
+ },
1064
+ contextId: context.delegate._contextId
1095
1065
  });
1096
- const {
1097
- log,
1098
- success
1099
- } = await result.evaluate(r => ({
1100
- log: r.log,
1101
- success: r.success
1102
- }));
1103
- if (log) progress.log(log);
1104
- if (!success) {
1105
- result.dispose();
1066
+ const documentScope = new dom.ElementHandle(context, documentNode.result.objectId);
1067
+ const currentScopingElements = await this._customFindElementsByParsed(resolved, client, context, documentScope, progress, resolved.info.parsed);
1068
+ if (currentScopingElements.length == 0) {
1069
+ // TODO: Dispose?
1070
+ if (returnAction === 'returnOnNotResolved' || returnAction === 'returnAll') return null;
1106
1071
  return continuePolling;
1107
1072
  }
1108
- const element = await result.evaluateHandle(r => r.element);
1109
- result.dispose();
1073
+ const resultElement = currentScopingElements[0];
1074
+ if (currentScopingElements.length > 1) {
1075
+ if (resolved.info.strict) {
1076
+ await resolved.injected.evaluateHandle((injected, {
1077
+ info,
1078
+ elements
1079
+ }) => {
1080
+ throw injected.strictModeViolationError(info.parsed, elements);
1081
+ }, {
1082
+ info: resolved.info,
1083
+ elements: currentScopingElements
1084
+ });
1085
+ }
1086
+ progress.log(" locator resolved to " + currentScopingElements.length + " elements. Proceeding with the first one: " + resultElement.preview());
1087
+ } else if (resultElement) {
1088
+ progress.log(" locator resolved to " + resultElement.preview());
1089
+ }
1110
1090
  try {
1111
- const result = await action(element);
1091
+ var result = null;
1092
+ if (returnAction === 'returnAll') {
1093
+ result = await action([resultElement, currentScopingElements]);
1094
+ } else {
1095
+ result = await action(resultElement);
1096
+ }
1112
1097
  if (result === 'error:notconnected') {
1113
1098
  progress.log('element was detached from the DOM, retrying');
1114
1099
  return continuePolling;
1100
+ } else if (result === 'internal:continuepolling') {
1101
+ return continuePolling;
1115
1102
  }
1116
1103
  return result;
1117
- } finally {
1118
- element === null || element === void 0 || element.dispose();
1119
- }
1104
+ } finally {}
1120
1105
  });
1121
1106
  }
1122
1107
  async rafrafTimeoutScreenshotElementWithProgress(progress, selector, timeout, options) {
@@ -1255,22 +1240,42 @@ class Frame extends _instrumentation.SdkObject {
1255
1240
  }
1256
1241
  async isVisibleInternal(selector, options = {}, scope) {
1257
1242
  try {
1258
- const resolved = await this.selectors.resolveInjectedForSelector(selector, options, scope);
1259
- if (!resolved) return false;
1260
- return await resolved.injected.evaluate((injected, {
1261
- info,
1262
- root
1263
- }) => {
1264
- const element = injected.querySelector(info.parsed, root || document, info.strict);
1265
- const state = element ? injected.elementState(element, 'visible') : {
1266
- matches: false,
1267
- received: 'error:notconnected'
1268
- };
1269
- return state.matches;
1270
- }, {
1271
- info: resolved.info,
1272
- root: resolved.frame === this ? scope : undefined
1273
- });
1243
+ const custom_metadata = {
1244
+ "internal": false,
1245
+ "log": []
1246
+ };
1247
+ const controller = new _progress.ProgressController(custom_metadata, this);
1248
+ return await controller.run(async progress => {
1249
+ progress.log("waiting for " + this._asLocator(selector));
1250
+ const promise = this._retryWithProgressIfNotConnected(progress, selector, options.strict, false, async handle => {
1251
+ if (handle.parentNode.constructor.name == "ElementHandle") {
1252
+ return await handle.parentNode.evaluateInUtility(([injected, node, {
1253
+ handle
1254
+ }]) => {
1255
+ const state = handle ? injected.elementState(handle, 'visible') : {
1256
+ matches: false,
1257
+ received: 'error:notconnected'
1258
+ };
1259
+ return state.matches;
1260
+ }, {
1261
+ handle
1262
+ });
1263
+ } else {
1264
+ return await handle.parentNode.evaluate((injected, {
1265
+ handle
1266
+ }) => {
1267
+ const state = handle ? injected.elementState(handle, 'visible') : {
1268
+ matches: false,
1269
+ received: 'error:notconnected'
1270
+ };
1271
+ return state.matches;
1272
+ }, {
1273
+ handle
1274
+ });
1275
+ }
1276
+ });
1277
+ return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
1278
+ }, 100); // A bit geeky but its okay :D
1274
1279
  } catch (e) {
1275
1280
  if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e) || (0, _protocolError.isSessionClosedError)(e)) throw e;
1276
1281
  return false;
@@ -1343,7 +1348,7 @@ class Frame extends _instrumentation.SdkObject {
1343
1348
  async ariaSnapshot(metadata, selector, options = {}) {
1344
1349
  const controller = new _progress.ProgressController(metadata, this);
1345
1350
  return controller.run(async progress => {
1346
- return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, true /* performActionPreChecks */, handle => handle.ariaSnapshot());
1351
+ return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, true /* performActionPreChecks */, handle => handle.ariaSnapshot(options));
1347
1352
  }, this._page._timeoutSettings.timeout(options));
1348
1353
  }
1349
1354
  async expect(metadata, selector, options) {
@@ -1381,7 +1386,7 @@ class Frame extends _instrumentation.SdkObject {
1381
1386
  });
1382
1387
  if (resultOneShot.matches !== options.isNot) return resultOneShot;
1383
1388
  } catch (e) {
1384
- if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e)) throw e;
1389
+ if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser2.isInvalidSelectorError)(e)) throw e;
1385
1390
  // Ignore any other errors from one-shot, we'll handle them during retries.
1386
1391
  }
1387
1392
  if (timeout > 0) {
@@ -1390,7 +1395,7 @@ class Frame extends _instrumentation.SdkObject {
1390
1395
  }
1391
1396
  if (timeout < 0) return {
1392
1397
  matches: options.isNot,
1393
- log: (0, _utils.compressCallLog)(metadata.log),
1398
+ log: (0, _callLog.compressCallLog)(metadata.log),
1394
1399
  timedOut: true,
1395
1400
  received: lastIntermediateResult.received
1396
1401
  };
@@ -1418,10 +1423,10 @@ class Frame extends _instrumentation.SdkObject {
1418
1423
  } catch (e) {
1419
1424
  // Q: Why not throw upon isSessionClosedError(e) as in other places?
1420
1425
  // A: We want user to receive a friendly message containing the last intermediate result.
1421
- if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e)) throw e;
1426
+ if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser2.isInvalidSelectorError)(e)) throw e;
1422
1427
  const result = {
1423
1428
  matches: options.isNot,
1424
- log: (0, _utils.compressCallLog)(metadata.log)
1429
+ log: (0, _callLog.compressCallLog)(metadata.log)
1425
1430
  };
1426
1431
  if (lastIntermediateResult.isSet) result.received = lastIntermediateResult.received;
1427
1432
  if (e instanceof _errors.TimeoutError) result.timedOut = true;
@@ -1429,52 +1434,55 @@ class Frame extends _instrumentation.SdkObject {
1429
1434
  }
1430
1435
  }
1431
1436
  async _expectInternal(progress, selector, options, lastIntermediateResult) {
1432
- var _info$world;
1433
- const selectorInFrame = await this.selectors.resolveFrameForSelector(selector, {
1434
- strict: true
1435
- });
1436
- progress.throwIfAborted();
1437
- const {
1438
- frame,
1439
- info
1440
- } = selectorInFrame || {
1441
- frame: this,
1442
- info: undefined
1443
- };
1444
- const world = options.expression === 'to.have.property' ? 'main' : (_info$world = info === null || info === void 0 ? void 0 : info.world) !== null && _info$world !== void 0 ? _info$world : 'utility';
1445
- const context = await frame._context(world);
1446
- const injected = await context.injectedScript();
1447
- progress.throwIfAborted();
1448
- const {
1449
- log,
1450
- matches,
1451
- received,
1452
- missingReceived
1453
- } = await injected.evaluate(async (injected, {
1454
- info,
1455
- options,
1456
- callId
1457
- }) => {
1458
- const elements = info ? injected.querySelectorAll(info.parsed, document) : [];
1459
- if (callId) injected.markTargetElements(new Set(elements), callId);
1460
- const isArray = options.expression === 'to.have.count' || options.expression.endsWith('.array');
1461
- let log = '';
1462
- if (isArray) log = ` locator resolved to ${elements.length} element${elements.length === 1 ? '' : 's'}`;else if (elements.length > 1) throw injected.strictModeViolationError(info.parsed, elements);else if (elements.length) log = ` locator resolved to ${injected.previewNode(elements[0])}`;
1463
- return {
1464
- log,
1465
- ...(await injected.expect(elements[0], options, elements))
1466
- };
1467
- }, {
1468
- info,
1469
- options,
1470
- callId: progress.metadata.id
1471
- });
1472
- if (log) progress.log(log);
1473
- // Note: missingReceived avoids `unexpected value "undefined"` when element was not found.
1437
+ progress.log("waiting for " + this._asLocator(selector));
1438
+ const isArray = options.expression === 'to.have.count' || options.expression.endsWith('.array');
1439
+ const promise = await this._retryWithProgressIfNotConnected(progress, selector, !isArray, false, async result => {
1440
+ const handle = result[0];
1441
+ const handles = result[1];
1442
+ if (handle.parentNode.constructor.name == "ElementHandle") {
1443
+ return await handle.parentNode.evaluateInUtility(async ([injected, node, {
1444
+ handle,
1445
+ options,
1446
+ handles
1447
+ }]) => {
1448
+ return await injected.expect(handle, options, handles);
1449
+ }, {
1450
+ handle,
1451
+ options,
1452
+ handles
1453
+ });
1454
+ } else {
1455
+ return await handle.parentNode.evaluate(async (injected, {
1456
+ handle,
1457
+ options,
1458
+ handles
1459
+ }) => {
1460
+ return await injected.expect(handle, options, handles);
1461
+ }, {
1462
+ handle,
1463
+ options,
1464
+ handles
1465
+ });
1466
+ }
1467
+ }, 'returnAll');
1468
+
1469
+ // Default Values, if no Elements found
1470
+ var matches = false;
1471
+ var received = 0;
1472
+ var missingReceived = null;
1473
+ if (promise) {
1474
+ matches = promise.matches;
1475
+ received = promise.received;
1476
+ missingReceived = promise.missingReceived;
1477
+ } else if (options.expectedNumber === 0) {
1478
+ matches = true;
1479
+ }
1480
+
1481
+ // Note: missingReceived avoids unexpected value "undefined" when element was not found.
1474
1482
  if (matches === options.isNot) {
1475
1483
  lastIntermediateResult.received = missingReceived ? '<element(s) not found>' : received;
1476
1484
  lastIntermediateResult.isSet = true;
1477
- if (!missingReceived && !Array.isArray(received)) progress.log(` unexpected value "${renderUnexpectedValue(options.expression, received)}"`);
1485
+ if (!missingReceived && !Array.isArray(received)) progress.log(' unexpected value "' + renderUnexpectedValue(options.expression, received) + '"');
1478
1486
  }
1479
1487
  return {
1480
1488
  matches,
@@ -1589,44 +1597,35 @@ class Frame extends _instrumentation.SdkObject {
1589
1597
  const callbackText = body.toString();
1590
1598
  const controller = new _progress.ProgressController(metadata, this);
1591
1599
  return controller.run(async progress => {
1592
- progress.log(`waiting for ${this._asLocator(selector)}`);
1593
- const promise = this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
1594
- const resolved = await this.selectors.resolveInjectedForSelector(selector, options, scope);
1595
- progress.throwIfAborted();
1596
- if (!resolved) return continuePolling;
1597
- const {
1598
- log,
1599
- success,
1600
- value
1601
- } = await resolved.injected.evaluate((injected, {
1602
- info,
1603
- callbackText,
1604
- taskData,
1605
- callId,
1606
- root
1607
- }) => {
1608
- const callback = injected.eval(callbackText);
1609
- const element = injected.querySelector(info.parsed, root || document, info.strict);
1610
- if (!element) return {
1611
- success: false
1612
- };
1613
- const log = ` locator resolved to ${injected.previewNode(element)}`;
1614
- if (callId) injected.markTargetElements(new Set([element]), callId);
1615
- return {
1616
- log,
1617
- success: true,
1618
- value: callback(injected, element, taskData)
1619
- };
1620
- }, {
1621
- info: resolved.info,
1622
- callbackText,
1623
- taskData,
1624
- callId: progress.metadata.id,
1625
- root: resolved.frame === this ? scope : undefined
1626
- });
1627
- if (log) progress.log(log);
1628
- if (!success) return continuePolling;
1629
- return value;
1600
+ progress.log("waiting for " + this._asLocator(selector));
1601
+ const promise = this._retryWithProgressIfNotConnected(progress, selector, false, false, async handle => {
1602
+ if (handle.parentNode.constructor.name == "ElementHandle") {
1603
+ return await handle.parentNode.evaluateInUtility(([injected, node, {
1604
+ callbackText,
1605
+ handle,
1606
+ taskData
1607
+ }]) => {
1608
+ const callback = injected.eval(callbackText);
1609
+ return callback(injected, handle, taskData);
1610
+ }, {
1611
+ callbackText,
1612
+ handle,
1613
+ taskData
1614
+ });
1615
+ } else {
1616
+ return await handle.parentNode.evaluate((injected, {
1617
+ callbackText,
1618
+ handle,
1619
+ taskData
1620
+ }) => {
1621
+ const callback = injected.eval(callbackText);
1622
+ return callback(injected, handle, taskData);
1623
+ }, {
1624
+ callbackText,
1625
+ handle,
1626
+ taskData
1627
+ });
1628
+ }
1630
1629
  });
1631
1630
  return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
1632
1631
  }, this._page._timeoutSettings.timeout(options));
@@ -1741,6 +1740,164 @@ class Frame extends _instrumentation.SdkObject {
1741
1740
  } catch (e) {}
1742
1741
  return 0;
1743
1742
  }
1743
+ async _customFindElementsByParsed(resolved, client, context, documentScope, progress, parsed) {
1744
+ var parsedEdits = {
1745
+ ...parsed
1746
+ };
1747
+ // Note: We start scoping at document level
1748
+ var currentScopingElements = [documentScope];
1749
+ while (parsed.parts.length > 0) {
1750
+ var part = parsed.parts.shift();
1751
+ parsedEdits.parts = [part];
1752
+ var isUsingXPath = false;
1753
+ // Getting All Elements
1754
+ var elements = [];
1755
+ var elementsIndexes = [];
1756
+ if (part.name == "xpath") {
1757
+ isUsingXPath = true;
1758
+ } else if (part.name == "nth") {
1759
+ const partNth = Number(part.body);
1760
+ if (partNth > currentScopingElements.length || partNth < -currentScopingElements.length) {
1761
+ return continuePolling;
1762
+ } else {
1763
+ currentScopingElements = [currentScopingElements.at(partNth)];
1764
+ continue;
1765
+ }
1766
+ } else if (part.name == "internal:or") {
1767
+ var orredElements = await this._customFindElementsByParsed(resolved, client, context, documentScope, progress, part.body.parsed);
1768
+ elements = currentScopingElements.concat(orredElements);
1769
+ } else if (part.name == "internal:and") {
1770
+ var andedElements = await this._customFindElementsByParsed(resolved, client, context, documentScope, progress, part.body.parsed);
1771
+ const backendNodeIds = new Set(andedElements.map(item => item.backendNodeId));
1772
+ elements = currentScopingElements.filter(item => backendNodeIds.has(item.backendNodeId));
1773
+ } else {
1774
+ for (const scope of currentScopingElements) {
1775
+ const describedScope = await client.send('DOM.describeNode', {
1776
+ objectId: scope._objectId,
1777
+ depth: -1,
1778
+ pierce: true
1779
+ });
1780
+
1781
+ // Elements Queryed in the "current round"
1782
+ var queryingElements = [];
1783
+ if (!isUsingXPath) {
1784
+ function findClosedShadowRoots(node, results = []) {
1785
+ if (!node || typeof node !== 'object') return results;
1786
+ if (node.shadowRoots && Array.isArray(node.shadowRoots)) {
1787
+ for (const shadowRoot of node.shadowRoots) {
1788
+ if (shadowRoot.shadowRootType === 'closed' && shadowRoot.backendNodeId) {
1789
+ results.push(shadowRoot.backendNodeId);
1790
+ }
1791
+ findClosedShadowRoots(shadowRoot, results);
1792
+ }
1793
+ }
1794
+ if (node.nodeName !== 'IFRAME' && node.children && Array.isArray(node.children)) {
1795
+ for (const child of node.children) {
1796
+ findClosedShadowRoots(child, results);
1797
+ }
1798
+ }
1799
+ return results;
1800
+ }
1801
+ var shadowRootBackendIds = findClosedShadowRoots(describedScope.node);
1802
+ var shadowRoots = [];
1803
+ for (var shadowRootBackendId of shadowRootBackendIds) {
1804
+ var resolvedShadowRoot = await client.send('DOM.resolveNode', {
1805
+ backendNodeId: shadowRootBackendId,
1806
+ contextId: context.delegate._contextId
1807
+ });
1808
+ shadowRoots.push(new dom.ElementHandle(context, resolvedShadowRoot.object.objectId));
1809
+ }
1810
+ for (var shadowRoot of shadowRoots) {
1811
+ const shadowElements = await shadowRoot.evaluateHandleInUtility(([injected, node, {
1812
+ parsed,
1813
+ callId
1814
+ }]) => {
1815
+ const elements = injected.querySelectorAll(parsed, node);
1816
+ if (callId) injected.markTargetElements(new Set(elements), callId);
1817
+ return elements;
1818
+ }, {
1819
+ parsed: parsedEdits,
1820
+ callId: progress.metadata.id
1821
+ });
1822
+ const shadowElementsAmount = await shadowElements.getProperty("length");
1823
+ queryingElements.push([shadowElements, shadowElementsAmount, shadowRoot]);
1824
+ }
1825
+ }
1826
+
1827
+ // Document Root Elements (not in CSR)
1828
+ const rootElements = await scope.evaluateHandleInUtility(([injected, node, {
1829
+ parsed,
1830
+ callId
1831
+ }]) => {
1832
+ const elements = injected.querySelectorAll(parsed, node);
1833
+ if (callId) injected.markTargetElements(new Set(elements), callId);
1834
+ return elements;
1835
+ }, {
1836
+ parsed: parsedEdits,
1837
+ callId: progress.metadata.id
1838
+ });
1839
+ const rootElementsAmount = await rootElements.getProperty("length");
1840
+ queryingElements.push([rootElements, rootElementsAmount, resolved.injected]);
1841
+
1842
+ // Querying and Sorting the elements by their backendNodeId
1843
+ for (var queryedElement of queryingElements) {
1844
+ var elementsToCheck = queryedElement[0];
1845
+ var elementsAmount = await queryedElement[1].jsonValue();
1846
+ var parentNode = queryedElement[2];
1847
+ for (var i = 0; i < elementsAmount; i++) {
1848
+ if (parentNode.constructor.name == "ElementHandle") {
1849
+ var elementToCheck = await parentNode.evaluateHandleInUtility(([injected, node, {
1850
+ index,
1851
+ elementsToCheck
1852
+ }]) => {
1853
+ return elementsToCheck[index];
1854
+ }, {
1855
+ index: i,
1856
+ elementsToCheck: elementsToCheck
1857
+ });
1858
+ } else {
1859
+ var elementToCheck = await parentNode.evaluateHandle((injected, {
1860
+ index,
1861
+ elementsToCheck
1862
+ }) => {
1863
+ return elementsToCheck[index];
1864
+ }, {
1865
+ index: i,
1866
+ elementsToCheck: elementsToCheck
1867
+ });
1868
+ }
1869
+ // For other Functions/Utilities
1870
+ elementToCheck.parentNode = parentNode;
1871
+ var resolvedElement = await client.send('DOM.describeNode', {
1872
+ objectId: elementToCheck._objectId,
1873
+ depth: -1
1874
+ });
1875
+ // Note: Possible Bug, Maybe well actually have to check the Documents Node Position instead of using the backendNodeId
1876
+ elementToCheck.backendNodeId = resolvedElement.node.backendNodeId;
1877
+ elements.push(elementToCheck);
1878
+ }
1879
+ }
1880
+ }
1881
+ }
1882
+ // Setting currentScopingElements to the elements we just queried
1883
+ currentScopingElements = [];
1884
+ for (var element of elements) {
1885
+ var elemIndex = element.backendNodeId;
1886
+ // Sorting the Elements by their occourance in the DOM
1887
+ var elemPos = elementsIndexes.findIndex(index => index > elemIndex);
1888
+
1889
+ // Sort the elements by their backendNodeId
1890
+ if (elemPos === -1) {
1891
+ currentScopingElements.push(element);
1892
+ elementsIndexes.push(elemIndex);
1893
+ } else {
1894
+ currentScopingElements.splice(elemPos, 0, element);
1895
+ elementsIndexes.splice(elemPos, 0, elemIndex);
1896
+ }
1897
+ }
1898
+ }
1899
+ return currentScopingElements;
1900
+ }
1744
1901
  }
1745
1902
  exports.Frame = Frame;
1746
1903
  Frame.Events = {