rebrowser-playwright-core 1.47.100 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +1 -1
  2. package/ThirdPartyNotices.txt +70 -384
  3. package/bin/reinstall_chrome_beta_linux.sh +10 -8
  4. package/bin/reinstall_chrome_stable_linux.sh +10 -8
  5. package/bin/reinstall_msedge_beta_linux.sh +11 -9
  6. package/bin/reinstall_msedge_dev_linux.sh +11 -9
  7. package/bin/reinstall_msedge_stable_linux.sh +11 -9
  8. package/browsers.json +24 -12
  9. package/lib/cli/program.js +49 -19
  10. package/lib/client/api.js +6 -0
  11. package/lib/client/browserContext.js +20 -2
  12. package/lib/client/channelOwner.js +6 -2
  13. package/lib/client/connection.js +3 -0
  14. package/lib/client/fetch.js +16 -21
  15. package/lib/client/jsHandle.js +0 -8
  16. package/lib/client/localUtils.js +1 -0
  17. package/lib/client/locator.js +7 -0
  18. package/lib/client/network.js +180 -17
  19. package/lib/client/page.js +25 -2
  20. package/lib/client/playwright.js +6 -3
  21. package/lib/client/tracing.js +29 -20
  22. package/lib/client/waiter.js +15 -11
  23. package/lib/generated/consoleApiSource.js +1 -1
  24. package/lib/generated/injectedScriptSource.js +1 -1
  25. package/lib/generated/pollingRecorderSource.js +7 -0
  26. package/lib/generated/webSocketMockSource.js +7 -0
  27. package/lib/protocol/validator.js +103 -17
  28. package/lib/server/ariaSnapshot.js +33 -0
  29. package/lib/server/bidi/bidiBrowser.js +23 -8
  30. package/lib/server/bidi/bidiChromium.js +124 -0
  31. package/lib/server/bidi/bidiConnection.js +1 -3
  32. package/lib/server/bidi/bidiExecutionContext.js +0 -6
  33. package/lib/server/bidi/bidiFirefox.js +15 -21
  34. package/lib/server/bidi/bidiInput.js +16 -32
  35. package/lib/server/bidi/bidiNetworkManager.js +39 -5
  36. package/lib/server/bidi/bidiOverCdp.js +103 -0
  37. package/lib/server/bidi/bidiPage.js +98 -25
  38. package/lib/server/bidi/bidiPdf.js +140 -0
  39. package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
  40. package/lib/server/browser.js +13 -2
  41. package/lib/server/browserContext.js +6 -23
  42. package/lib/server/browserType.js +43 -12
  43. package/lib/server/chromium/chromium.js +9 -17
  44. package/lib/server/chromium/chromiumSwitches.js +3 -1
  45. package/lib/server/chromium/crBrowser.js +4 -3
  46. package/lib/server/chromium/crConnection.js +153 -0
  47. package/lib/server/chromium/crExecutionContext.js +0 -20
  48. package/lib/server/chromium/crPage.js +13 -7
  49. package/lib/server/chromium/videoRecorder.js +1 -1
  50. package/lib/server/codegen/csharp.js +12 -17
  51. package/lib/server/codegen/java.js +5 -8
  52. package/lib/server/codegen/javascript.js +29 -7
  53. package/lib/server/codegen/language.js +14 -2
  54. package/lib/server/codegen/python.js +13 -17
  55. package/lib/server/cookieStore.js +73 -0
  56. package/lib/server/debugController.js +10 -7
  57. package/lib/server/deviceDescriptorsSource.json +127 -127
  58. package/lib/server/dialog.js +1 -0
  59. package/lib/server/dispatchers/androidDispatcher.js +13 -2
  60. package/lib/server/dispatchers/browserContextDispatcher.js +19 -2
  61. package/lib/server/dispatchers/debugControllerDispatcher.js +1 -1
  62. package/lib/server/dispatchers/dispatcher.js +1 -1
  63. package/lib/server/dispatchers/frameDispatcher.js +8 -1
  64. package/lib/server/dispatchers/jsHandleDispatcher.js +0 -5
  65. package/lib/server/dispatchers/pageDispatcher.js +9 -0
  66. package/lib/server/dispatchers/playwrightDispatcher.js +2 -1
  67. package/lib/server/dispatchers/tracingDispatcher.js +10 -0
  68. package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
  69. package/lib/server/dom.js +79 -36
  70. package/lib/server/download.js +9 -2
  71. package/lib/server/fetch.js +105 -96
  72. package/lib/server/firefox/ffBrowser.js +6 -4
  73. package/lib/server/firefox/ffExecutionContext.js +0 -15
  74. package/lib/server/firefox/ffNetworkManager.js +1 -1
  75. package/lib/server/firefox/ffPage.js +6 -3
  76. package/lib/server/firefox/firefox.js +2 -13
  77. package/lib/server/frameSelectors.js +1 -1
  78. package/lib/server/frames.js +68 -67
  79. package/lib/server/har/harTracer.js +11 -0
  80. package/lib/server/index.js +0 -6
  81. package/lib/server/input.js +0 -1
  82. package/lib/server/javascript.js +0 -13
  83. package/lib/server/page.js +53 -9
  84. package/lib/server/playwright.js +5 -2
  85. package/lib/server/progress.js +0 -3
  86. package/lib/server/recorder/contextRecorder.js +33 -50
  87. package/lib/server/recorder/recorderApp.js +22 -25
  88. package/lib/server/recorder/recorderCollection.js +68 -79
  89. package/lib/server/recorder/recorderInTraceViewer.js +144 -0
  90. package/lib/server/recorder/recorderRunner.js +75 -97
  91. package/lib/server/recorder/recorderUtils.js +48 -6
  92. package/lib/server/recorder.js +87 -47
  93. package/lib/server/registry/index.js +154 -26
  94. package/lib/server/registry/nativeDeps.js +6 -3
  95. package/lib/server/socksClientCertificatesInterceptor.js +15 -3
  96. package/lib/server/trace/recorder/snapshotter.js +2 -12
  97. package/lib/server/trace/recorder/snapshotterInjected.js +21 -3
  98. package/lib/server/trace/recorder/tracing.js +127 -17
  99. package/lib/server/trace/test/inMemorySnapshotter.js +4 -4
  100. package/lib/server/trace/viewer/traceViewer.js +4 -6
  101. package/lib/server/webkit/webkit.js +1 -1
  102. package/lib/server/webkit/wkBrowser.js +8 -7
  103. package/lib/server/webkit/wkExecutionContext.js +0 -16
  104. package/lib/server/webkit/wkPage.js +11 -4
  105. package/lib/utils/comparators.js +12 -30
  106. package/lib/utils/crypto.js +1 -4
  107. package/lib/utils/happy-eyeballs.js +13 -0
  108. package/lib/utils/hostPlatform.js +8 -2
  109. package/lib/utils/httpServer.js +1 -0
  110. package/lib/utils/isomorphic/ariaSnapshot.js +267 -0
  111. package/lib/utils/isomorphic/locatorGenerators.js +30 -21
  112. package/lib/utils/isomorphic/locatorParser.js +2 -2
  113. package/lib/utils/isomorphic/recorderUtils.js +227 -0
  114. package/lib/utils/isomorphic/stringUtils.js +30 -0
  115. package/lib/utils/isomorphic/urlMatch.js +5 -1
  116. package/lib/utils/network.js +1 -1
  117. package/lib/utils/sequence.js +64 -0
  118. package/lib/utils/stackTrace.js +16 -3
  119. package/lib/utils/zones.js +32 -23
  120. package/lib/utilsBundle.js +4 -5
  121. package/lib/utilsBundleImpl/index.js +190 -33
  122. package/lib/vite/htmlReport/index.html +19 -16
  123. package/lib/vite/recorder/assets/codeMirrorModule-AFvV6hAs.js +24 -0
  124. package/lib/vite/recorder/assets/index-_cTWgVuJ.js +184 -0
  125. package/lib/vite/recorder/assets/{index-B-MT5gKo.css → index-iA1aAGZg.css} +1 -1
  126. package/lib/vite/recorder/index.html +2 -2
  127. package/lib/vite/traceViewer/assets/codeMirrorModule-KatbITLF.js +24 -0
  128. package/lib/vite/traceViewer/assets/inspectorTab-DdpLd2bb.js +68 -0
  129. package/lib/vite/traceViewer/assets/workbench-CdYbzWFD.js +9 -0
  130. package/lib/vite/traceViewer/embedded.6m3UZh7r.js +2 -0
  131. package/lib/vite/traceViewer/embedded.html +5 -3
  132. package/lib/vite/traceViewer/index.WUV-8boJ.js +2 -0
  133. package/lib/vite/traceViewer/index.html +24 -5
  134. package/lib/vite/traceViewer/inspectorTab.DEOUW62d.css +1 -0
  135. package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  136. package/lib/vite/traceViewer/recorder.OT2tVHgn.js +2 -0
  137. package/lib/vite/traceViewer/recorder.html +17 -0
  138. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  139. package/lib/vite/traceViewer/uiMode.BZBTyvGn.js +5 -0
  140. package/lib/vite/traceViewer/uiMode.html +6 -4
  141. package/lib/vite/traceViewer/{uiMode.D3cNFP6u.css → uiMode.voC1ZiOQ.css} +1 -1
  142. package/lib/vite/traceViewer/workbench.C-zR9ysA.css +1 -0
  143. package/package.json +1 -1
  144. package/types/protocol.d.ts +135 -16
  145. package/types/types.d.ts +2149 -965
  146. package/lib/generated/recorderSource.js +0 -7
  147. package/lib/third_party/diff_match_patch.js +0 -2222
  148. package/lib/vite/recorder/assets/codeMirrorModule-aW6Vz3gf.js +0 -24
  149. package/lib/vite/recorder/assets/index-DCpXOVIh.js +0 -47
  150. package/lib/vite/traceViewer/assets/codeMirrorModule-eFKCUIu2.js +0 -24
  151. package/lib/vite/traceViewer/assets/workbench-D0cirtfA.js +0 -72
  152. package/lib/vite/traceViewer/embedded.BkuvsLJp.js +0 -2
  153. package/lib/vite/traceViewer/index.C968kAiC.js +0 -2
  154. package/lib/vite/traceViewer/uiMode.BkFnr4V0.js +0 -10
  155. package/lib/vite/traceViewer/workbench.DjbIuxix.css +0 -1
  156. /package/lib/server/recorder/{recorderActions.js → recorderFrontend.js} +0 -0
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BidiChromium = void 0;
7
+ var _os = _interopRequireDefault(require("os"));
8
+ var _utils = require("../../utils");
9
+ var _browserType = require("../browserType");
10
+ var _chromiumSwitches = require("../chromium/chromiumSwitches");
11
+ var _bidiBrowser = require("./bidiBrowser");
12
+ var _bidiConnection = require("./bidiConnection");
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ /**
15
+ * Copyright (c) Microsoft Corporation.
16
+ *
17
+ * Licensed under the Apache License, Version 2.0 (the 'License');
18
+ * you may not use this file except in compliance with the License.
19
+ * You may obtain a copy of the License at
20
+ *
21
+ * http://www.apache.org/licenses/LICENSE-2.0
22
+ *
23
+ * Unless required by applicable law or agreed to in writing, software
24
+ * distributed under the License is distributed on an 'AS IS' BASIS,
25
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
26
+ * See the License for the specific language governing permissions and
27
+ * limitations under the License.
28
+ */
29
+
30
+ class BidiChromium extends _browserType.BrowserType {
31
+ constructor(parent) {
32
+ super(parent, 'bidi');
33
+ this._useBidi = true;
34
+ }
35
+ async connectToTransport(transport, options) {
36
+ // Chrome doesn't support Bidi, we create Bidi over CDP which is used by Chrome driver.
37
+ // bidiOverCdp depends on chromium-bidi which we only have in devDependencies, so
38
+ // we load bidiOverCdp dynamically.
39
+ const bidiTransport = await require('./bidiOverCdp').connectBidiOverCdp(transport);
40
+ transport[kBidiOverCdpWrapper] = bidiTransport;
41
+ return _bidiBrowser.BidiBrowser.connect(this.attribution.playwright, bidiTransport, options);
42
+ }
43
+ doRewriteStartupLog(error) {
44
+ if (!error.logs) return error;
45
+ if (error.logs.includes('Missing X server')) error.logs = '\n' + (0, _utils.wrapInASCIIBox)(_browserType.kNoXServerRunningError, 1);
46
+ // These error messages are taken from Chromium source code as of July, 2020:
47
+ // https://github.com/chromium/chromium/blob/70565f67e79f79e17663ad1337dc6e63ee207ce9/content/browser/zygote_host/zygote_host_impl_linux.cc
48
+ if (!error.logs.includes('crbug.com/357670') && !error.logs.includes('No usable sandbox!') && !error.logs.includes('crbug.com/638180')) return error;
49
+ error.logs = [`Chromium sandboxing failed!`, `================================`, `To avoid the sandboxing issue, do either of the following:`, ` - (preferred): Configure your environment to support sandboxing`, ` - (alternative): Launch Chromium without sandbox using 'chromiumSandbox: false' option`, `================================`, ``].join('\n');
50
+ return error;
51
+ }
52
+ amendEnvironment(env, userDataDir, executable, browserArguments) {
53
+ return env;
54
+ }
55
+ attemptToGracefullyCloseBrowser(transport) {
56
+ const bidiTransport = transport[kBidiOverCdpWrapper];
57
+ if (bidiTransport) transport = bidiTransport;
58
+ transport.send({
59
+ method: 'browser.close',
60
+ params: {},
61
+ id: _bidiConnection.kBrowserCloseMessageId
62
+ });
63
+ }
64
+ defaultArgs(options, isPersistent, userDataDir) {
65
+ const chromeArguments = this._innerDefaultArgs(options);
66
+ chromeArguments.push(`--user-data-dir=${userDataDir}`);
67
+ chromeArguments.push('--remote-debugging-port=0');
68
+ if (isPersistent) chromeArguments.push('about:blank');else chromeArguments.push('--no-startup-window');
69
+ return chromeArguments;
70
+ }
71
+ readyState(options) {
72
+ (0, _utils.assert)(options.useWebSocket);
73
+ return new ChromiumReadyState();
74
+ }
75
+ _innerDefaultArgs(options) {
76
+ const {
77
+ args = []
78
+ } = options;
79
+ const userDataDirArg = args.find(arg => arg.startsWith('--user-data-dir'));
80
+ if (userDataDirArg) throw this._createUserDataDirArgMisuseError('--user-data-dir');
81
+ if (args.find(arg => arg.startsWith('--remote-debugging-pipe'))) throw new Error('Playwright manages remote debugging connection itself.');
82
+ if (args.find(arg => !arg.startsWith('-'))) throw new Error('Arguments can not specify page to be opened');
83
+ const chromeArguments = [..._chromiumSwitches.chromiumSwitches];
84
+ if (_os.default.platform() === 'darwin') {
85
+ // See https://github.com/microsoft/playwright/issues/7362
86
+ chromeArguments.push('--enable-use-zoom-for-dsf=false');
87
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=1407025.
88
+ if (options.headless) chromeArguments.push('--use-angle');
89
+ }
90
+ if (options.devtools) chromeArguments.push('--auto-open-devtools-for-tabs');
91
+ if (options.headless) {
92
+ chromeArguments.push('--headless');
93
+ chromeArguments.push('--hide-scrollbars', '--mute-audio', '--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4');
94
+ }
95
+ if (options.chromiumSandbox !== true) chromeArguments.push('--no-sandbox');
96
+ const proxy = options.proxyOverride || options.proxy;
97
+ if (proxy) {
98
+ const proxyURL = new URL(proxy.server);
99
+ const isSocks = proxyURL.protocol === 'socks5:';
100
+ // https://www.chromium.org/developers/design-documents/network-settings
101
+ if (isSocks && !this.attribution.playwright.options.socksProxyPort) {
102
+ // https://www.chromium.org/developers/design-documents/network-stack/socks-proxy
103
+ chromeArguments.push(`--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE ${proxyURL.hostname}"`);
104
+ }
105
+ chromeArguments.push(`--proxy-server=${proxy.server}`);
106
+ const proxyBypassRules = [];
107
+ // https://source.chromium.org/chromium/chromium/src/+/master:net/docs/proxy.md;l=548;drc=71698e610121078e0d1a811054dcf9fd89b49578
108
+ if (this.attribution.playwright.options.socksProxyPort) proxyBypassRules.push('<-loopback>');
109
+ if (proxy.bypass) proxyBypassRules.push(...proxy.bypass.split(',').map(t => t.trim()).map(t => t.startsWith('.') ? '*' + t : t));
110
+ if (!process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes('<-loopback>')) proxyBypassRules.push('<-loopback>');
111
+ if (proxyBypassRules.length > 0) chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(';')}`);
112
+ }
113
+ chromeArguments.push(...args);
114
+ return chromeArguments;
115
+ }
116
+ }
117
+ exports.BidiChromium = BidiChromium;
118
+ class ChromiumReadyState extends _browserType.BrowserReadyState {
119
+ onBrowserOutput(message) {
120
+ const match = message.match(/DevTools listening on (.*)/);
121
+ if (match) this._wsEndpoint.resolve(match[1]);
122
+ }
123
+ }
124
+ const kBidiOverCdpWrapper = Symbol('kBidiConnectionWrapper');
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.kBrowserCloseMessageId = exports.BidiSession = exports.BidiConnection = void 0;
7
7
  var _events = require("events");
8
- var _utils = require("../../utils");
9
8
  var _debugLogger = require("../../utils/debugLogger");
10
9
  var _helper = require("../helper");
11
10
  var _protocolError = require("../protocolError");
@@ -66,7 +65,7 @@ class BidiConnection {
66
65
  var _object$params$source;
67
66
  // Route page events to the right session.
68
67
  let context;
69
- if ('context' in object.params) context = object.params.context;else if (object.method === 'log.entryAdded') context = (_object$params$source = object.params.source) === null || _object$params$source === void 0 ? void 0 : _object$params$source.context;
68
+ if ('context' in object.params) context = object.params.context;else if (object.method === 'log.entryAdded' || object.method === 'script.message') context = (_object$params$source = object.params.source) === null || _object$params$source === void 0 ? void 0 : _object$params$source.context;
70
69
  if (context) {
71
70
  const session = this._browsingContextToSession.get(context);
72
71
  if (session) {
@@ -197,7 +196,6 @@ class BidiSession extends _events.EventEmitter {
197
196
  }
198
197
  } else if (object.id) {
199
198
  // Response might come after session has been disposed and rejected all callbacks.
200
- (0, _utils.assert)(this.isDisposed());
201
199
  } else {
202
200
  Promise.resolve().then(() => this.emit(object.method, object.params));
203
201
  }
@@ -79,9 +79,6 @@ class BidiExecutionContext {
79
79
  if (response.type === 'exception') throw new js.JavaScriptErrorInEvaluate(response.exceptionDetails.text + '\nFull val: ' + JSON.stringify(response.exceptionDetails));
80
80
  throw new js.JavaScriptErrorInEvaluate('Unexpected response type: ' + JSON.stringify(response));
81
81
  }
82
- rawCallFunctionNoReply(func, ...args) {
83
- throw new Error('Method not implemented.');
84
- }
85
82
  async evaluateWithArguments(functionDeclaration, returnByValue, utilityScript, values, objectIds) {
86
83
  const response = await this._session.send('script.callFunction', {
87
84
  functionDeclaration,
@@ -124,9 +121,6 @@ class BidiExecutionContext {
124
121
  handles: [objectId]
125
122
  });
126
123
  }
127
- objectCount(objectId) {
128
- throw new Error('Method not implemented.');
129
- }
130
124
  async rawCallFunction(functionDeclaration, arg) {
131
125
  const response = await this._session.send('script.callFunction', {
132
126
  functionDeclaration,
@@ -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
+ }