@checkly/playwright-core 1.42.18 → 1.47.20-alpha

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 (238) hide show
  1. package/ThirdPartyNotices.txt +144 -109
  2. package/browsers.json +15 -25
  3. package/lib/androidServerImpl.js +1 -1
  4. package/lib/browserServerImpl.js +1 -1
  5. package/lib/cli/driver.js +1 -3
  6. package/lib/cli/program.js +5 -10
  7. package/lib/client/android.js +1 -1
  8. package/lib/client/api.js +7 -0
  9. package/lib/client/browserContext.js +37 -5
  10. package/lib/client/browserType.js +19 -11
  11. package/lib/client/channelOwner.js +19 -16
  12. package/lib/client/clientInstrumentation.js +17 -7
  13. package/lib/client/clock.js +68 -0
  14. package/lib/client/connection.js +9 -6
  15. package/lib/client/electron.js +7 -5
  16. package/lib/client/elementHandle.js +44 -14
  17. package/lib/client/eventEmitter.js +314 -0
  18. package/lib/client/fetch.js +81 -28
  19. package/lib/client/frame.js +2 -4
  20. package/lib/client/jsHandle.js +7 -1
  21. package/lib/client/locator.js +9 -0
  22. package/lib/client/network.js +12 -9
  23. package/lib/client/page.js +45 -23
  24. package/lib/client/playwright.js +3 -0
  25. package/lib/client/tracing.js +7 -4
  26. package/lib/common/socksProxy.js +2 -2
  27. package/lib/generated/clockSource.js +7 -0
  28. package/lib/generated/injectedScriptSource.js +1 -1
  29. package/lib/generated/recorderSource.js +1 -1
  30. package/lib/generated/utilityScriptSource.js +1 -1
  31. package/lib/protocol/serializers.js +12 -11
  32. package/lib/protocol/validator.js +137 -55
  33. package/lib/server/bidi/bidiBrowser.js +296 -0
  34. package/lib/server/bidi/bidiConnection.js +206 -0
  35. package/lib/server/bidi/bidiExecutionContext.js +162 -0
  36. package/lib/server/bidi/bidiFirefox.js +110 -0
  37. package/lib/server/bidi/bidiInput.js +174 -0
  38. package/lib/server/bidi/bidiNetworkManager.js +304 -0
  39. package/lib/server/bidi/bidiPage.js +456 -0
  40. package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
  41. package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
  42. package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
  43. package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
  44. package/lib/server/browser.js +9 -1
  45. package/lib/server/browserContext.js +97 -22
  46. package/lib/server/browserType.js +27 -20
  47. package/lib/server/chromium/chromium.js +30 -15
  48. package/lib/server/chromium/chromiumSwitches.js +6 -3
  49. package/lib/server/chromium/crBrowser.js +11 -17
  50. package/lib/server/chromium/crConnection.js +2 -2
  51. package/lib/server/chromium/crDragDrop.js +28 -29
  52. package/lib/server/chromium/crNetworkManager.js +130 -84
  53. package/lib/server/chromium/crPage.js +34 -79
  54. package/lib/server/chromium/crProtocolHelper.js +3 -1
  55. package/lib/server/chromium/crServiceWorker.js +20 -23
  56. package/lib/server/chromium/videoRecorder.js +1 -1
  57. package/lib/server/clock.js +125 -0
  58. package/lib/server/codegen/csharp.js +299 -0
  59. package/lib/server/codegen/java.js +235 -0
  60. package/lib/server/codegen/javascript.js +223 -0
  61. package/lib/server/codegen/jsonl.js +47 -0
  62. package/lib/server/codegen/language.js +76 -0
  63. package/lib/server/codegen/languages.js +30 -0
  64. package/lib/server/codegen/python.js +265 -0
  65. package/lib/server/codegen/types.js +5 -0
  66. package/lib/server/debugController.js +3 -5
  67. package/lib/server/deviceDescriptors.js +9 -4
  68. package/lib/server/deviceDescriptorsSource.json +239 -119
  69. package/lib/server/dispatchers/androidDispatcher.js +1 -1
  70. package/lib/server/dispatchers/browserContextDispatcher.js +51 -7
  71. package/lib/server/dispatchers/dispatcher.js +36 -40
  72. package/lib/server/dispatchers/frameDispatcher.js +1 -2
  73. package/lib/server/dispatchers/jsHandleDispatcher.js +1 -1
  74. package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -6
  75. package/lib/server/dispatchers/localUtilsDispatcher.js +19 -5
  76. package/lib/server/dispatchers/networkDispatchers.js +2 -2
  77. package/lib/server/dispatchers/pageDispatcher.js +5 -2
  78. package/lib/server/dispatchers/playwrightDispatcher.js +1 -0
  79. package/lib/server/dispatchers/writableStreamDispatcher.js +8 -5
  80. package/lib/server/dom.js +90 -53
  81. package/lib/server/electron/electron.js +21 -4
  82. package/lib/server/fetch.js +74 -25
  83. package/lib/server/fileUploadUtils.js +7 -3
  84. package/lib/server/firefox/ffBrowser.js +36 -25
  85. package/lib/server/firefox/ffConnection.js +2 -2
  86. package/lib/server/firefox/ffNetworkManager.js +6 -4
  87. package/lib/server/firefox/ffPage.js +22 -24
  88. package/lib/server/firefox/firefox.js +25 -6
  89. package/lib/server/frameSelectors.js +2 -2
  90. package/lib/server/frames.js +205 -159
  91. package/lib/server/har/harTracer.js +4 -12
  92. package/lib/server/helper.js +3 -3
  93. package/lib/server/index.js +18 -0
  94. package/lib/server/input.js +18 -8
  95. package/lib/server/instrumentation.js +0 -4
  96. package/lib/server/isomorphic/utilityScriptSerializers.js +19 -5
  97. package/lib/server/javascript.js +3 -2
  98. package/lib/server/launchApp.js +3 -2
  99. package/lib/server/network.js +14 -4
  100. package/lib/server/page.js +75 -46
  101. package/lib/server/playwright.js +5 -2
  102. package/lib/server/recorder/codeGenerator.js +2 -1
  103. package/lib/server/recorder/contextRecorder.js +316 -0
  104. package/lib/server/recorder/csharp.js +2 -1
  105. package/lib/server/recorder/java.js +2 -1
  106. package/lib/server/recorder/javascript.js +2 -1
  107. package/lib/server/recorder/jsonl.js +2 -1
  108. package/lib/server/recorder/language.js +2 -1
  109. package/lib/server/recorder/python.js +2 -1
  110. package/lib/server/recorder/recorderApp.js +14 -5
  111. package/lib/server/recorder/recorderCollection.js +127 -0
  112. package/lib/server/recorder/recorderRunner.js +177 -0
  113. package/lib/server/recorder/recorderUtils.js +23 -0
  114. package/lib/server/recorder/throttledFile.js +46 -0
  115. package/lib/server/recorder/utils.js +2 -1
  116. package/lib/server/recorder.js +42 -418
  117. package/lib/server/registry/index.js +99 -100
  118. package/lib/server/registry/nativeDeps.js +107 -0
  119. package/lib/server/screenshotter.js +6 -12
  120. package/lib/server/socksClientCertificatesInterceptor.js +328 -0
  121. package/lib/server/trace/recorder/snapshotter.js +4 -1
  122. package/lib/server/trace/recorder/tracing.js +27 -96
  123. package/lib/server/trace/viewer/traceViewer.js +54 -67
  124. package/lib/server/transport.js +1 -1
  125. package/lib/server/webkit/webkit.js +5 -5
  126. package/lib/server/webkit/wkBrowser.js +14 -14
  127. package/lib/server/webkit/wkConnection.js +3 -3
  128. package/lib/server/webkit/wkInterceptableRequest.js +8 -4
  129. package/lib/server/webkit/wkPage.js +52 -34
  130. package/lib/server/webkit/wkProvisionalPage.js +36 -1
  131. package/lib/utils/crypto.js +141 -0
  132. package/lib/utils/debugLogger.js +2 -0
  133. package/lib/utils/env.js +4 -2
  134. package/lib/utils/expectUtils.js +33 -0
  135. package/lib/utils/fileUtils.js +140 -1
  136. package/lib/utils/glob.js +2 -1
  137. package/lib/utils/happy-eyeballs.js +29 -2
  138. package/lib/utils/hostPlatform.js +13 -4
  139. package/lib/utils/httpServer.js +54 -13
  140. package/lib/utils/index.js +53 -31
  141. package/lib/utils/isomorphic/cssTokenizer.js +1 -1
  142. package/lib/utils/isomorphic/locatorParser.js +1 -1
  143. package/lib/utils/isomorphic/mimeType.js +29 -0
  144. package/lib/utils/isomorphic/stringUtils.js +28 -1
  145. package/lib/utils/isomorphic/urlMatch.js +120 -0
  146. package/lib/utils/mimeType.js +2 -1
  147. package/lib/utils/network.js +7 -35
  148. package/lib/utils/stackTrace.js +2 -4
  149. package/lib/utils/timeoutRunner.js +11 -76
  150. package/lib/utils/zones.js +23 -60
  151. package/lib/utilsBundle.js +2 -1
  152. package/lib/utilsBundleImpl/index.js +33 -31
  153. package/lib/vite/htmlReport/index.html +12 -12
  154. package/lib/vite/recorder/assets/codeMirrorModule-C-fQ5QZD.js +24 -0
  155. package/lib/vite/recorder/assets/{codicon-zGuYmc9o.ttf → codicon-DCmgc-ay.ttf} +0 -0
  156. package/lib/vite/recorder/assets/index-B-MT5gKo.css +1 -0
  157. package/lib/vite/recorder/assets/index-D-5S5PPN.js +47 -0
  158. package/lib/vite/recorder/index.html +2 -2
  159. package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +16831 -0
  160. package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +24 -0
  161. package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +24 -0
  162. package/lib/vite/traceViewer/assets/codeMirrorModule-CqYUz5ms.js +24 -0
  163. package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
  164. package/lib/vite/traceViewer/assets/codeMirrorModule-T_sdMrbM.js +24 -0
  165. package/lib/vite/traceViewer/assets/codeMirrorModule-V7N6ppkd.js +15585 -0
  166. package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
  167. package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
  168. package/lib/vite/traceViewer/assets/workbench-Bjkiwcr1.js +19119 -0
  169. package/lib/vite/traceViewer/assets/workbench-C43LWZEX.js +72 -0
  170. package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
  171. package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
  172. package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
  173. package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
  174. package/lib/vite/traceViewer/assets/wsPort-EUvw-dwH.js +18540 -0
  175. package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
  176. package/lib/vite/traceViewer/assets/xtermModule-_6TC5FYT.js +6529 -0
  177. package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
  178. package/lib/vite/traceViewer/codeMirrorModule.svF_VrcJ.css +344 -0
  179. package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  180. package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
  181. package/lib/vite/traceViewer/embedded.BVDVQOzc.js +2 -0
  182. package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
  183. package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
  184. package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
  185. package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
  186. package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
  187. package/lib/vite/traceViewer/embedded.html +16 -0
  188. package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
  189. package/lib/vite/traceViewer/index.5mge2rY_.css +124 -0
  190. package/lib/vite/traceViewer/index.6KJ-JQ0L.js +180 -0
  191. package/lib/vite/traceViewer/index.B8dgQwuN.js +2 -0
  192. package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
  193. package/lib/vite/traceViewer/index.C0EgJ4oW.js +195 -0
  194. package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
  195. package/lib/vite/traceViewer/{index.-g_5lMbJ.css → index.CrbWWHbf.css} +1 -1
  196. package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
  197. package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
  198. package/lib/vite/traceViewer/index.html +5 -4
  199. package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
  200. package/lib/vite/traceViewer/snapshot.html +1 -1
  201. package/lib/vite/traceViewer/sw.bundle.js +3 -4
  202. package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
  203. package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +1 -0
  204. package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
  205. package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
  206. package/lib/vite/traceViewer/uiMode.DVrL7a1K.js +10 -0
  207. package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
  208. package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
  209. package/lib/vite/traceViewer/uiMode.html +5 -4
  210. package/lib/vite/traceViewer/uiMode.iq7CyYy7.js +1490 -0
  211. package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
  212. package/lib/vite/traceViewer/uiMode.xvJHbkzl.css +1324 -0
  213. package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
  214. package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
  215. package/lib/vite/traceViewer/wsPort.p5jUwABW.css +3450 -0
  216. package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
  217. package/lib/vite/traceViewer/xtermModule.OKEVRlkP.css +209 -0
  218. package/package.json +2 -2
  219. package/types/protocol.d.ts +960 -78
  220. package/types/structs.d.ts +1 -1
  221. package/types/types.d.ts +3083 -2448
  222. package/lib/vite/recorder/assets/codeMirrorModule-W69B4LBB.js +0 -24
  223. package/lib/vite/recorder/assets/index-Ly3PcVUb.js +0 -47
  224. package/lib/vite/recorder/assets/index-ljsTwXtJ.css +0 -1
  225. package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
  226. package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
  227. package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
  228. package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
  229. package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
  230. package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
  231. package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
  232. package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
  233. package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
  234. package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
  235. /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
  236. /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
  237. /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
  238. /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
@@ -19,7 +19,6 @@ var _debugLogger = require("../utils/debugLogger");
19
19
  var _instrumentation = require("./instrumentation");
20
20
  var _protocolError = require("./protocolError");
21
21
  var _selectorParser = require("../utils/isomorphic/selectorParser");
22
- var _locatorGenerators = require("../utils/isomorphic/locatorGenerators");
23
22
  var _frameSelectors = require("./frameSelectors");
24
23
  var _errors = require("./errors");
25
24
  var _fileUploadUtils = require("./fileUploadUtils");
@@ -109,13 +108,13 @@ class FrameManager {
109
108
  return frame;
110
109
  }
111
110
  }
112
- async waitForSignalsCreatedBy(progress, noWaitAfter, action, source) {
113
- if (noWaitAfter) return action();
111
+ async waitForSignalsCreatedBy(progress, waitAfter, action) {
112
+ if (!waitAfter) return action();
114
113
  const barrier = new SignalBarrier(progress);
115
114
  this._signalBarriers.add(barrier);
116
115
  if (progress) progress.cleanupWhenAborted(() => this._signalBarriers.delete(barrier));
117
116
  const result = await action();
118
- if (source === 'input') await this._page._delegate.inputActionEpilogue();
117
+ await this._page._delegate.inputActionEpilogue();
119
118
  await barrier.waitFor();
120
119
  this._signalBarriers.delete(barrier);
121
120
  // Resolve in the next task, after all waitForNavigations.
@@ -238,7 +237,7 @@ class FrameManager {
238
237
  request
239
238
  });
240
239
  if (request._isFavicon) {
241
- if (route) route.continue(request, {
240
+ route === null || route === void 0 || route.continue({
242
241
  isFallback: true
243
242
  }).catch(() => {});
244
243
  return;
@@ -459,13 +458,13 @@ class Frame extends _instrumentation.SdkObject {
459
458
  return context.rawEvaluateJSON(expression);
460
459
  });
461
460
  }
462
- nonStallingEvaluateInExistingContext(expression, isFunction, world) {
461
+ nonStallingEvaluateInExistingContext(expression, world) {
463
462
  return this.raceAgainstEvaluationStallingEvents(() => {
464
463
  var _this$_contextData$ge;
465
464
  const context = (_this$_contextData$ge = this._contextData.get(world)) === null || _this$_contextData$ge === void 0 ? void 0 : _this$_contextData$ge.context;
466
465
  if (!context) throw new Error('Frame does not yet have the execution context');
467
466
  return context.evaluateExpression(expression, {
468
- isFunction
467
+ isFunction: false
469
468
  });
470
469
  });
471
470
  }
@@ -530,16 +529,19 @@ class Frame extends _instrumentation.SdkObject {
530
529
  referer = options.referer;
531
530
  }
532
531
  url = _helper.helper.completeUserURL(url);
533
- const sameDocument = _helper.helper.waitForEvent(progress, this, Frame.Events.InternalNavigation, e => !e.newDocument);
534
- const navigateResult = await this._page._delegate.navigateFrame(this, url, referer);
532
+ const navigationEvents = [];
533
+ const collectNavigations = arg => navigationEvents.push(arg);
534
+ this.on(Frame.Events.InternalNavigation, collectNavigations);
535
+ const navigateResult = await this._page._delegate.navigateFrame(this, url, referer).finally(() => this.off(Frame.Events.InternalNavigation, collectNavigations));
535
536
  let event;
536
537
  if (navigateResult.newDocumentId) {
537
- sameDocument.dispose();
538
- event = await _helper.helper.waitForEvent(progress, this, Frame.Events.InternalNavigation, event => {
538
+ const predicate = event => {
539
539
  // We are interested either in this specific document, or any other document that
540
540
  // did commit and replaced the expected document.
541
541
  return event.newDocument && (event.newDocument.documentId === navigateResult.newDocumentId || !event.error);
542
- }).promise;
542
+ };
543
+ const events = navigationEvents.filter(predicate);
544
+ if (events.length) event = events[0];else event = await _helper.helper.waitForEvent(progress, this, Frame.Events.InternalNavigation, predicate).promise;
543
545
  if (event.newDocument.documentId !== navigateResult.newDocumentId) {
544
546
  // This is just a sanity check. In practice, new navigation should
545
547
  // cancel the previous one and report "request cancelled"-like error.
@@ -547,7 +549,10 @@ class Frame extends _instrumentation.SdkObject {
547
549
  }
548
550
  if (event.error) throw event.error;
549
551
  } else {
550
- event = await sameDocument.promise;
552
+ // Wait for same document navigation.
553
+ const predicate = e => !e.newDocument;
554
+ const events = navigationEvents.filter(predicate);
555
+ if (events.length) event = events[0];else event = await _helper.helper.waitForEvent(progress, this, Frame.Events.InternalNavigation, predicate).promise;
551
556
  }
552
557
  if (!this._firedLifecycleEvents.has(waitUntil)) await _helper.helper.waitForEvent(progress, this, Frame.Events.AddLifecycle, e => e === waitUntil).promise;
553
558
  const request = event.newDocument ? event.newDocument.request : undefined;
@@ -618,73 +623,79 @@ class Frame extends _instrumentation.SdkObject {
618
623
  if (!['attached', 'detached', 'visible', 'hidden'].includes(state)) throw new Error(`state: expected one of (attached|detached|visible|hidden)`);
619
624
  return controller.run(async progress => {
620
625
  progress.log(`waiting for ${this._asLocator(selector)}${state === 'attached' ? '' : ' to be ' + state}`);
621
- const promise = this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
622
- const resolved = await this.selectors.resolveInjectedForSelector(selector, options, scope);
623
- progress.throwIfAborted();
624
- if (!resolved) {
625
- if (state === 'hidden' || state === 'detached') return null;
626
- return continuePolling;
626
+ return await this.waitForSelectorInternal(progress, selector, options, scope);
627
+ }, this._page._timeoutSettings.timeout(options));
628
+ }
629
+ async waitForSelectorInternal(progress, selector, options, scope) {
630
+ const {
631
+ state = 'visible'
632
+ } = options;
633
+ const promise = this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
634
+ const resolved = await this.selectors.resolveInjectedForSelector(selector, options, scope);
635
+ progress.throwIfAborted();
636
+ if (!resolved) {
637
+ if (state === 'hidden' || state === 'detached') return null;
638
+ return continuePolling;
639
+ }
640
+ const result = await resolved.injected.evaluateHandle((injected, {
641
+ info,
642
+ root
643
+ }) => {
644
+ const elements = injected.querySelectorAll(info.parsed, root || document);
645
+ const element = elements[0];
646
+ const visible = element ? injected.utils.isElementVisible(element) : false;
647
+ let log = '';
648
+ if (elements.length > 1) {
649
+ if (info.strict) throw injected.strictModeViolationError(info.parsed, elements);
650
+ log = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`;
651
+ } else if (element) {
652
+ log = ` locator resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`;
627
653
  }
628
- const result = await resolved.injected.evaluateHandle((injected, {
629
- info,
630
- root
631
- }) => {
632
- const elements = injected.querySelectorAll(info.parsed, root || document);
633
- const element = elements[0];
634
- const visible = element ? injected.isVisible(element) : false;
635
- let log = '';
636
- if (elements.length > 1) {
637
- if (info.strict) throw injected.strictModeViolationError(info.parsed, elements);
638
- log = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`;
639
- } else if (element) {
640
- log = ` locator resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`;
641
- }
642
- return {
643
- log,
644
- element,
645
- visible,
646
- attached: !!element
647
- };
648
- }, {
649
- info: resolved.info,
650
- root: resolved.frame === this ? scope : undefined
651
- });
652
- const {
654
+ return {
653
655
  log,
656
+ element,
654
657
  visible,
655
- attached
656
- } = await result.evaluate(r => ({
657
- log: r.log,
658
- visible: r.visible,
659
- attached: r.attached
660
- }));
661
- if (log) progress.log(log);
662
- const success = {
663
- attached,
664
- detached: !attached,
665
- visible,
666
- hidden: !visible
667
- }[state];
668
- if (!success) {
669
- result.dispose();
670
- return continuePolling;
671
- }
672
- if (options.omitReturnValue) {
673
- result.dispose();
674
- return null;
675
- }
676
- const element = state === 'attached' || state === 'visible' ? await result.evaluateHandle(r => r.element) : null;
677
- result.dispose();
678
- if (!element) return null;
679
- if (options.__testHookBeforeAdoptNode) await options.__testHookBeforeAdoptNode();
680
- try {
681
- return await element._adoptTo(await resolved.frame._mainContext());
682
- } catch (e) {
683
- return continuePolling;
684
- }
658
+ attached: !!element
659
+ };
660
+ }, {
661
+ info: resolved.info,
662
+ root: resolved.frame === this ? scope : undefined
685
663
  });
686
- return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
687
- }, this._page._timeoutSettings.timeout(options));
664
+ const {
665
+ log,
666
+ visible,
667
+ attached
668
+ } = await result.evaluate(r => ({
669
+ log: r.log,
670
+ visible: r.visible,
671
+ attached: r.attached
672
+ }));
673
+ if (log) progress.log(log);
674
+ const success = {
675
+ attached,
676
+ detached: !attached,
677
+ visible,
678
+ hidden: !visible
679
+ }[state];
680
+ if (!success) {
681
+ result.dispose();
682
+ return continuePolling;
683
+ }
684
+ if (options.omitReturnValue) {
685
+ result.dispose();
686
+ return null;
687
+ }
688
+ const element = state === 'attached' || state === 'visible' ? await result.evaluateHandle(r => r.element) : null;
689
+ result.dispose();
690
+ if (!element) return null;
691
+ if (options.__testHookBeforeAdoptNode) await options.__testHookBeforeAdoptNode();
692
+ try {
693
+ return await element._adoptTo(await resolved.frame._mainContext());
694
+ } catch (e) {
695
+ return continuePolling;
696
+ }
697
+ });
698
+ return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
688
699
  }
689
700
  async dispatchEvent(metadata, selector, type, eventInit = {}, options = {}, scope) {
690
701
  await this._callOnElementOnceMatches(metadata, selector, (injectedScript, element, data) => {
@@ -753,10 +764,11 @@ class Frame extends _instrumentation.SdkObject {
753
764
  const controller = new _progress.ProgressController(metadata, this);
754
765
  return controller.run(async progress => {
755
766
  await this.raceNavigationAction(progress, options, async () => {
767
+ var _this$_page$_delegate, _this$_page$_delegate2;
756
768
  const waitUntil = options.waitUntil === undefined ? 'load' : options.waitUntil;
757
769
  progress.log(`setting frame content, waiting until "${waitUntil}"`);
758
770
  const tag = `--playwright--set--content--${this._id}--${++this._setContentCounter}--`;
759
- const context = await this._utilityContext();
771
+ const context = (_this$_page$_delegate = (_this$_page$_delegate2 = this._page._delegate).useMainWorldForSetContent) !== null && _this$_page$_delegate !== void 0 && _this$_page$_delegate.call(_this$_page$_delegate2) ? await this._mainContext() : await this._utilityContext();
760
772
  const lifecyclePromise = new Promise((resolve, reject) => {
761
773
  this._page._frameManager._consoleMessageTags.set(tag, () => {
762
774
  // Clear lifecycle right after document.open() - see 'tag' below.
@@ -787,6 +799,11 @@ class Frame extends _instrumentation.SdkObject {
787
799
  url() {
788
800
  return this._url;
789
801
  }
802
+ origin() {
803
+ var _network$parsedURL;
804
+ if (!this._url.startsWith('http')) return;
805
+ return (_network$parsedURL = network.parsedURL(this._url)) === null || _network$parsedURL === void 0 ? void 0 : _network$parsedURL.origin;
806
+ }
790
807
  parentFrame() {
791
808
  return this._parentFrame;
792
809
  }
@@ -812,7 +829,7 @@ class Frame extends _instrumentation.SdkObject {
812
829
  })).asElement();
813
830
  // Another round trip to the browser to ensure that we receive CSP error messages
814
831
  // (if any) logged asynchronously in a separate task on the content main thread.
815
- if (this._page._delegate.cspErrorsAsynchronousForInlineScipts) await context.evaluate(() => true);
832
+ if (this._page._delegate.cspErrorsAsynchronousForInlineScripts) await context.evaluate(() => true);
816
833
  return result;
817
834
  });
818
835
  async function addScriptUrl(params) {
@@ -994,7 +1011,10 @@ class Frame extends _instrumentation.SdkObject {
994
1011
  async click(metadata, selector, options) {
995
1012
  const controller = new _progress.ProgressController(metadata, this);
996
1013
  return controller.run(async progress => {
997
- return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._click(progress, options)));
1014
+ return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._click(progress, {
1015
+ ...options,
1016
+ waitAfter: !options.noWaitAfter
1017
+ })));
998
1018
  }, this._page._timeoutSettings.timeout(options));
999
1019
  }
1000
1020
  async dblclick(metadata, selector, options = {}) {
@@ -1012,6 +1032,7 @@ class Frame extends _instrumentation.SdkObject {
1012
1032
  await this._page.mouse.down();
1013
1033
  }, {
1014
1034
  ...options,
1035
+ waitAfter: 'disabled',
1015
1036
  position: options.sourcePosition,
1016
1037
  timeout: progress.timeUntilDeadline()
1017
1038
  });
@@ -1023,6 +1044,7 @@ class Frame extends _instrumentation.SdkObject {
1023
1044
  await this._page.mouse.up();
1024
1045
  }, {
1025
1046
  ...options,
1047
+ waitAfter: 'disabled',
1026
1048
  position: options.targetPosition,
1027
1049
  timeout: progress.timeUntilDeadline()
1028
1050
  });
@@ -1164,7 +1186,7 @@ class Frame extends _instrumentation.SdkObject {
1164
1186
  const inputFileItems = await (0, _fileUploadUtils.prepareFilesForUpload)(this, params);
1165
1187
  const controller = new _progress.ProgressController(metadata, this);
1166
1188
  return controller.run(async progress => {
1167
- return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._setInputFiles(progress, inputFileItems, params)));
1189
+ return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._setInputFiles(progress, inputFileItems)));
1168
1190
  }, this._page._timeoutSettings.timeout(params));
1169
1191
  }
1170
1192
  async type(metadata, selector, text, options = {}) {
@@ -1209,93 +1231,64 @@ class Frame extends _instrumentation.SdkObject {
1209
1231
  return result;
1210
1232
  }
1211
1233
  async _expectImpl(metadata, selector, options) {
1212
- let timeout = this._page._timeoutSettings.timeout(options);
1213
- const start = timeout > 0 ? (0, _utils.monotonicTime)() : 0;
1214
1234
  const lastIntermediateResult = {
1215
1235
  isSet: false
1216
1236
  };
1217
- const resultOneShot = await this._expectInternal(metadata, selector, options, true, timeout, lastIntermediateResult);
1218
- if (resultOneShot.matches !== options.isNot) return resultOneShot;
1219
- if (timeout > 0) {
1220
- const elapsed = (0, _utils.monotonicTime)() - start;
1221
- timeout -= elapsed;
1222
- }
1223
- if (timeout < 0) return {
1224
- matches: options.isNot,
1225
- log: metadata.log,
1226
- timedOut: true,
1227
- received: lastIntermediateResult.received
1228
- };
1229
- return await this._expectInternal(metadata, selector, options, false, timeout, lastIntermediateResult);
1230
- }
1231
- async _expectInternal(metadata, selector, options, oneShot, timeout, lastIntermediateResult) {
1232
- const controller = new _progress.ProgressController(metadata, this);
1233
- return controller.run(async progress => {
1234
- if (oneShot) {
1237
+ try {
1238
+ let timeout = this._page._timeoutSettings.timeout(options);
1239
+ const start = timeout > 0 ? (0, _utils.monotonicTime)() : 0;
1240
+
1241
+ // Step 1: perform locator handlers checkpoint with a specified timeout.
1242
+ await new _progress.ProgressController(metadata, this).run(async progress => {
1235
1243
  progress.log(`${metadata.apiName}${timeout ? ` with timeout ${timeout}ms` : ''}`);
1236
1244
  progress.log(`waiting for ${this._asLocator(selector)}`);
1237
- }
1238
- return await this.retryWithProgressAndTimeouts(progress, [100, 250, 500, 1000], async continuePolling => {
1239
- var _info$world;
1240
1245
  await this._page.performLocatorHandlersCheckpoint(progress);
1241
- const selectorInFrame = await this.selectors.resolveFrameForSelector(selector, {
1242
- strict: true
1246
+ }, timeout);
1247
+
1248
+ // Step 2: perform one-shot expect check without a timeout.
1249
+ // Supports the case of `expect(locator).toBeVisible({ timeout: 1 })`
1250
+ // that should succeed when the locator is already visible.
1251
+ try {
1252
+ const resultOneShot = await new _progress.ProgressController(metadata, this).run(async progress => {
1253
+ return await this._expectInternal(progress, selector, options, lastIntermediateResult);
1243
1254
  });
1244
- progress.throwIfAborted();
1245
- const {
1246
- frame,
1247
- info
1248
- } = selectorInFrame || {
1249
- frame: this,
1250
- info: undefined
1251
- };
1252
- 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';
1253
- const context = await frame._context(world);
1254
- const injected = await context.injectedScript();
1255
- progress.throwIfAborted();
1256
- const {
1257
- log,
1258
- matches,
1259
- received,
1260
- missingRecevied
1261
- } = await injected.evaluate(async (injected, {
1262
- info,
1263
- options,
1264
- callId
1265
- }) => {
1266
- const elements = info ? injected.querySelectorAll(info.parsed, document) : [];
1267
- const isArray = options.expression === 'to.have.count' || options.expression.endsWith('.array');
1268
- let log = '';
1269
- 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])}`;
1270
- if (callId) injected.markTargetElements(new Set(elements), callId);
1255
+ if (resultOneShot.matches !== options.isNot) return resultOneShot;
1256
+ } catch (e) {
1257
+ if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e)) throw e;
1258
+ // Ignore any other errors from one-shot, we'll handle them during retries.
1259
+ }
1260
+ if (timeout > 0) {
1261
+ const elapsed = (0, _utils.monotonicTime)() - start;
1262
+ timeout -= elapsed;
1263
+ }
1264
+ if (timeout < 0) return {
1265
+ matches: options.isNot,
1266
+ log: metadata.log,
1267
+ timedOut: true,
1268
+ received: lastIntermediateResult.received
1269
+ };
1270
+
1271
+ // Step 3: auto-retry expect with increasing timeouts. Bounded by the total remaining time.
1272
+ return await new _progress.ProgressController(metadata, this).run(async progress => {
1273
+ return await this.retryWithProgressAndTimeouts(progress, [100, 250, 500, 1000], async continuePolling => {
1274
+ await this._page.performLocatorHandlersCheckpoint(progress);
1275
+ const {
1276
+ matches,
1277
+ received
1278
+ } = await this._expectInternal(progress, selector, options, lastIntermediateResult);
1279
+ if (matches === options.isNot) {
1280
+ // Keep waiting in these cases:
1281
+ // expect(locator).conditionThatDoesNotMatch
1282
+ // expect(locator).not.conditionThatDoesMatch
1283
+ return continuePolling;
1284
+ }
1271
1285
  return {
1272
- log,
1273
- ...(await injected.expect(elements[0], options, elements))
1286
+ matches,
1287
+ received
1274
1288
  };
1275
- }, {
1276
- info,
1277
- options,
1278
- callId: metadata.id
1279
1289
  });
1280
- if (log) progress.log(log);
1281
- // Note: missingReceived avoids `unexpected value "undefined"` when element was not found.
1282
- if (matches === options.isNot && !missingRecevied) {
1283
- lastIntermediateResult.received = received;
1284
- lastIntermediateResult.isSet = true;
1285
- if (!Array.isArray(received)) progress.log(` unexpected value "${renderUnexpectedValue(options.expression, received)}"`);
1286
- }
1287
- if (!oneShot && matches === options.isNot) {
1288
- // Keep waiting in these cases:
1289
- // expect(locator).conditionThatDoesNotMatch
1290
- // expect(locator).not.conditionThatDoesMatch
1291
- return continuePolling;
1292
- }
1293
- return {
1294
- matches,
1295
- received
1296
- };
1297
- });
1298
- }, oneShot ? 0 : timeout).catch(e => {
1290
+ }, timeout);
1291
+ } catch (e) {
1299
1292
  // Q: Why not throw upon isSessionClosedError(e) as in other places?
1300
1293
  // A: We want user to receive a friendly message containing the last intermediate result.
1301
1294
  if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e)) throw e;
@@ -1306,7 +1299,60 @@ class Frame extends _instrumentation.SdkObject {
1306
1299
  if (lastIntermediateResult.isSet) result.received = lastIntermediateResult.received;
1307
1300
  if (e instanceof _errors.TimeoutError) result.timedOut = true;
1308
1301
  return result;
1302
+ }
1303
+ }
1304
+ async _expectInternal(progress, selector, options, lastIntermediateResult) {
1305
+ var _info$world;
1306
+ const selectorInFrame = await this.selectors.resolveFrameForSelector(selector, {
1307
+ strict: true
1309
1308
  });
1309
+ progress.throwIfAborted();
1310
+ const {
1311
+ frame,
1312
+ info
1313
+ } = selectorInFrame || {
1314
+ frame: this,
1315
+ info: undefined
1316
+ };
1317
+ 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';
1318
+ const context = await frame._context(world);
1319
+ const injected = await context.injectedScript();
1320
+ progress.throwIfAborted();
1321
+ const {
1322
+ log,
1323
+ matches,
1324
+ received,
1325
+ missingReceived
1326
+ } = await injected.evaluate(async (injected, {
1327
+ info,
1328
+ options,
1329
+ callId
1330
+ }) => {
1331
+ const elements = info ? injected.querySelectorAll(info.parsed, document) : [];
1332
+ const isArray = options.expression === 'to.have.count' || options.expression.endsWith('.array');
1333
+ let log = '';
1334
+ 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])}`;
1335
+ if (callId) injected.markTargetElements(new Set(elements), callId);
1336
+ return {
1337
+ log,
1338
+ ...(await injected.expect(elements[0], options, elements))
1339
+ };
1340
+ }, {
1341
+ info,
1342
+ options,
1343
+ callId: progress.metadata.id
1344
+ });
1345
+ if (log) progress.log(log);
1346
+ // Note: missingReceived avoids `unexpected value "undefined"` when element was not found.
1347
+ if (matches === options.isNot) {
1348
+ lastIntermediateResult.received = missingReceived ? '<element(s) not found>' : received;
1349
+ lastIntermediateResult.isSet = true;
1350
+ if (!missingReceived && !Array.isArray(received)) progress.log(` unexpected value "${renderUnexpectedValue(options.expression, received)}"`);
1351
+ }
1352
+ return {
1353
+ matches,
1354
+ received
1355
+ };
1310
1356
  }
1311
1357
  async _waitForFunctionExpression(metadata, expression, isFunction, arg, options, world = 'main') {
1312
1358
  const controller = new _progress.ProgressController(metadata, this);
@@ -1352,7 +1398,7 @@ class Frame extends _instrumentation.SdkObject {
1352
1398
  fulfill(success);
1353
1399
  return;
1354
1400
  }
1355
- if (typeof polling !== 'number') requestAnimationFrame(next);else setTimeout(next, polling);
1401
+ if (typeof polling !== 'number') injected.builtinRequestAnimationFrame(next);else injected.builtinSetTimeout(next, polling);
1356
1402
  } catch (e) {
1357
1403
  reject(e);
1358
1404
  }
@@ -1546,7 +1592,7 @@ class Frame extends _instrumentation.SdkObject {
1546
1592
  }).catch(() => {});
1547
1593
  }
1548
1594
  _asLocator(selector) {
1549
- return (0, _locatorGenerators.asLocator)(this._page.attribution.playwright.options.sdkLanguage, selector);
1595
+ return (0, _utils.asLocator)(this._page.attribution.playwright.options.sdkLanguage, selector);
1550
1596
  }
1551
1597
  }
1552
1598
  exports.Frame = Frame;
@@ -12,10 +12,7 @@ var _utils = require("../../utils");
12
12
  var _eventsHelper = require("../../utils/eventsHelper");
13
13
  var _utilsBundle = require("../../utilsBundle");
14
14
  var _manualPromise = require("../../utils/manualPromise");
15
- var _userAgent = require("../../utils/userAgent");
16
- var _network2 = require("../../utils/network");
17
15
  var _frames = require("../frames");
18
- var _mimeType = require("../../utils/mimeType");
19
16
  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); }
20
17
  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; }
21
18
  /**
@@ -76,7 +73,7 @@ class HarTracer {
76
73
  }
77
74
  }
78
75
  _shouldIncludeEntryWithUrl(urlString) {
79
- return !this._options.urlFilter || (0, _network2.urlMatches)(this._baseURL, urlString, this._options.urlFilter);
76
+ return !this._options.urlFilter || (0, _utils.urlMatches)(this._baseURL, urlString, this._options.urlFilter);
80
77
  }
81
78
  _entryForRequest(request) {
82
79
  return request[this._entrySymbol];
@@ -276,7 +273,7 @@ class HarTracer {
276
273
  });
277
274
  this._addBarrier(page || request.serviceWorker(), promise);
278
275
 
279
- // Respose end timing is only available after the response event was received.
276
+ // Response end timing is only available after the response event was received.
280
277
  const timing = response.timing();
281
278
  harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? _helper.helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
282
279
  this._computeHarEntryTotalTime(harEntry);
@@ -318,7 +315,7 @@ class HarTracer {
318
315
  if (this._options.content === 'embed') {
319
316
  // Sometimes, we can receive a font/media file with textual mime type. Browser
320
317
  // still interprets them correctly, but the 'content-type' header is obviously wrong.
321
- if ((0, _mimeType.isTextualMimeType)(content.mimeType) && resourceType !== 'font') {
318
+ if ((0, _utils.isTextualMimeType)(content.mimeType) && resourceType !== 'font') {
322
319
  content.text = buffer.toString();
323
320
  } else {
324
321
  content.text = buffer.toString('base64');
@@ -337,11 +334,6 @@ class HarTracer {
337
334
  const page = (_response$frame = response.frame()) === null || _response$frame === void 0 ? void 0 : _response$frame._page;
338
335
  const pageEntry = this._createPageEntryIfNeeded(page);
339
336
  const request = response.request();
340
-
341
- // Prefer "response received" time over "request sent" time
342
- // for the purpose of matching requests that were used in a particular snapshot.
343
- // Note that both snapshot time and request time are taken here in the Node process.
344
- if (this._options.includeTraceInfo) harEntry._monotonicTime = (0, _utils.monotonicTime)();
345
337
  harEntry.response = {
346
338
  status: response.status(),
347
339
  statusText: response.statusText(),
@@ -411,7 +403,7 @@ class HarTracer {
411
403
  version: '1.2',
412
404
  creator: {
413
405
  name: 'Playwright',
414
- version: (0, _userAgent.getPlaywrightVersion)()
406
+ version: (0, _utils.getPlaywrightVersion)()
415
407
  },
416
408
  browser: {
417
409
  name: (context === null || context === void 0 ? void 0 : context._browser.options.name) || '',
@@ -95,9 +95,9 @@ class Helper {
95
95
  }
96
96
  };
97
97
  }
98
- static formatBrowserLogs(logs) {
99
- if (!logs.length) return '';
100
- return '\n' + logs.join('\n');
98
+ static formatBrowserLogs(logs, disconnectReason) {
99
+ if (!disconnectReason && !logs.length) return '';
100
+ return '\n' + (disconnectReason ? disconnectReason + '\n' : '') + logs.join('\n');
101
101
  }
102
102
  }
103
103
  const helper = exports.helper = Helper;
@@ -51,6 +51,12 @@ Object.defineProperty(exports, "installDefaultBrowsersForNpmInstall", {
51
51
  return _registry.installDefaultBrowsersForNpmInstall;
52
52
  }
53
53
  });
54
+ Object.defineProperty(exports, "installRootRedirect", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _traceViewer.installRootRedirect;
58
+ }
59
+ });
54
60
  Object.defineProperty(exports, "openTraceInBrowser", {
55
61
  enumerable: true,
56
62
  get: function () {
@@ -75,12 +81,24 @@ Object.defineProperty(exports, "registryDirectory", {
75
81
  return _registry.registryDirectory;
76
82
  }
77
83
  });
84
+ Object.defineProperty(exports, "runTraceViewerApp", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _traceViewer.runTraceViewerApp;
88
+ }
89
+ });
78
90
  Object.defineProperty(exports, "serverSideCallMetadata", {
79
91
  enumerable: true,
80
92
  get: function () {
81
93
  return _instrumentation.serverSideCallMetadata;
82
94
  }
83
95
  });
96
+ Object.defineProperty(exports, "startTraceViewerServer", {
97
+ enumerable: true,
98
+ get: function () {
99
+ return _traceViewer.startTraceViewerServer;
100
+ }
101
+ });
84
102
  Object.defineProperty(exports, "writeDockerVersion", {
85
103
  enumerable: true,
86
104
  get: function () {