patchright-core 1.50.1 → 1.51.1

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
@@ -6,31 +6,33 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.BrowserContext = void 0;
7
7
  exports.prepareBrowserContextParams = prepareBrowserContextParams;
8
8
  exports.toClientCertificatesProtocol = toClientCertificatesProtocol;
9
- var _page = require("./page");
10
- var _frame = require("./frame");
11
- var network = _interopRequireWildcard(require("./network"));
12
- var _fs = _interopRequireDefault(require("fs"));
13
- var _path = _interopRequireDefault(require("path"));
9
+ var _artifact = require("./artifact");
10
+ var _browser = require("./browser");
11
+ var _cdpSession = require("./cdpSession");
14
12
  var _channelOwner = require("./channelOwner");
15
13
  var _clientHelper = require("./clientHelper");
16
- var _browser = require("./browser");
17
- var _worker = require("./worker");
14
+ var _clock = require("./clock");
15
+ var _consoleMessage = require("./consoleMessage");
16
+ var _dialog = require("./dialog");
17
+ var _errors = require("./errors");
18
18
  var _events = require("./events");
19
- var _timeoutSettings = require("../common/timeoutSettings");
20
- var _waiter = require("./waiter");
21
- var _utils = require("../utils");
22
- var _cdpSession = require("./cdpSession");
23
- var _tracing = require("./tracing");
24
- var _artifact = require("./artifact");
25
19
  var _fetch = require("./fetch");
26
- var _stackTrace = require("../utils/stackTrace");
20
+ var _frame = require("./frame");
27
21
  var _harRouter = require("./harRouter");
28
- var _consoleMessage = require("./consoleMessage");
29
- var _dialog = require("./dialog");
22
+ var network = _interopRequireWildcard(require("./network"));
23
+ var _page = require("./page");
24
+ var _tracing = require("./tracing");
25
+ var _waiter = require("./waiter");
30
26
  var _webError = require("./webError");
31
- var _errors = require("./errors");
32
- var _clock = require("./clock");
33
- let _Symbol$asyncDispose;
27
+ var _worker = require("./worker");
28
+ var _timeoutSettings = require("./timeoutSettings");
29
+ var _fileUtils = require("./fileUtils");
30
+ var _headers = require("../utils/isomorphic/headers");
31
+ var _urlMatch = require("../utils/isomorphic/urlMatch");
32
+ var _rtti = require("../utils/isomorphic/rtti");
33
+ var _stackTrace = require("../utils/isomorphic/stackTrace");
34
+ 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); }
35
+ 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; }
34
36
  /**
35
37
  * Copyright 2017 Google Inc. All rights reserved.
36
38
  * Modifications copyright (c) Microsoft Corporation.
@@ -47,10 +49,7 @@ let _Symbol$asyncDispose;
47
49
  * See the License for the specific language governing permissions and
48
50
  * limitations under the License.
49
51
  */
50
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
51
- 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); }
52
- 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; }
53
- _Symbol$asyncDispose = Symbol.asyncDispose;
52
+
54
53
  class BrowserContext extends _channelOwner.ChannelOwner {
55
54
  static from(context) {
56
55
  return context._object;
@@ -67,7 +66,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
67
66
  this._browser = null;
68
67
  this._browserType = void 0;
69
68
  this._bindings = new Map();
70
- this._timeoutSettings = new _timeoutSettings.TimeoutSettings();
69
+ this._timeoutSettings = void 0;
71
70
  this._ownerPage = void 0;
72
71
  this._closedPromise = void 0;
73
72
  this._options = {};
@@ -82,6 +81,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
82
81
  this._closeReason = void 0;
83
82
  this._harRouters = [];
84
83
  this.routeInjecting = false;
84
+ this._timeoutSettings = new _timeoutSettings.TimeoutSettings(this._platform);
85
85
  if (parent instanceof _browser.Browser) this._browser = parent;
86
86
  (_this$_browser = this._browser) === null || _this$_browser === void 0 || _this$_browser._contexts.add(this);
87
87
  this._isChromium = ((_this$_browser2 = this._browser) === null || _this$_browser2 === void 0 ? void 0 : _this$_browser2._name) === 'chromium';
@@ -117,7 +117,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
117
117
  this.emit(_events.Events.BrowserContext.ServiceWorker, serviceWorker);
118
118
  });
119
119
  this._channel.on('console', event => {
120
- const consoleMessage = new _consoleMessage.ConsoleMessage(event);
120
+ const consoleMessage = new _consoleMessage.ConsoleMessage(this._platform, event);
121
121
  this.emit(_events.Events.BrowserContext.Console, consoleMessage);
122
122
  const page = consoleMessage.page();
123
123
  if (page) page.emit(_events.Events.Page.Console, consoleMessage);
@@ -234,18 +234,18 @@ class BrowserContext extends _channelOwner.ChannelOwner {
234
234
  setDefaultNavigationTimeout(timeout) {
235
235
  this._timeoutSettings.setDefaultNavigationTimeout(timeout);
236
236
  this._wrapApiCall(async () => {
237
- this._channel.setDefaultNavigationTimeoutNoReply({
237
+ await this._channel.setDefaultNavigationTimeoutNoReply({
238
238
  timeout
239
- }).catch(() => {});
240
- }, true);
239
+ });
240
+ }, true).catch(() => {});
241
241
  }
242
242
  setDefaultTimeout(timeout) {
243
243
  this._timeoutSettings.setDefaultTimeout(timeout);
244
244
  this._wrapApiCall(async () => {
245
- this._channel.setDefaultTimeoutNoReply({
245
+ await this._channel.setDefaultTimeoutNoReply({
246
246
  timeout
247
- }).catch(() => {});
248
- }, true);
247
+ });
248
+ }, true).catch(() => {});
249
249
  }
250
250
  browser() {
251
251
  return this._browser;
@@ -271,15 +271,15 @@ class BrowserContext extends _channelOwner.ChannelOwner {
271
271
  }
272
272
  async clearCookies(options = {}) {
273
273
  await this._channel.clearCookies({
274
- name: (0, _utils.isString)(options.name) ? options.name : undefined,
275
- nameRegexSource: (0, _utils.isRegExp)(options.name) ? options.name.source : undefined,
276
- nameRegexFlags: (0, _utils.isRegExp)(options.name) ? options.name.flags : undefined,
277
- domain: (0, _utils.isString)(options.domain) ? options.domain : undefined,
278
- domainRegexSource: (0, _utils.isRegExp)(options.domain) ? options.domain.source : undefined,
279
- domainRegexFlags: (0, _utils.isRegExp)(options.domain) ? options.domain.flags : undefined,
280
- path: (0, _utils.isString)(options.path) ? options.path : undefined,
281
- pathRegexSource: (0, _utils.isRegExp)(options.path) ? options.path.source : undefined,
282
- pathRegexFlags: (0, _utils.isRegExp)(options.path) ? options.path.flags : undefined
274
+ name: (0, _rtti.isString)(options.name) ? options.name : undefined,
275
+ nameRegexSource: (0, _rtti.isRegExp)(options.name) ? options.name.source : undefined,
276
+ nameRegexFlags: (0, _rtti.isRegExp)(options.name) ? options.name.flags : undefined,
277
+ domain: (0, _rtti.isString)(options.domain) ? options.domain : undefined,
278
+ domainRegexSource: (0, _rtti.isRegExp)(options.domain) ? options.domain.source : undefined,
279
+ domainRegexFlags: (0, _rtti.isRegExp)(options.domain) ? options.domain.flags : undefined,
280
+ path: (0, _rtti.isString)(options.path) ? options.path : undefined,
281
+ pathRegexSource: (0, _rtti.isRegExp)(options.path) ? options.path.source : undefined,
282
+ pathRegexFlags: (0, _rtti.isRegExp)(options.path) ? options.path.flags : undefined
283
283
  });
284
284
  }
285
285
  async grantPermissions(permissions, options) {
@@ -299,7 +299,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
299
299
  async setExtraHTTPHeaders(headers) {
300
300
  network.validateHeaders(headers);
301
301
  await this._channel.setExtraHTTPHeaders({
302
- headers: (0, _utils.headersObjectToArray)(headers)
302
+ headers: (0, _headers.headersObjectToArray)(headers)
303
303
  });
304
304
  }
305
305
  async setOffline(offline) {
@@ -314,7 +314,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
314
314
  }
315
315
  async addInitScript(script, arg) {
316
316
  await this.installInjectRoute();
317
- const source = await (0, _clientHelper.evaluationScript)(script, arg);
317
+ const source = await (0, _clientHelper.evaluationScript)(this._platform, script, arg);
318
318
  await this._channel.addInitScript({
319
319
  source
320
320
  });
@@ -336,7 +336,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
336
336
  this._bindings.set(name, binding);
337
337
  }
338
338
  async route(url, handler, options = {}) {
339
- this._routes.unshift(new network.RouteHandler(this._options.baseURL, url, handler, options.times));
339
+ this._routes.unshift(new network.RouteHandler(this._platform, this._options.baseURL, url, handler, options.times));
340
340
  await this._updateInterceptionPatterns();
341
341
  }
342
342
  async routeWebSocket(url, handler) {
@@ -362,11 +362,13 @@ class BrowserContext extends _channelOwner.ChannelOwner {
362
362
  });
363
363
  }
364
364
  async routeFromHAR(har, options = {}) {
365
+ const localUtils = this._connection.localUtils();
366
+ if (!localUtils) throw new Error('Route from har is not supported in thin clients');
365
367
  if (options.update) {
366
368
  await this._recordIntoHAR(har, null, options);
367
369
  return;
368
370
  }
369
- const harRouter = await _harRouter.HarRouter.create(this._connection.localUtils(), har, options.notFound || 'abort', {
371
+ const harRouter = await _harRouter.HarRouter.create(localUtils, har, options.notFound || 'abort', {
370
372
  urlMatch: options.url
371
373
  });
372
374
  this._harRouters.push(harRouter);
@@ -384,7 +386,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
384
386
  const removed = [];
385
387
  const remaining = [];
386
388
  for (const route of this._routes) {
387
- if ((0, _utils.urlMatchesEqual)(route.url, url) && (!handler || route.handler === handler)) removed.push(route);else remaining.push(route);
389
+ if ((0, _urlMatch.urlMatchesEqual)(route.url, url) && (!handler || route.handler === handler)) removed.push(route);else remaining.push(route);
388
390
  }
389
391
  await this._unrouteInternal(removed, remaining, 'default');
390
392
  }
@@ -424,10 +426,12 @@ class BrowserContext extends _channelOwner.ChannelOwner {
424
426
  });
425
427
  }
426
428
  async storageState(options = {}) {
427
- const state = await this._channel.storageState();
429
+ const state = await this._channel.storageState({
430
+ indexedDB: options.indexedDB
431
+ });
428
432
  if (options.path) {
429
- await (0, _utils.mkdirIfNeeded)(options.path);
430
- await _fs.default.promises.writeFile(options.path, JSON.stringify(state, undefined, 2), 'utf8');
433
+ await (0, _fileUtils.mkdirIfNeeded)(this._platform, options.path);
434
+ await this._platform.fs().promises.writeFile(options.path, JSON.stringify(state, undefined, 2), 'utf8');
431
435
  }
432
436
  return state;
433
437
  }
@@ -455,7 +459,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
455
459
  this.tracing._resetStackCounter();
456
460
  this.emit(_events.Events.BrowserContext.Close, this);
457
461
  }
458
- async [_Symbol$asyncDispose]() {
462
+ async [Symbol.asyncDispose]() {
459
463
  await this.close();
460
464
  }
461
465
  async close(options = {}) {
@@ -477,8 +481,10 @@ class BrowserContext extends _channelOwner.ChannelOwner {
477
481
  const isCompressed = harParams.content === 'attach' || harParams.path.endsWith('.zip');
478
482
  const needCompressed = harParams.path.endsWith('.zip');
479
483
  if (isCompressed && !needCompressed) {
484
+ const localUtils = this._connection.localUtils();
485
+ if (!localUtils) throw new Error('Uncompressed har is not supported in thin clients');
480
486
  await artifact.saveAs(harParams.path + '.tmp');
481
- await this._connection.localUtils()._channel.harUnzip({
487
+ await localUtils.harUnzip({
482
488
  zipFile: harParams.path + '.tmp',
483
489
  harFile: harParams.path
484
490
  });
@@ -495,31 +501,28 @@ class BrowserContext extends _channelOwner.ChannelOwner {
495
501
  await this._channel.enableRecorder(params);
496
502
  }
497
503
  async installInjectRoute() {
498
- if (this.routeInjecting) return;
504
+ if (this.routeInjecting || this.context().routeInjecting) return;
499
505
  await this.route('**/*', async route => {
500
- if (route.request().resourceType() === 'document' && route.request().url().startsWith('http')) {
501
- try {
502
- const response = await route.fetch({
503
- maxRedirects: 0
506
+ try {
507
+ if (route.request().resourceType() === 'document' && route.request().url().startsWith('http')) {
508
+ const protocol = route.request().url().split(':')[0];
509
+ await route.continue({
510
+ url: protocol + '://patchright-init-script-inject.internal/'
504
511
  });
505
- await route.fulfill({
506
- response: response
507
- });
508
- } catch (e) {
512
+ } else {
509
513
  await route.continue();
510
514
  }
511
- } else {
515
+ } catch (error) {
512
516
  await route.continue();
513
517
  }
514
518
  });
515
- this.routeInjecting = true;
516
519
  }
517
520
  }
518
521
  exports.BrowserContext = BrowserContext;
519
- async function prepareStorageState(options) {
522
+ async function prepareStorageState(platform, options) {
520
523
  if (typeof options.storageState !== 'string') return options.storageState;
521
524
  try {
522
- return JSON.parse(await _fs.default.promises.readFile(options.storageState, 'utf8'));
525
+ return JSON.parse(await platform.fs().promises.readFile(options.storageState, 'utf8'));
523
526
  } catch (e) {
524
527
  (0, _stackTrace.rewriteErrorMessage)(e, `Error reading storage state from ${options.storageState}:\n` + e.message);
525
528
  throw e;
@@ -530,28 +533,29 @@ function prepareRecordHarOptions(options) {
530
533
  return {
531
534
  path: options.path,
532
535
  content: options.content || (options.omitContent ? 'omit' : undefined),
533
- urlGlob: (0, _utils.isString)(options.urlFilter) ? options.urlFilter : undefined,
534
- urlRegexSource: (0, _utils.isRegExp)(options.urlFilter) ? options.urlFilter.source : undefined,
535
- urlRegexFlags: (0, _utils.isRegExp)(options.urlFilter) ? options.urlFilter.flags : undefined,
536
+ urlGlob: (0, _rtti.isString)(options.urlFilter) ? options.urlFilter : undefined,
537
+ urlRegexSource: (0, _rtti.isRegExp)(options.urlFilter) ? options.urlFilter.source : undefined,
538
+ urlRegexFlags: (0, _rtti.isRegExp)(options.urlFilter) ? options.urlFilter.flags : undefined,
536
539
  mode: options.mode
537
540
  };
538
541
  }
539
- async function prepareBrowserContextParams(options) {
542
+ async function prepareBrowserContextParams(platform, options) {
540
543
  if (options.videoSize && !options.videosPath) throw new Error(`"videoSize" option requires "videosPath" to be specified`);
541
544
  if (options.extraHTTPHeaders) network.validateHeaders(options.extraHTTPHeaders);
542
545
  const contextParams = {
543
546
  ...options,
544
547
  viewport: options.viewport === null ? undefined : options.viewport,
545
548
  noDefaultViewport: options.viewport === null,
546
- extraHTTPHeaders: options.extraHTTPHeaders ? (0, _utils.headersObjectToArray)(options.extraHTTPHeaders) : undefined,
547
- storageState: await prepareStorageState(options),
549
+ extraHTTPHeaders: options.extraHTTPHeaders ? (0, _headers.headersObjectToArray)(options.extraHTTPHeaders) : undefined,
550
+ storageState: await prepareStorageState(platform, options),
548
551
  serviceWorkers: options.serviceWorkers,
549
552
  recordHar: prepareRecordHarOptions(options.recordHar),
550
553
  colorScheme: options.colorScheme === null ? 'no-override' : options.colorScheme,
551
554
  reducedMotion: options.reducedMotion === null ? 'no-override' : options.reducedMotion,
552
555
  forcedColors: options.forcedColors === null ? 'no-override' : options.forcedColors,
556
+ contrast: options.contrast === null ? 'no-override' : options.contrast,
553
557
  acceptDownloads: toAcceptDownloadsProtocol(options.acceptDownloads),
554
- clientCertificates: await toClientCertificatesProtocol(options.clientCertificates)
558
+ clientCertificates: await toClientCertificatesProtocol(platform, options.clientCertificates)
555
559
  };
556
560
  if (!contextParams.recordVideo && options.videosPath) {
557
561
  contextParams.recordVideo = {
@@ -559,7 +563,7 @@ async function prepareBrowserContextParams(options) {
559
563
  size: options.videoSize
560
564
  };
561
565
  }
562
- if (contextParams.recordVideo && contextParams.recordVideo.dir) contextParams.recordVideo.dir = _path.default.resolve(process.cwd(), contextParams.recordVideo.dir);
566
+ if (contextParams.recordVideo && contextParams.recordVideo.dir) contextParams.recordVideo.dir = platform.path().resolve(contextParams.recordVideo.dir);
563
567
  return contextParams;
564
568
  }
565
569
  function toAcceptDownloadsProtocol(acceptDownloads) {
@@ -567,11 +571,11 @@ function toAcceptDownloadsProtocol(acceptDownloads) {
567
571
  if (acceptDownloads) return 'accept';
568
572
  return 'deny';
569
573
  }
570
- async function toClientCertificatesProtocol(certs) {
574
+ async function toClientCertificatesProtocol(platform, certs) {
571
575
  if (!certs) return undefined;
572
576
  const bufferizeContent = async (value, path) => {
573
577
  if (value) return value;
574
- if (path) return await _fs.default.promises.readFile(path);
578
+ if (path) return await platform.fs().promises.readFile(path);
575
579
  };
576
580
  return await Promise.all(certs.map(async cert => ({
577
581
  origin: cert.origin,
@@ -7,11 +7,13 @@ exports.BrowserType = void 0;
7
7
  var _browser3 = require("./browser");
8
8
  var _browserContext = require("./browserContext");
9
9
  var _channelOwner = require("./channelOwner");
10
- var _connection = require("./connection");
11
- var _events = require("./events");
12
10
  var _clientHelper = require("./clientHelper");
13
- var _utils = require("../utils");
14
- var _timeoutRunner = require("../utils/timeoutRunner");
11
+ var _events = require("./events");
12
+ var _assert = require("../utils/isomorphic/assert");
13
+ var _headers = require("../utils/isomorphic/headers");
14
+ var _time = require("../utils/isomorphic/time");
15
+ var _timeoutRunner = require("../utils/isomorphic/timeoutRunner");
16
+ var _webSocket = require("./webSocket");
15
17
  /**
16
18
  * Copyright (c) Microsoft Corporation.
17
19
  *
@@ -36,11 +38,6 @@ class BrowserType extends _channelOwner.ChannelOwner {
36
38
  this._serverLauncher = void 0;
37
39
  this._contexts = new Set();
38
40
  this._playwright = void 0;
39
- // Instrumentation.
40
- this._defaultContextOptions = void 0;
41
- this._defaultContextTimeout = void 0;
42
- this._defaultContextNavigationTimeout = void 0;
43
- this._defaultLaunchOptions = void 0;
44
41
  }
45
42
  static from(browserType) {
46
43
  return browserType._object;
@@ -53,12 +50,12 @@ class BrowserType extends _channelOwner.ChannelOwner {
53
50
  return this._initializer.name;
54
51
  }
55
52
  async launch(options = {}) {
56
- var _this$_defaultLaunchO;
57
- (0, _utils.assert)(!options.userDataDir, 'userDataDir option is not supported in `browserType.launch`. Use `browserType.launchPersistentContext` instead');
58
- (0, _utils.assert)(!options.port, 'Cannot specify a port without launching as a server.');
59
- const logger = options.logger || ((_this$_defaultLaunchO = this._defaultLaunchOptions) === null || _this$_defaultLaunchO === void 0 ? void 0 : _this$_defaultLaunchO.logger);
53
+ var _this$_playwright$_de;
54
+ (0, _assert.assert)(!options.userDataDir, 'userDataDir option is not supported in `browserType.launch`. Use `browserType.launchPersistentContext` instead');
55
+ (0, _assert.assert)(!options.port, 'Cannot specify a port without launching as a server.');
56
+ const logger = options.logger || ((_this$_playwright$_de = this._playwright._defaultLaunchOptions) === null || _this$_playwright$_de === void 0 ? void 0 : _this$_playwright$_de.logger);
60
57
  options = {
61
- ...this._defaultLaunchOptions,
58
+ ...this._playwright._defaultLaunchOptions,
62
59
  ...options
63
60
  };
64
61
  const launchOptions = {
@@ -76,28 +73,28 @@ class BrowserType extends _channelOwner.ChannelOwner {
76
73
  async launchServer(options = {}) {
77
74
  if (!this._serverLauncher) throw new Error('Launching server is not supported');
78
75
  options = {
79
- ...this._defaultLaunchOptions,
76
+ ...this._playwright._defaultLaunchOptions,
80
77
  ...options
81
78
  };
82
79
  return await this._serverLauncher.launchServer(options);
83
80
  }
84
81
  async launchPersistentContext(userDataDir, options = {}) {
85
- var _this$_defaultLaunchO2;
86
- const logger = options.logger || ((_this$_defaultLaunchO2 = this._defaultLaunchOptions) === null || _this$_defaultLaunchO2 === void 0 ? void 0 : _this$_defaultLaunchO2.logger);
87
- (0, _utils.assert)(!options.port, 'Cannot specify a port without launching as a server.');
82
+ var _this$_playwright$_de2;
83
+ const logger = options.logger || ((_this$_playwright$_de2 = this._playwright._defaultLaunchOptions) === null || _this$_playwright$_de2 === void 0 ? void 0 : _this$_playwright$_de2.logger);
84
+ (0, _assert.assert)(!options.port, 'Cannot specify a port without launching as a server.');
88
85
  options = {
89
- ...this._defaultLaunchOptions,
90
- ...this._defaultContextOptions,
86
+ ...this._playwright._defaultLaunchOptions,
87
+ ...this._playwright._defaultContextOptions,
91
88
  ...options
92
89
  };
93
- const contextParams = await (0, _browserContext.prepareBrowserContextParams)(options);
90
+ const contextParams = await (0, _browserContext.prepareBrowserContextParams)(this._platform, options);
94
91
  const persistentParams = {
95
92
  ...contextParams,
96
93
  ignoreDefaultArgs: Array.isArray(options.ignoreDefaultArgs) ? options.ignoreDefaultArgs : undefined,
97
94
  ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs),
98
95
  env: options.env ? (0, _clientHelper.envObjectToArray)(options.env) : undefined,
99
96
  channel: options.channel,
100
- userDataDir
97
+ userDataDir: this._platform.path().isAbsolute(userDataDir) || !userDataDir ? userDataDir : this._platform.path().resolve(userDataDir)
101
98
  };
102
99
  return await this._wrapApiCall(async () => {
103
100
  const result = await this._channel.launchPersistentContext(persistentParams);
@@ -111,19 +108,18 @@ class BrowserType extends _channelOwner.ChannelOwner {
111
108
  ...options,
112
109
  wsEndpoint: optionsOrWsEndpoint
113
110
  });
114
- (0, _utils.assert)(optionsOrWsEndpoint.wsEndpoint, 'options.wsEndpoint is required');
111
+ (0, _assert.assert)(optionsOrWsEndpoint.wsEndpoint, 'options.wsEndpoint is required');
115
112
  return await this._connect(optionsOrWsEndpoint);
116
113
  }
117
114
  async _connect(params) {
118
115
  const logger = params.logger;
119
116
  return await this._wrapApiCall(async () => {
120
117
  var _params$exposeNetwork;
121
- const deadline = params.timeout ? (0, _utils.monotonicTime)() + params.timeout : 0;
118
+ const deadline = params.timeout ? (0, _time.monotonicTime)() + params.timeout : 0;
122
119
  const headers = {
123
120
  'x-playwright-browser': this.name(),
124
121
  ...params.headers
125
122
  };
126
- const localUtils = this._connection.localUtils();
127
123
  const connectParams = {
128
124
  wsEndpoint: params.wsEndpoint,
129
125
  headers,
@@ -132,69 +128,39 @@ class BrowserType extends _channelOwner.ChannelOwner {
132
128
  timeout: params.timeout
133
129
  };
134
130
  if (params.__testHookRedirectPortForwarding) connectParams.socksProxyRedirectPortForTest = params.__testHookRedirectPortForwarding;
135
- const {
136
- pipe,
137
- headers: connectHeaders
138
- } = await localUtils._channel.connect(connectParams);
139
- const closePipe = () => pipe.close().catch(() => {});
140
- const connection = new _connection.Connection(localUtils, this._instrumentation);
141
- connection.markAsRemote();
142
- connection.on('close', closePipe);
131
+ const connection = await (0, _webSocket.connectOverWebSocket)(this._connection, connectParams);
143
132
  let browser;
144
- let closeError;
145
- const onPipeClosed = reason => {
133
+ connection.on('close', () => {
146
134
  // Emulate all pages, contexts and the browser closing upon disconnect.
147
135
  for (const context of ((_browser = browser) === null || _browser === void 0 ? void 0 : _browser.contexts()) || []) {
148
136
  var _browser;
149
137
  for (const page of context.pages()) page._onClose();
150
138
  context._onClose();
151
139
  }
152
- connection.close(reason || closeError);
153
- // Give a chance to any API call promises to reject upon page/context closure.
154
- // This happens naturally when we receive page.onClose and browser.onClose from the server
155
- // in separate tasks. However, upon pipe closure we used to dispatch them all synchronously
156
- // here and promises did not have a chance to reject.
157
- // The order of rejects vs closure is a part of the API contract and our test runner
158
- // relies on it to attribute rejections to the right test.
159
140
  setTimeout(() => {
160
141
  var _browser2;
161
142
  return (_browser2 = browser) === null || _browser2 === void 0 ? void 0 : _browser2._didClose();
162
143
  }, 0);
163
- };
164
- pipe.on('closed', params => onPipeClosed(params.reason));
165
- connection.onmessage = message => this._wrapApiCall(() => pipe.send({
166
- message
167
- }).catch(() => onPipeClosed()), /* isInternal */true);
168
- pipe.on('message', ({
169
- message
170
- }) => {
171
- try {
172
- connection.dispatch(message);
173
- } catch (e) {
174
- closeError = String(e);
175
- closePipe();
176
- }
177
144
  });
178
145
  const result = await (0, _timeoutRunner.raceAgainstDeadline)(async () => {
179
146
  // For tests.
180
147
  if (params.__testHookBeforeCreateBrowser) await params.__testHookBeforeCreateBrowser();
181
148
  const playwright = await connection.initializePlaywright();
182
149
  if (!playwright._initializer.preLaunchedBrowser) {
183
- closePipe();
150
+ connection.close();
184
151
  throw new Error('Malformed endpoint. Did you use BrowserType.launchServer method?');
185
152
  }
186
153
  playwright._setSelectors(this._playwright.selectors);
187
154
  browser = _browser3.Browser.from(playwright._initializer.preLaunchedBrowser);
188
155
  this._didLaunchBrowser(browser, {}, logger);
189
156
  browser._shouldCloseConnectionOnClose = true;
190
- browser._connectHeaders = connectHeaders;
191
- browser.on(_events.Events.Browser.Disconnected, () => this._wrapApiCall(() => closePipe(), /* isInternal */true));
157
+ browser.on(_events.Events.Browser.Disconnected, () => connection.close());
192
158
  return browser;
193
159
  }, deadline);
194
160
  if (!result.timedOut) {
195
161
  return result.result;
196
162
  } else {
197
- closePipe();
163
+ connection.close();
198
164
  throw new Error(`Timeout ${params.timeout}ms exceeded`);
199
165
  }
200
166
  });
@@ -202,12 +168,12 @@ class BrowserType extends _channelOwner.ChannelOwner {
202
168
  async connectOverCDP(endpointURLOrOptions, options) {
203
169
  if (typeof endpointURLOrOptions === 'string') return await this._connectOverCDP(endpointURLOrOptions, options);
204
170
  const endpointURL = 'endpointURL' in endpointURLOrOptions ? endpointURLOrOptions.endpointURL : endpointURLOrOptions.wsEndpoint;
205
- (0, _utils.assert)(endpointURL, 'Cannot connect over CDP without wsEndpoint.');
171
+ (0, _assert.assert)(endpointURL, 'Cannot connect over CDP without wsEndpoint.');
206
172
  return await this.connectOverCDP(endpointURL, endpointURLOrOptions);
207
173
  }
208
174
  async _connectOverCDP(endpointURL, params = {}) {
209
175
  if (this.name() !== 'chromium') throw new Error('Connecting over CDP is only supported in Chromium.');
210
- const headers = params.headers ? (0, _utils.headersObjectToArray)(params.headers) : undefined;
176
+ const headers = params.headers ? (0, _headers.headersObjectToArray)(params.headers) : undefined;
211
177
  const result = await this._channel.connectOverCDP({
212
178
  endpointURL,
213
179
  headers,
@@ -229,8 +195,8 @@ class BrowserType extends _channelOwner.ChannelOwner {
229
195
  context._browserType = this;
230
196
  this._contexts.add(context);
231
197
  context._setOptions(contextOptions, browserOptions);
232
- if (this._defaultContextTimeout !== undefined) context.setDefaultTimeout(this._defaultContextTimeout);
233
- if (this._defaultContextNavigationTimeout !== undefined) context.setDefaultNavigationTimeout(this._defaultContextNavigationTimeout);
198
+ if (this._playwright._defaultContextTimeout !== undefined) context.setDefaultTimeout(this._playwright._defaultContextTimeout);
199
+ if (this._playwright._defaultContextNavigationTimeout !== undefined) context.setDefaultNavigationTimeout(this._playwright._defaultContextNavigationTimeout);
234
200
  await this._instrumentation.runAfterCreateBrowserContext(context);
235
201
  }
236
202
  async _willCloseContext(context) {
@@ -6,10 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.ChannelOwner = void 0;
7
7
  var _eventEmitter = require("./eventEmitter");
8
8
  var _validator = require("../protocol/validator");
9
- var _debugLogger = require("../utils/debugLogger");
10
- var _stackTrace = require("../utils/stackTrace");
11
- var _utils = require("../utils");
12
- var _zones = require("../utils/zones");
9
+ var _clientStackTrace = require("./clientStackTrace");
10
+ var _stackTrace = require("../utils/isomorphic/stackTrace");
13
11
  /**
14
12
  * Copyright (c) Microsoft Corporation.
15
13
  *
@@ -28,7 +26,8 @@ var _zones = require("../utils/zones");
28
26
 
29
27
  class ChannelOwner extends _eventEmitter.EventEmitter {
30
28
  constructor(parent, type, guid, initializer) {
31
- super();
29
+ const connection = parent instanceof ChannelOwner ? parent._connection : parent;
30
+ super(connection._platform);
32
31
  this._connection = void 0;
33
32
  this._parent = void 0;
34
33
  this._objects = new Map();
@@ -42,7 +41,7 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
42
41
  this._isInternalType = false;
43
42
  this._wasCollected = false;
44
43
  this.setMaxListeners(0);
45
- this._connection = parent instanceof ChannelOwner ? parent._connection : parent;
44
+ this._connection = connection;
46
45
  this._type = type;
47
46
  this._guid = guid;
48
47
  this._parent = parent instanceof ChannelOwner ? parent : undefined;
@@ -52,7 +51,7 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
52
51
  this._parent._objects.set(guid, this);
53
52
  this._logger = this._parent._logger;
54
53
  }
55
- this._channel = this._createChannel(new _eventEmitter.EventEmitter());
54
+ this._channel = this._createChannel(new _eventEmitter.EventEmitter(connection._platform));
56
55
  this._initializer = initializer;
57
56
  }
58
57
  markAsInternalType() {
@@ -118,6 +117,13 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
118
117
  objects: Array.from(this._objects.values()).map(o => o._debugScopeState())
119
118
  };
120
119
  }
120
+ _validatorToWireContext() {
121
+ return {
122
+ tChannelImpl: tChannelImplToWire,
123
+ binary: this._connection.rawBuffers() ? 'buffer' : 'toBase64',
124
+ isUnderTest: () => this._platform.isUnderTest()
125
+ };
126
+ }
121
127
  _createChannel(base) {
122
128
  const channel = new Proxy(base, {
123
129
  get: (obj, prop) => {
@@ -126,16 +132,13 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
126
132
  if (validator) {
127
133
  return async params => {
128
134
  return await this._wrapApiCall(async apiZone => {
129
- const validatedParams = validator(params, '', {
130
- tChannelImpl: tChannelImplToWire,
131
- binary: this._connection.rawBuffers() ? 'buffer' : 'toBase64'
132
- });
135
+ const validatedParams = validator(params, '', this._validatorToWireContext());
133
136
  if (!apiZone.isInternal && !apiZone.reported) {
134
137
  // Reporting/tracing/logging this api call for the first time.
135
138
  apiZone.params = params;
136
139
  apiZone.reported = true;
137
140
  this._instrumentation.onApiCallBegin(apiZone);
138
- logApiCall(this._logger, `=> ${apiZone.apiName} started`);
141
+ logApiCall(this._platform, this._logger, `=> ${apiZone.apiName} started`);
139
142
  return await this._connection.sendMessageToServer(this, prop, validatedParams, apiZone.apiName, apiZone.frames, apiZone.stepId);
140
143
  }
141
144
  // Since this api call is either internal, or has already been reported/traced once,
@@ -153,10 +156,10 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
153
156
  }
154
157
  async _wrapApiCall(func, isInternal) {
155
158
  const logger = this._logger;
156
- const existingApiZone = _zones.zones.zoneData('apiZone');
159
+ const existingApiZone = this._platform.zones.current().data();
157
160
  if (existingApiZone) return await func(existingApiZone);
158
161
  if (isInternal === undefined) isInternal = this._isInternalType;
159
- const stackTrace = (0, _stackTrace.captureLibraryStackTrace)();
162
+ const stackTrace = (0, _clientStackTrace.captureLibraryStackTrace)(this._platform);
160
163
  const apiZone = {
161
164
  apiName: stackTrace.apiName,
162
165
  frames: stackTrace.frames,
@@ -166,20 +169,20 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
166
169
  stepId: undefined
167
170
  };
168
171
  try {
169
- const result = await _zones.zones.run('apiZone', apiZone, async () => await func(apiZone));
172
+ const result = await this._platform.zones.current().push(apiZone).run(async () => await func(apiZone));
170
173
  if (!isInternal) {
171
- logApiCall(logger, `<= ${apiZone.apiName} succeeded`);
174
+ logApiCall(this._platform, logger, `<= ${apiZone.apiName} succeeded`);
172
175
  this._instrumentation.onApiCallEnd(apiZone);
173
176
  }
174
177
  return result;
175
178
  } catch (e) {
176
- const innerError = (process.env.PWDEBUGIMPL || (0, _utils.isUnderTest)()) && e.stack ? '\n<inner error>\n' + e.stack : '';
179
+ const innerError = (this._platform.showInternalStackFrames() || this._platform.isUnderTest()) && e.stack ? '\n<inner error>\n' + e.stack : '';
177
180
  if (apiZone.apiName && !apiZone.apiName.includes('<anonymous>')) e.message = apiZone.apiName + ': ' + e.message;
178
181
  const stackFrames = '\n' + (0, _stackTrace.stringifyStackFrames)(stackTrace.frames).join('\n') + innerError;
179
182
  if (stackFrames.trim()) e.stack = e.message + stackFrames;else e.stack = '';
180
183
  if (!isInternal) {
181
184
  apiZone.error = e;
182
- logApiCall(logger, `<= ${apiZone.apiName} failed`);
185
+ logApiCall(this._platform, logger, `<= ${apiZone.apiName} failed`);
183
186
  this._instrumentation.onApiCallEnd(apiZone);
184
187
  }
185
188
  throw e;
@@ -201,11 +204,11 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
201
204
  }
202
205
  }
203
206
  exports.ChannelOwner = ChannelOwner;
204
- function logApiCall(logger, message) {
207
+ function logApiCall(platform, logger, message) {
205
208
  if (logger && logger.isEnabled('api', 'info')) logger.log('api', 'info', message, [], {
206
209
  color: 'cyan'
207
210
  });
208
- _debugLogger.debugLogger.log('api', message);
211
+ platform.log('api', message);
209
212
  }
210
213
  function tChannelImplToWire(names, arg, path, context) {
211
214
  if (arg._object instanceof ChannelOwner && (names === '*' || names.includes(arg._object._type))) return {