@checkly/playwright-core 1.47.12 → 1.48.10-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 (227) hide show
  1. package/browsers.json +14 -10
  2. package/lib/cli/program.js +22 -12
  3. package/lib/client/api.js +6 -0
  4. package/lib/client/browserContext.js +20 -2
  5. package/lib/client/channelOwner.js +5 -2
  6. package/lib/client/connection.js +3 -0
  7. package/lib/client/fetch.js +16 -3
  8. package/lib/client/jsHandle.js +0 -8
  9. package/lib/client/localUtils.js +1 -0
  10. package/lib/client/network.js +175 -17
  11. package/lib/client/page.js +21 -0
  12. package/lib/client/playwright.js +6 -3
  13. package/lib/client/tracing.js +16 -20
  14. package/lib/generated/consoleApiSource.js +1 -1
  15. package/lib/generated/injectedScriptSource.js +1 -1
  16. package/lib/generated/pollingRecorderSource.js +7 -0
  17. package/lib/generated/webSocketMockSource.js +7 -0
  18. package/lib/protocol/validator.js +79 -14
  19. package/lib/server/bidi/bidiBrowser.js +23 -8
  20. package/lib/server/bidi/bidiChromium.js +124 -0
  21. package/lib/server/bidi/bidiConnection.js +1 -1
  22. package/lib/server/bidi/bidiExecutionContext.js +0 -3
  23. package/lib/server/bidi/bidiFirefox.js +15 -21
  24. package/lib/server/bidi/bidiInput.js +16 -32
  25. package/lib/server/bidi/bidiNetworkManager.js +39 -5
  26. package/lib/server/bidi/bidiOverCdp.js +103 -0
  27. package/lib/server/bidi/bidiPage.js +98 -25
  28. package/lib/server/bidi/bidiPdf.js +140 -0
  29. package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
  30. package/lib/server/browser.js +13 -2
  31. package/lib/server/browserContext.js +6 -23
  32. package/lib/server/browserType.js +39 -11
  33. package/lib/server/chromium/chromium.js +3 -15
  34. package/lib/server/chromium/chromiumSwitches.js +3 -1
  35. package/lib/server/chromium/crBrowser.js +4 -3
  36. package/lib/server/chromium/crExecutionContext.js +0 -7
  37. package/lib/server/chromium/crPage.js +5 -2
  38. package/lib/server/chromium/videoRecorder.js +1 -1
  39. package/lib/server/codegen/csharp.js +2 -2
  40. package/lib/server/codegen/java.js +1 -1
  41. package/lib/server/codegen/javascript.js +1 -1
  42. package/lib/server/codegen/language.js +14 -2
  43. package/lib/server/codegen/python.js +2 -2
  44. package/lib/server/cookieStore.js +73 -0
  45. package/lib/server/debugController.js +2 -2
  46. package/lib/server/deviceDescriptorsSource.json +51 -51
  47. package/lib/server/dialog.js +1 -0
  48. package/lib/server/dispatchers/browserContextDispatcher.js +19 -2
  49. package/lib/server/dispatchers/jsHandleDispatcher.js +0 -5
  50. package/lib/server/dispatchers/pageDispatcher.js +9 -0
  51. package/lib/server/dispatchers/playwrightDispatcher.js +2 -1
  52. package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
  53. package/lib/server/download.js +9 -2
  54. package/lib/server/fetch.js +96 -99
  55. package/lib/server/firefox/ffBrowser.js +6 -4
  56. package/lib/server/firefox/ffExecutionContext.js +0 -3
  57. package/lib/server/firefox/ffPage.js +3 -0
  58. package/lib/server/firefox/firefox.js +2 -13
  59. package/lib/server/frameSelectors.js +1 -1
  60. package/lib/server/frames.js +3 -2
  61. package/lib/server/har/harTracer.js +11 -0
  62. package/lib/server/input.js +0 -1
  63. package/lib/server/javascript.js +0 -7
  64. package/lib/server/page.js +5 -1
  65. package/lib/server/playwright.js +5 -2
  66. package/lib/server/recorder/contextRecorder.js +33 -50
  67. package/lib/server/recorder/recorderActions.js +2 -1
  68. package/lib/server/recorder/recorderApp.js +15 -9
  69. package/lib/server/recorder/recorderCollection.js +68 -79
  70. package/lib/server/recorder/recorderFrontend.js +5 -0
  71. package/lib/server/recorder/recorderInTraceViewer.js +144 -0
  72. package/lib/server/recorder/recorderRunner.js +75 -97
  73. package/lib/server/recorder/recorderUtils.js +47 -6
  74. package/lib/server/recorder.js +28 -25
  75. package/lib/server/registry/index.js +85 -4
  76. package/lib/server/socksClientCertificatesInterceptor.js +15 -3
  77. package/lib/server/trace/recorder/snapshotter.js +1 -0
  78. package/lib/server/trace/recorder/snapshotterInjected.js +2 -2
  79. package/lib/server/trace/recorder/tracing.js +58 -2
  80. package/lib/server/trace/test/inMemorySnapshotter.js +1 -1
  81. package/lib/server/trace/viewer/traceViewer.js +2 -5
  82. package/lib/server/webkit/webkit.js +1 -1
  83. package/lib/server/webkit/wkBrowser.js +6 -5
  84. package/lib/server/webkit/wkExecutionContext.js +0 -3
  85. package/lib/server/webkit/wkPage.js +4 -1
  86. package/lib/utils/happy-eyeballs.js +13 -0
  87. package/lib/utils/hostPlatform.js +2 -2
  88. package/lib/utils/httpServer.js +1 -0
  89. package/lib/utils/isomorphic/locatorGenerators.js +9 -18
  90. package/lib/utils/isomorphic/locatorParser.js +2 -2
  91. package/lib/utils/isomorphic/recorderUtils.js +195 -0
  92. package/lib/vite/htmlReport/index.html +12 -12
  93. package/lib/vite/recorder/assets/codeMirrorModule-CND2fZ5Q.js +24 -0
  94. package/lib/vite/recorder/assets/{index-NC7rIA63.css → index-BW-aOBcL.css} +1 -1
  95. package/lib/vite/recorder/assets/{index-A2TWT47O.js → index-CEc83sSS.js} +10 -15
  96. package/lib/vite/recorder/index.html +2 -2
  97. package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +16831 -0
  98. package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +24 -0
  99. package/lib/vite/traceViewer/assets/codeMirrorModule-BdBhzV6t.js +16443 -0
  100. package/lib/vite/traceViewer/assets/codeMirrorModule-BqcXH1AO.js +16838 -0
  101. package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +24 -0
  102. package/lib/vite/traceViewer/assets/codeMirrorModule-Ca-1BNel.js +24 -0
  103. package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
  104. package/lib/vite/{recorder/assets/codeMirrorModule-vr7pfcwZ.js → traceViewer/assets/codeMirrorModule-CqYUz5ms.js} +1 -1
  105. package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
  106. package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
  107. package/lib/vite/traceViewer/assets/codeMirrorModule-EhKN7Okm.js +16449 -0
  108. package/lib/vite/traceViewer/assets/codeMirrorModule-MzSmL4X2.js +24 -0
  109. package/lib/vite/traceViewer/assets/{codeMirrorModule-cCPLLRBo.js → codeMirrorModule-T_sdMrbM.js} +1 -1
  110. package/lib/vite/traceViewer/assets/codeMirrorModule-U6XMqGkV.js +16437 -0
  111. package/lib/vite/traceViewer/assets/inspectorTab-BABZNwlH.js +17351 -0
  112. package/lib/vite/traceViewer/assets/inspectorTab-BPzVEZSf.js +17351 -0
  113. package/lib/vite/traceViewer/assets/inspectorTab-Bbgq0hgt.js +64 -0
  114. package/lib/vite/traceViewer/assets/inspectorTab-DhBbZz8I.js +64 -0
  115. package/lib/vite/traceViewer/assets/inspectorTab-DpvLVMq5.js +17351 -0
  116. package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
  117. package/lib/vite/traceViewer/assets/workbench-B13nfocr.js +9 -0
  118. package/lib/vite/traceViewer/assets/workbench-BcgGQnKb.js +1473 -0
  119. package/lib/vite/traceViewer/assets/{wsPort-MnTGOuCA.js → workbench-Bjkiwcr1.js} +1505 -926
  120. package/lib/vite/traceViewer/assets/workbench-BwodYCgl.js +19119 -0
  121. package/lib/vite/traceViewer/assets/workbench-ByyWxoT8.js +1473 -0
  122. package/lib/vite/traceViewer/assets/{workbench-z8ylMSQK.js → workbench-C43LWZEX.js} +7 -7
  123. package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
  124. package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
  125. package/lib/vite/traceViewer/assets/workbench-DhqI6jeL.js +1473 -0
  126. package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
  127. package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
  128. package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
  129. package/lib/vite/traceViewer/assets/workbench-gtYcQBNA.js +9 -0
  130. package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
  131. package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
  132. package/lib/vite/traceViewer/assets/xtermModule-DZP0glxx.js +5982 -0
  133. package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
  134. package/lib/vite/traceViewer/embedded.27BGR_eD.js +105 -0
  135. package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
  136. package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
  137. package/lib/vite/traceViewer/{embedded.TOXRJZ9A.js → embedded.BVDVQOzc.js} +1 -1
  138. package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
  139. package/lib/vite/traceViewer/embedded.CorI3dFX.js +104 -0
  140. package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
  141. package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
  142. package/lib/vite/traceViewer/embedded.D4lqGydT.js +2 -0
  143. package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
  144. package/lib/vite/traceViewer/embedded.DTjd2aiy.js +105 -0
  145. package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
  146. package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
  147. package/lib/vite/traceViewer/embedded.SsjKHrxC.js +105 -0
  148. package/lib/vite/traceViewer/embedded.f-PLGsBT.js +2 -0
  149. package/lib/vite/traceViewer/embedded.html +6 -4
  150. package/lib/vite/traceViewer/index.B7aiTMfZ.js +2 -0
  151. package/lib/vite/traceViewer/{index.e7qpO0B0.js → index.B8dgQwuN.js} +1 -1
  152. package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
  153. package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
  154. package/lib/vite/traceViewer/index.BrT2kfuc.js +2 -0
  155. package/lib/vite/traceViewer/{index.RT4iItO_.js → index.C0EgJ4oW.js} +36 -21
  156. package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
  157. package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
  158. package/lib/vite/traceViewer/index.DsjmhbB6.js +195 -0
  159. package/lib/vite/traceViewer/index.Dz3icWJV.js +196 -0
  160. package/lib/vite/traceViewer/index.PqcsvBxQ.js +196 -0
  161. package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
  162. package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
  163. package/lib/vite/traceViewer/index.html +7 -5
  164. package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
  165. package/lib/vite/traceViewer/index.yxAwzeWG.js +196 -0
  166. package/lib/vite/traceViewer/inspectorTab.DGJWXOSd.css +3145 -0
  167. package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
  168. package/lib/vite/traceViewer/recorder.7Wl6HrQl.js +550 -0
  169. package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  170. package/lib/vite/traceViewer/recorder.BufKu9Hp.js +550 -0
  171. package/lib/vite/traceViewer/recorder.Ch-WHviK.js +2 -0
  172. package/lib/vite/traceViewer/recorder.DBDpiNOK.css +15 -0
  173. package/lib/vite/traceViewer/recorder.POd-toIn.js +2 -0
  174. package/lib/vite/traceViewer/recorder.am-MV-DQ.js +550 -0
  175. package/lib/vite/traceViewer/recorder.html +17 -0
  176. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  177. package/lib/vite/traceViewer/uiMode.BEZVCe5O.js +5 -0
  178. package/lib/vite/traceViewer/uiMode.BZoFj6zV.js +1723 -0
  179. package/lib/vite/traceViewer/uiMode.C4nbcio6.js +1730 -0
  180. package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
  181. package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
  182. package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
  183. package/lib/vite/traceViewer/uiMode.DRmgrHSk.css +1462 -0
  184. package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
  185. package/lib/vite/traceViewer/{uiMode.MTXOs_2V.js → uiMode.DVrL7a1K.js} +5 -5
  186. package/lib/vite/traceViewer/uiMode.DdtUZZVS.js +5 -0
  187. package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
  188. package/lib/vite/traceViewer/uiMode.Dlo9s_YX.js +1723 -0
  189. package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
  190. package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
  191. package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
  192. package/lib/vite/traceViewer/uiMode.html +7 -5
  193. package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
  194. package/lib/vite/traceViewer/uiMode.wsGnVMQK.js +1723 -0
  195. package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
  196. package/lib/vite/traceViewer/workbench.BQNDbcQ0.css +550 -0
  197. package/lib/vite/traceViewer/{workbench.NokwQoMV.css → workbench.DjbIuxix.css} +1 -1
  198. package/lib/vite/traceViewer/workbench.DlsCx8k5.css +1 -0
  199. package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
  200. package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
  201. package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
  202. package/package.json +1 -1
  203. package/types/protocol.d.ts +610 -173
  204. package/types/types.d.ts +2037 -949
  205. package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
  206. package/lib/vite/traceViewer/assets/codeMirrorModule-clyjx5sb.js +0 -15578
  207. package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
  208. package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
  209. package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
  210. package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
  211. package/lib/vite/traceViewer/index.-g_5lMbJ.css +0 -1
  212. package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
  213. package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
  214. package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
  215. package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
  216. package/lib/vite/traceViewer/uiMode.yLNTmFO4.js +0 -1490
  217. package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
  218. /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
  219. /package/lib/vite/recorder/assets/{codicon-wpoHPmsu.ttf → codicon-DCmgc-ay.ttf} +0 -0
  220. /package/lib/vite/traceViewer/assets/{testServerConnection-_1gRQKgk.js → testServerConnection-DeE2kSzz.js} +0 -0
  221. /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
  222. /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
  223. /package/lib/vite/traceViewer/{codicon.wpoHPmsu.ttf → codicon.DCmgc-ay.ttf} +0 -0
  224. /package/lib/vite/traceViewer/{embedded.MO1jdrtU.css → embedded.w7WN2u1R.css} +0 -0
  225. /package/lib/vite/traceViewer/{index.q21lh23x.css → index.CrbWWHbf.css} +0 -0
  226. /package/lib/vite/traceViewer/{uiMode.93DRT-rm.css → uiMode.D3cNFP6u.css} +0 -0
  227. /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
@@ -10,6 +10,7 @@ var _utils = require("../../utils");
10
10
  var _browserType = require("../browserType");
11
11
  var _bidiBrowser = require("./bidiBrowser");
12
12
  var _bidiConnection = require("./bidiConnection");
13
+ var _firefoxPrefs = require("./third_party/firefoxPrefs");
13
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
15
  /**
15
16
  * Copyright (c) Microsoft Corporation.
@@ -44,6 +45,12 @@ class BidiFirefox extends _browserType.BrowserType {
44
45
  }
45
46
  amendEnvironment(env, userDataDir, executable, browserArguments) {
46
47
  if (!_path.default.isAbsolute(_os.default.homedir())) throw new Error(`Cannot launch Firefox with relative home directory. Did you set ${_os.default.platform() === 'win32' ? 'USERPROFILE' : 'HOME'} to a relative path?`);
48
+ env = {
49
+ ...env,
50
+ 'MOZ_CRASHREPORTER': '1',
51
+ 'MOZ_CRASHREPORTER_NO_REPORT': '1',
52
+ 'MOZ_CRASHREPORTER_SHUTDOWN': '1'
53
+ };
47
54
  if (_os.default.platform() === 'linux') {
48
55
  // Always remove SNAP_NAME and SNAP_INSTANCE_NAME env variables since they
49
56
  // confuse Firefox: in our case, builds never come from SNAP.
@@ -63,6 +70,12 @@ class BidiFirefox extends _browserType.BrowserType {
63
70
  id: _bidiConnection.kBrowserCloseMessageId
64
71
  });
65
72
  }
73
+ async prepareUserDataDir(options, userDataDir) {
74
+ await (0, _firefoxPrefs.createProfile)({
75
+ path: userDataDir,
76
+ preferences: options.firefoxUserPrefs || {}
77
+ });
78
+ }
66
79
  defaultArgs(options, isPersistent, userDataDir) {
67
80
  const {
68
81
  args = [],
@@ -74,37 +87,18 @@ class BidiFirefox extends _browserType.BrowserType {
74
87
  if (headless) firefoxArguments.push('--headless');else firefoxArguments.push('--foreground');
75
88
  firefoxArguments.push(`--profile`, userDataDir);
76
89
  firefoxArguments.push(...args);
77
- // TODO: make ephemeral context work without this argument.
78
- firefoxArguments.push('about:blank');
79
- // if (isPersistent)
80
- // firefoxArguments.push('about:blank');
81
- // else
82
- // firefoxArguments.push('-silent');
83
90
  return firefoxArguments;
84
91
  }
85
92
  readyState(options) {
86
93
  (0, _utils.assert)(options.useWebSocket);
87
- return new BidiReadyState();
94
+ return new FirefoxReadyState();
88
95
  }
89
96
  }
90
97
  exports.BidiFirefox = BidiFirefox;
91
- class BidiReadyState {
92
- constructor() {
93
- this._wsEndpoint = new _utils.ManualPromise();
94
- }
98
+ class FirefoxReadyState extends _browserType.BrowserReadyState {
95
99
  onBrowserOutput(message) {
96
100
  // Bidi WebSocket in Firefox.
97
101
  const match = message.match(/WebDriver BiDi listening on (ws:\/\/.*)$/);
98
102
  if (match) this._wsEndpoint.resolve(match[1] + '/session');
99
103
  }
100
- onBrowserExit() {
101
- // Unblock launch when browser prematurely exits.
102
- this._wsEndpoint.resolve(undefined);
103
- }
104
- async waitUntilReady() {
105
- const wsEndpoint = await this._wsEndpoint;
106
- return {
107
- wsEndpoint
108
- };
109
- }
110
104
  }
@@ -82,7 +82,7 @@ class RawMouseImpl {
82
82
  this._session = session;
83
83
  }
84
84
  async move(x, y, button, buttons, modifiers, forClick) {
85
- // TODO: bidi throws when x/y are not integers.
85
+ // Bidi throws when x/y are not integers.
86
86
  x = Math.round(x);
87
87
  y = Math.round(y);
88
88
  await this._performActions([{
@@ -103,41 +103,25 @@ class RawMouseImpl {
103
103
  button: toBidiButton(button)
104
104
  }]);
105
105
  }
106
- async click(x, y, options = {}) {
106
+ async wheel(x, y, buttons, modifiers, deltaX, deltaY) {
107
+ // Bidi throws when x/y are not integers.
107
108
  x = Math.round(x);
108
109
  y = Math.round(y);
109
- const button = toBidiButton(options.button || 'left');
110
- const {
111
- delay = null,
112
- clickCount = 1
113
- } = options;
114
- const actions = [];
115
- actions.push({
116
- type: 'pointerMove',
117
- x,
118
- y
110
+ await this._session.send('input.performActions', {
111
+ context: this._session.sessionId,
112
+ actions: [{
113
+ type: 'wheel',
114
+ id: 'pw_mouse_wheel',
115
+ actions: [{
116
+ type: 'scroll',
117
+ x,
118
+ y,
119
+ deltaX,
120
+ deltaY
121
+ }]
122
+ }]
119
123
  });
120
- for (let cc = 1; cc <= clickCount; ++cc) {
121
- actions.push({
122
- type: 'pointerDown',
123
- button
124
- });
125
- if (delay) actions.push({
126
- type: 'pause',
127
- duration: delay
128
- });
129
- actions.push({
130
- type: 'pointerUp',
131
- button
132
- });
133
- if (delay && cc < clickCount) actions.push({
134
- type: 'pause',
135
- duration: delay
136
- });
137
- }
138
- await this._performActions(actions);
139
124
  }
140
- async wheel(x, y, buttons, modifiers, deltaX, deltaY) {}
141
125
  async _performActions(actions) {
142
126
  await this._session.send('input.performActions', {
143
127
  context: this._session.sessionId,
@@ -8,6 +8,7 @@ exports.bidiBytesValueToString = bidiBytesValueToString;
8
8
  var _eventsHelper = require("../../utils/eventsHelper");
9
9
  var network = _interopRequireWildcard(require("../network"));
10
10
  var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
11
+ var _cookieStore = require("../cookieStore");
11
12
  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); }
12
13
  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; }
13
14
  /**
@@ -59,7 +60,7 @@ class BidiNetworkManager {
59
60
  var _redirectedFrom$_orig;
60
61
  this._session.sendMayFail('network.continueRequest', {
61
62
  request: param.request.request,
62
- headers: (_redirectedFrom$_orig = redirectedFrom._originalRequestRoute) === null || _redirectedFrom$_orig === void 0 ? void 0 : _redirectedFrom$_orig._alreadyContinuedHeaders
63
+ ...(((_redirectedFrom$_orig = redirectedFrom._originalRequestRoute) === null || _redirectedFrom$_orig === void 0 ? void 0 : _redirectedFrom$_orig._alreadyContinuedHeaders) || {})
63
64
  });
64
65
  } else {
65
66
  route = new BidiRouteImpl(this._session, param.request.request);
@@ -242,13 +243,12 @@ class BidiRouteImpl {
242
243
  return header;
243
244
  });
244
245
  }
245
- this._alreadyContinuedHeaders = toBidiHeaders(headers);
246
+ this._alreadyContinuedHeaders = headers;
246
247
  await this._session.sendMayFail('network.continueRequest', {
247
248
  request: this._requestId,
248
249
  url: overrides.url,
249
250
  method: overrides.method,
250
- // TODO: cookies!
251
- headers: this._alreadyContinuedHeaders,
251
+ ...toBidiRequestHeaders(this._alreadyContinuedHeaders),
252
252
  body: overrides.postData ? {
253
253
  type: 'base64',
254
254
  value: Buffer.from(overrides.postData).toString('base64')
@@ -261,7 +261,7 @@ class BidiRouteImpl {
261
261
  request: this._requestId,
262
262
  statusCode: response.status,
263
263
  reasonPhrase: network.statusText(response.status),
264
- headers: toBidiHeaders(response.headers),
264
+ ...toBidiResponseHeaders(response.headers),
265
265
  body: {
266
266
  type: 'base64',
267
267
  value: base64body
@@ -285,6 +285,34 @@ function fromBidiHeaders(bidiHeaders) {
285
285
  });
286
286
  return result;
287
287
  }
288
+ function toBidiRequestHeaders(allHeaders) {
289
+ const bidiHeaders = toBidiHeaders(allHeaders);
290
+ const cookies = bidiHeaders.filter(h => h.name.toLowerCase() === 'cookie');
291
+ const headers = bidiHeaders.filter(h => h.name.toLowerCase() !== 'cookie');
292
+ return {
293
+ cookies,
294
+ headers
295
+ };
296
+ }
297
+ function toBidiResponseHeaders(headers) {
298
+ const setCookieHeaders = headers.filter(h => h.name.toLowerCase() === 'set-cookie');
299
+ const otherHeaders = headers.filter(h => h.name.toLowerCase() !== 'set-cookie');
300
+ const rawCookies = setCookieHeaders.map(h => (0, _cookieStore.parseRawCookie)(h.value));
301
+ const cookies = rawCookies.filter(Boolean).map(c => {
302
+ return {
303
+ ...c,
304
+ value: {
305
+ type: 'string',
306
+ value: c.value
307
+ },
308
+ sameSite: toBidiSameSite(c.sameSite)
309
+ };
310
+ });
311
+ return {
312
+ cookies,
313
+ headers: toBidiHeaders(otherHeaders)
314
+ };
315
+ }
288
316
  function toBidiHeaders(headers) {
289
317
  return headers.map(({
290
318
  name,
@@ -301,4 +329,10 @@ function bidiBytesValueToString(value) {
301
329
  if (value.type === 'string') return value.value;
302
330
  if (value.type === 'base64') return Buffer.from(value.type, 'base64').toString('binary');
303
331
  return 'unknown value type: ' + value.type;
332
+ }
333
+ function toBidiSameSite(sameSite) {
334
+ if (!sameSite) return undefined;
335
+ if (sameSite === 'Strict') return bidi.Network.SameSite.Strict;
336
+ if (sameSite === 'Lax') return bidi.Network.SameSite.Lax;
337
+ return bidi.Network.SameSite.None;
304
338
  }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.connectBidiOverCdp = connectBidiOverCdp;
7
+ var bidiMapper = _interopRequireWildcard(require("chromium-bidi/lib/cjs/bidiMapper/BidiMapper"));
8
+ var bidiCdpConnection = _interopRequireWildcard(require("chromium-bidi/lib/cjs/cdp/CdpConnection"));
9
+ var _debugLogger = require("../../utils/debugLogger");
10
+ 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); }
11
+ 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; }
12
+ /**
13
+ * Copyright (c) Microsoft Corporation.
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the 'License');
16
+ * you may not use this file except in compliance with the License.
17
+ * You may obtain a copy of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an 'AS IS' BASIS,
23
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ * See the License for the specific language governing permissions and
25
+ * limitations under the License.
26
+ */
27
+
28
+ const bidiServerLogger = (prefix, ...args) => {
29
+ _debugLogger.debugLogger.log(prefix, args);
30
+ };
31
+ async function connectBidiOverCdp(cdp) {
32
+ let server = undefined;
33
+ const bidiTransport = new BidiTransportImpl();
34
+ const bidiConnection = new BidiConnection(bidiTransport, () => {
35
+ var _server;
36
+ return (_server = server) === null || _server === void 0 ? void 0 : _server.close();
37
+ });
38
+ const cdpTransportImpl = new CdpTransportImpl(cdp);
39
+ const cdpConnection = new bidiCdpConnection.MapperCdpConnection(cdpTransportImpl, bidiServerLogger);
40
+ // Make sure onclose event is propagated.
41
+ cdp.onclose = () => {
42
+ var _bidiConnection$onclo;
43
+ return (_bidiConnection$onclo = bidiConnection.onclose) === null || _bidiConnection$onclo === void 0 ? void 0 : _bidiConnection$onclo.call(bidiConnection);
44
+ };
45
+ server = await bidiMapper.BidiServer.createAndStart(bidiTransport, cdpConnection, await cdpConnection.createBrowserSession(), /* selfTargetId= */'', undefined, bidiServerLogger);
46
+ return bidiConnection;
47
+ }
48
+ class BidiTransportImpl {
49
+ constructor() {
50
+ this._handler = void 0;
51
+ this._bidiConnection = void 0;
52
+ }
53
+ setOnMessage(handler) {
54
+ this._handler = handler;
55
+ }
56
+ sendMessage(message) {
57
+ var _this$_bidiConnection, _this$_bidiConnection2;
58
+ return (_this$_bidiConnection = (_this$_bidiConnection2 = this._bidiConnection).onmessage) === null || _this$_bidiConnection === void 0 ? void 0 : _this$_bidiConnection.call(_this$_bidiConnection2, message);
59
+ }
60
+ close() {
61
+ var _this$_bidiConnection3, _this$_bidiConnection4;
62
+ (_this$_bidiConnection3 = (_this$_bidiConnection4 = this._bidiConnection).onclose) === null || _this$_bidiConnection3 === void 0 || _this$_bidiConnection3.call(_this$_bidiConnection4);
63
+ }
64
+ }
65
+ class BidiConnection {
66
+ constructor(bidiTransport, closeCallback) {
67
+ this._bidiTransport = void 0;
68
+ this._closeCallback = void 0;
69
+ this.onmessage = void 0;
70
+ this.onclose = void 0;
71
+ this._bidiTransport = bidiTransport;
72
+ this._bidiTransport._bidiConnection = this;
73
+ this._closeCallback = closeCallback;
74
+ }
75
+ send(s) {
76
+ var _this$_bidiTransport$, _this$_bidiTransport;
77
+ (_this$_bidiTransport$ = (_this$_bidiTransport = this._bidiTransport)._handler) === null || _this$_bidiTransport$ === void 0 || _this$_bidiTransport$.call(_this$_bidiTransport, s);
78
+ }
79
+ close() {
80
+ this._closeCallback();
81
+ }
82
+ }
83
+ class CdpTransportImpl {
84
+ constructor(connection) {
85
+ this._connection = void 0;
86
+ this._handler = void 0;
87
+ this._bidiConnection = void 0;
88
+ this._connection = connection;
89
+ this._connection.onmessage = message => {
90
+ var _this$_handler;
91
+ (_this$_handler = this._handler) === null || _this$_handler === void 0 || _this$_handler.call(this, JSON.stringify(message));
92
+ };
93
+ }
94
+ setOnMessage(handler) {
95
+ this._handler = handler;
96
+ }
97
+ sendMessage(message) {
98
+ return this._connection.send(JSON.parse(message));
99
+ }
100
+ close() {
101
+ this._connection.close();
102
+ }
103
+ }
@@ -14,6 +14,7 @@ var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
14
14
  var _bidiExecutionContext = require("./bidiExecutionContext");
15
15
  var _bidiNetworkManager = require("./bidiNetworkManager");
16
16
  var _browserContext = require("../browserContext");
17
+ var _bidiPdf = require("./bidiPdf");
17
18
  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); }
18
19
  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; }
19
20
  /**
@@ -33,6 +34,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
33
34
  */
34
35
 
35
36
  const UTILITY_WORLD_NAME = '__playwright_utility_world__';
37
+ const kPlaywrightBindingChannel = 'playwrightChannel';
36
38
  class BidiPage {
37
39
  constructor(browserContext, bidiSession, opener) {
38
40
  this.rawMouse = void 0;
@@ -46,7 +48,9 @@ class BidiPage {
46
48
  this._sessionListeners = [];
47
49
  this._browserContext = void 0;
48
50
  this._networkManager = void 0;
51
+ this._pdf = void 0;
49
52
  this._initializedPage = null;
53
+ this._initScriptIds = [];
50
54
  this._session = bidiSession;
51
55
  this._opener = opener;
52
56
  this.rawKeyboard = new _bidiInput.RawKeyboardImpl(bidiSession);
@@ -56,8 +60,9 @@ class BidiPage {
56
60
  this._page = new _page.Page(this, browserContext);
57
61
  this._browserContext = browserContext;
58
62
  this._networkManager = new _bidiNetworkManager.BidiNetworkManager(this._session, this._page, this._onNavigationResponseStarted.bind(this));
63
+ this._pdf = new _bidiPdf.BidiPDF(this._session);
59
64
  this._page.on(_page.Page.Events.FrameDetached, frame => this._removeContextsForFrame(frame, false));
60
- this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.realmCreated', this._onRealmCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.contextDestroyed', this._onBrowsingContextDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationStarted', this._onNavigationStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationAborted', this._onNavigationAborted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationFailed', this._onNavigationFailed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.fragmentNavigated', this._onFragmentNavigated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.domContentLoaded', this._onDomContentLoaded.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.load', this._onLoad.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.userPromptOpened', this._onUserPromptOpened.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'log.entryAdded', this._onLogEntryAdded.bind(this))];
65
+ this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.realmCreated', this._onRealmCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.message', this._onScriptMessage.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.contextDestroyed', this._onBrowsingContextDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationStarted', this._onNavigationStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationAborted', this._onNavigationAborted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationFailed', this._onNavigationFailed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.fragmentNavigated', this._onFragmentNavigated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.domContentLoaded', this._onDomContentLoaded.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.load', this._onLoad.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.userPromptOpened', this._onUserPromptOpened.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'log.entryAdded', this._onLogEntryAdded.bind(this))];
61
66
 
62
67
  // Initialize main frame.
63
68
  this._pagePromise = this._initialize().finally(async () => {
@@ -72,18 +77,12 @@ class BidiPage {
72
77
  });
73
78
  }
74
79
  async _initialize() {
75
- const {
76
- contexts
77
- } = await this._session.send('browsingContext.getTree', {
78
- root: this._session.sessionId
79
- });
80
- this._handleFrameTree(contexts[0]);
81
- await Promise.all([this.updateHttpCredentials(), this.updateRequestInterception(), this._updateViewport()]);
80
+ // Initialize main frame.
81
+ this._onFrameAttached(this._session.sessionId, null);
82
+ await Promise.all([this.updateHttpCredentials(), this.updateRequestInterception(), this._updateViewport(), this._installMainBinding(), this._addAllInitScripts()]);
82
83
  }
83
- _handleFrameTree(frameTree) {
84
- this._onFrameAttached(frameTree.context, frameTree.parent || null);
85
- if (!frameTree.children) return;
86
- for (const child of frameTree.children) this._handleFrameTree(child);
84
+ async _addAllInitScripts() {
85
+ return Promise.all(this._page.allInitScripts().map(initScript => this.addInitScript(initScript)));
87
86
  }
88
87
  potentiallyUninitializedPage() {
89
88
  return this._page;
@@ -236,7 +235,11 @@ class BidiPage {
236
235
  await this._updateViewport();
237
236
  }
238
237
  async updateUserAgent() {}
239
- async bringToFront() {}
238
+ async bringToFront() {
239
+ await this._session.send('browsingContext.activate', {
240
+ context: this._session.sessionId
241
+ });
242
+ }
240
243
  async _updateViewport() {
241
244
  const options = this._browserContext._options;
242
245
  const deviceSize = this._page.emulatedSize();
@@ -266,20 +269,72 @@ class BidiPage {
266
269
  wait: bidi.BrowsingContext.ReadinessState.Interactive
267
270
  });
268
271
  }
269
- goBack() {
270
- throw new Error('Method not implemented.');
272
+ async goBack() {
273
+ return await this._session.send('browsingContext.traverseHistory', {
274
+ context: this._session.sessionId,
275
+ delta: -1
276
+ }).then(() => true).catch(() => false);
277
+ }
278
+ async goForward() {
279
+ return await this._session.send('browsingContext.traverseHistory', {
280
+ context: this._session.sessionId,
281
+ delta: +1
282
+ }).then(() => true).catch(() => false);
271
283
  }
272
- goForward() {
284
+ async requestGC() {
273
285
  throw new Error('Method not implemented.');
274
286
  }
287
+
288
+ // TODO: consider calling this only when bindings are added.
289
+ async _installMainBinding() {
290
+ const functionDeclaration = addMainBinding.toString();
291
+ const args = [{
292
+ type: 'channel',
293
+ value: {
294
+ channel: kPlaywrightBindingChannel,
295
+ ownership: bidi.Script.ResultOwnership.Root
296
+ }
297
+ }];
298
+ const promises = [];
299
+ promises.push(this._session.send('script.addPreloadScript', {
300
+ functionDeclaration,
301
+ arguments: args
302
+ }));
303
+ promises.push(this._session.send('script.callFunction', {
304
+ functionDeclaration,
305
+ arguments: args,
306
+ target: toBidiExecutionContext(await this._page.mainFrame()._mainContext())._target,
307
+ awaitPromise: false,
308
+ userActivation: false
309
+ }));
310
+ await Promise.all(promises);
311
+ }
312
+ async _onScriptMessage(event) {
313
+ if (event.channel !== kPlaywrightBindingChannel) return;
314
+ const pageOrError = await this.pageOrError();
315
+ if (pageOrError instanceof Error) return;
316
+ const context = this._realmToContext.get(event.source.realm);
317
+ if (!context) return;
318
+ if (event.data.type !== 'string') return;
319
+ await this._page._onBindingCalled(event.data.value, context);
320
+ }
275
321
  async addInitScript(initScript) {
276
- await this._updateBootstrapScript();
322
+ const {
323
+ script
324
+ } = await this._session.send('script.addPreloadScript', {
325
+ // TODO: remove function call from the source.
326
+ functionDeclaration: `() => { return ${initScript.source} }`,
327
+ // TODO: push to iframes?
328
+ contexts: [this._session.sessionId]
329
+ });
330
+ if (!initScript.internal) this._initScriptIds.push(script);
277
331
  }
278
332
  async removeNonInternalInitScripts() {
279
- await this._updateBootstrapScript();
280
- }
281
- async _updateBootstrapScript() {
282
- throw new Error('Method not implemented.');
333
+ const promises = this._initScriptIds.map(script => this._session.send('script.removePreloadScript', {
334
+ script
335
+ }));
336
+ this._initScriptIds = [];
337
+ await Promise.all(promises);
283
338
  }
284
339
  async closePage(runBeforeUnload) {
285
340
  await this._session.send('browsingContext.close', {
@@ -289,7 +344,22 @@ class BidiPage {
289
344
  }
290
345
  async setBackgroundColor(color) {}
291
346
  async takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, scale) {
292
- throw new Error('Method not implemented.');
347
+ const rect = documentRect || viewportRect;
348
+ const {
349
+ data
350
+ } = await this._session.send('browsingContext.captureScreenshot', {
351
+ context: this._session.sessionId,
352
+ format: {
353
+ type: `image/${format === 'png' ? 'png' : 'jpeg'}`,
354
+ quality: quality || 80
355
+ },
356
+ origin: documentRect ? 'document' : 'viewport',
357
+ clip: {
358
+ type: 'box',
359
+ ...rect
360
+ }
361
+ });
362
+ return Buffer.from(data, 'base64');
293
363
  }
294
364
  async getContentFrame(handle) {
295
365
  const executionContext = toBidiExecutionContext(handle._context);
@@ -419,6 +489,9 @@ class BidiPage {
419
489
  }
420
490
  async inputActionEpilogue() {}
421
491
  async resetForReuse() {}
492
+ async pdf(options) {
493
+ return this._pdf.generate(options);
494
+ }
422
495
  async getFrameElement(frame) {
423
496
  const parent = frame.parentFrame();
424
497
  if (!parent) throw new Error('Frame has been detached.');
@@ -445,11 +518,11 @@ class BidiPage {
445
518
  shouldToggleStyleSheetToSyncAnimations() {
446
519
  return true;
447
520
  }
448
- useMainWorldForSetContent() {
449
- return true;
450
- }
451
521
  }
452
522
  exports.BidiPage = BidiPage;
523
+ function addMainBinding(callback) {
524
+ globalThis['__playwright__binding__'] = callback;
525
+ }
453
526
  function toBidiExecutionContext(executionContext) {
454
527
  return executionContext[contextDelegateSymbol];
455
528
  }
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BidiPDF = void 0;
7
+ var _utils = require("../../utils");
8
+ /**
9
+ * Copyright 2017 Google Inc. All rights reserved.
10
+ * Modifications copyright (c) Microsoft Corporation.
11
+ *
12
+ * Licensed under the Apache License, Version 2.0 (the "License");
13
+ * you may not use this file except in compliance with the License.
14
+ * You may obtain a copy of the License at
15
+ *
16
+ * http://www.apache.org/licenses/LICENSE-2.0
17
+ *
18
+ * Unless required by applicable law or agreed to in writing, software
19
+ * distributed under the License is distributed on an "AS IS" BASIS,
20
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
+ * See the License for the specific language governing permissions and
22
+ * limitations under the License.
23
+ */
24
+
25
+ const PagePaperFormats = {
26
+ letter: {
27
+ width: 8.5,
28
+ height: 11
29
+ },
30
+ legal: {
31
+ width: 8.5,
32
+ height: 14
33
+ },
34
+ tabloid: {
35
+ width: 11,
36
+ height: 17
37
+ },
38
+ ledger: {
39
+ width: 17,
40
+ height: 11
41
+ },
42
+ a0: {
43
+ width: 33.1,
44
+ height: 46.8
45
+ },
46
+ a1: {
47
+ width: 23.4,
48
+ height: 33.1
49
+ },
50
+ a2: {
51
+ width: 16.54,
52
+ height: 23.4
53
+ },
54
+ a3: {
55
+ width: 11.7,
56
+ height: 16.54
57
+ },
58
+ a4: {
59
+ width: 8.27,
60
+ height: 11.7
61
+ },
62
+ a5: {
63
+ width: 5.83,
64
+ height: 8.27
65
+ },
66
+ a6: {
67
+ width: 4.13,
68
+ height: 5.83
69
+ }
70
+ };
71
+ const unitToPixels = {
72
+ 'px': 1,
73
+ 'in': 96,
74
+ 'cm': 37.8,
75
+ 'mm': 3.78
76
+ };
77
+ function convertPrintParameterToInches(text) {
78
+ if (text === undefined) return undefined;
79
+ let unit = text.substring(text.length - 2).toLowerCase();
80
+ let valueText = '';
81
+ if (unitToPixels.hasOwnProperty(unit)) {
82
+ valueText = text.substring(0, text.length - 2);
83
+ } else {
84
+ // In case of unknown unit try to parse the whole parameter as number of pixels.
85
+ // This is consistent with phantom's paperSize behavior.
86
+ unit = 'px';
87
+ valueText = text;
88
+ }
89
+ const value = Number(valueText);
90
+ (0, _utils.assert)(!isNaN(value), 'Failed to parse parameter value: ' + text);
91
+ const pixels = value * unitToPixels[unit];
92
+ return pixels / 96;
93
+ }
94
+ class BidiPDF {
95
+ constructor(session) {
96
+ this._session = void 0;
97
+ this._session = session;
98
+ }
99
+ async generate(options) {
100
+ const {
101
+ scale = 1,
102
+ printBackground = false,
103
+ landscape = false,
104
+ pageRanges = '',
105
+ margin = {}
106
+ } = options;
107
+ let paperWidth = 8.5;
108
+ let paperHeight = 11;
109
+ if (options.format) {
110
+ const format = PagePaperFormats[options.format.toLowerCase()];
111
+ (0, _utils.assert)(format, 'Unknown paper format: ' + options.format);
112
+ paperWidth = format.width;
113
+ paperHeight = format.height;
114
+ } else {
115
+ paperWidth = convertPrintParameterToInches(options.width) || paperWidth;
116
+ paperHeight = convertPrintParameterToInches(options.height) || paperHeight;
117
+ }
118
+ const {
119
+ data
120
+ } = await this._session.send('browsingContext.print', {
121
+ context: this._session.sessionId,
122
+ background: printBackground,
123
+ margin: {
124
+ bottom: convertPrintParameterToInches(margin.bottom) || 0,
125
+ left: convertPrintParameterToInches(margin.left) || 0,
126
+ right: convertPrintParameterToInches(margin.right) || 0,
127
+ top: convertPrintParameterToInches(margin.top) || 0
128
+ },
129
+ orientation: landscape ? 'landscape' : 'portrait',
130
+ page: {
131
+ width: paperWidth,
132
+ height: paperHeight
133
+ },
134
+ pageRanges: pageRanges ? pageRanges.split(',').map(r => r.trim()) : undefined,
135
+ scale
136
+ });
137
+ return Buffer.from(data, 'base64');
138
+ }
139
+ }
140
+ exports.BidiPDF = BidiPDF;