patchright-core 1.55.3 → 1.56.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 (96) hide show
  1. package/bin/install_webkit_wsl.ps1 +35 -0
  2. package/browsers.json +13 -13
  3. package/lib/browserServerImpl.js +3 -6
  4. package/lib/client/browser.js +0 -10
  5. package/lib/client/browserContext.js +2 -8
  6. package/lib/client/channelOwner.js +0 -7
  7. package/lib/client/consoleMessage.js +2 -3
  8. package/lib/client/electron.js +1 -1
  9. package/lib/client/events.js +1 -0
  10. package/lib/client/network.js +3 -0
  11. package/lib/client/page.js +13 -1
  12. package/lib/generated/bindingsControllerSource.js +1 -1
  13. package/lib/generated/injectedScriptSource.js +1 -1
  14. package/lib/generated/pollingRecorderSource.js +1 -1
  15. package/lib/generated/utilityScriptSource.js +1 -1
  16. package/lib/protocol/validator.js +26 -15
  17. package/lib/remote/playwrightServer.js +12 -14
  18. package/lib/server/bidi/bidiBrowser.js +54 -10
  19. package/lib/server/bidi/bidiChromium.js +1 -1
  20. package/lib/server/bidi/bidiConnection.js +31 -6
  21. package/lib/server/bidi/bidiExecutionContext.js +4 -4
  22. package/lib/server/bidi/bidiFirefox.js +16 -1
  23. package/lib/server/bidi/bidiNetworkManager.js +82 -16
  24. package/lib/server/bidi/bidiPage.js +84 -18
  25. package/lib/server/browserType.js +3 -3
  26. package/lib/server/chromium/chromium.js +1 -1
  27. package/lib/server/chromium/chromiumSwitches.js +3 -1
  28. package/lib/server/chromium/crBrowser.js +2 -33
  29. package/lib/server/chromium/crPage.js +22 -31
  30. package/lib/server/codegen/csharp.js +19 -26
  31. package/lib/server/codegen/java.js +4 -0
  32. package/lib/server/codegen/javascript.js +3 -1
  33. package/lib/server/codegen/python.js +2 -0
  34. package/lib/server/debugController.js +8 -36
  35. package/lib/server/deviceDescriptorsSource.json +62 -62
  36. package/lib/server/dispatchers/androidDispatcher.js +17 -0
  37. package/lib/server/dispatchers/browserContextDispatcher.js +1 -15
  38. package/lib/server/dispatchers/networkDispatchers.js +6 -3
  39. package/lib/server/dispatchers/pageDispatcher.js +24 -0
  40. package/lib/server/dom.js +8 -3
  41. package/lib/server/firefox/ffPage.js +1 -2
  42. package/lib/server/firefox/firefox.js +1 -1
  43. package/lib/server/frames.js +8 -3
  44. package/lib/server/har/harTracer.js +7 -8
  45. package/lib/server/network.js +12 -0
  46. package/lib/server/page.js +39 -17
  47. package/lib/server/recorder/chat.js +2 -2
  48. package/lib/server/recorder/recorderRunner.js +4 -0
  49. package/lib/server/registry/browserFetcher.js +3 -3
  50. package/lib/server/registry/index.js +27 -0
  51. package/lib/server/trace/recorder/snapshotter.js +13 -2
  52. package/lib/server/trace/recorder/snapshotterInjected.js +3 -1
  53. package/lib/server/utils/comparators.js +2 -2
  54. package/lib/server/utils/env.js +7 -2
  55. package/lib/server/utils/wsServer.js +2 -7
  56. package/lib/server/webkit/webkit.js +24 -8
  57. package/lib/server/webkit/wkBrowser.js +7 -3
  58. package/lib/server/webkit/wkPage.js +7 -8
  59. package/lib/server/webkit/wsl/webkit-wsl-transport-client.js +74 -0
  60. package/lib/server/webkit/wsl/webkit-wsl-transport-server.js +113 -0
  61. package/lib/utils/isomorphic/ariaSnapshot.js +12 -10
  62. package/lib/utils/isomorphic/protocolMetainfo.js +3 -0
  63. package/lib/utils/isomorphic/urlMatch.js +3 -8
  64. package/lib/utilsBundle.js +3 -0
  65. package/lib/utilsBundleImpl/index.js +80 -80
  66. package/lib/vite/htmlReport/index.html +37 -28
  67. package/lib/vite/recorder/assets/codeMirrorModule-RJCXzfmE.js +24 -0
  68. package/lib/vite/recorder/assets/index-Ri0uHF7I.css +1 -0
  69. package/lib/vite/recorder/assets/index-Y-X2TGJv.js +193 -0
  70. package/lib/vite/recorder/index.html +2 -2
  71. package/lib/vite/traceViewer/assets/codeMirrorModule-rbQPefq7.js +24 -0
  72. package/lib/vite/traceViewer/assets/defaultSettingsView-CLbol9XR.js +265 -0
  73. package/lib/vite/traceViewer/assets/xtermModule-CsJ4vdCR.js +9 -0
  74. package/lib/vite/traceViewer/defaultSettingsView.TQ8_7ybu.css +1 -0
  75. package/lib/vite/traceViewer/index.I8N9v4jT.css +1 -0
  76. package/lib/vite/traceViewer/index.html +4 -4
  77. package/lib/vite/traceViewer/index.zIVi6mN9.js +2 -0
  78. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  79. package/lib/vite/traceViewer/uiMode.B_CpmIpF.js +5 -0
  80. package/lib/vite/traceViewer/uiMode.Btcz36p_.css +1 -0
  81. package/lib/vite/traceViewer/uiMode.html +4 -4
  82. package/lib/vite/traceViewer/{xtermModule.Beg8tuEN.css → xtermModule.DYP7pi_n.css} +1 -1
  83. package/package.json +2 -4
  84. package/types/protocol.d.ts +7084 -6870
  85. package/types/types.d.ts +57 -52
  86. package/lib/vite/recorder/assets/codeMirrorModule-DzQ0k89p.js +0 -24
  87. package/lib/vite/recorder/assets/index-CI4HQ-Zb.css +0 -1
  88. package/lib/vite/recorder/assets/index-D7C7daHH.js +0 -184
  89. package/lib/vite/traceViewer/assets/codeMirrorModule-DsmF_DpA.js +0 -24
  90. package/lib/vite/traceViewer/assets/defaultSettingsView-Cd59AFK5.js +0 -256
  91. package/lib/vite/traceViewer/assets/xtermModule-BoAIEibi.js +0 -9
  92. package/lib/vite/traceViewer/defaultSettingsView.DVJHpiGt.css +0 -1
  93. package/lib/vite/traceViewer/index.BFsek2M6.css +0 -1
  94. package/lib/vite/traceViewer/index.BivEwfRr.js +0 -2
  95. package/lib/vite/traceViewer/uiMode.BDvz7Y9W.js +0 -5
  96. package/lib/vite/traceViewer/uiMode.BatfzHMG.css +0 -1
@@ -0,0 +1,35 @@
1
+ $ErrorActionPreference = 'Stop'
2
+
3
+ # WebKit WSL Installation Script
4
+ # See webkit-wsl-transport-server.ts for the complete architecture diagram.
5
+ # This script sets up a WSL distribution that will be used to run WebKit.
6
+
7
+ $Distribution = "playwright"
8
+ $Username = "pwuser"
9
+
10
+ $distributions = (wsl --list --quiet) -split "\r?\n"
11
+ if ($distributions -contains $Distribution) {
12
+ Write-Host "WSL distribution '$Distribution' already exists. Skipping installation."
13
+ } else {
14
+ Write-Host "Installing new WSL distribution '$Distribution'..."
15
+ $VhdSize = "10GB"
16
+ wsl --install -d Ubuntu-24.04 --name $Distribution --no-launch --vhd-size $VhdSize
17
+ wsl -d $Distribution -u root adduser --gecos GECOS --disabled-password $Username
18
+ }
19
+
20
+ $pwshDirname = (Resolve-Path -Path $PSScriptRoot).Path;
21
+ $playwrightCoreRoot = Resolve-Path (Join-Path $pwshDirname "..")
22
+
23
+ $initScript = @"
24
+ if [ ! -f "/home/$Username/node/bin/node" ]; then
25
+ mkdir -p /home/$Username/node
26
+ curl -fsSL https://nodejs.org/dist/v22.17.0/node-v22.17.0-linux-x64.tar.xz -o /home/$Username/node/node-v22.17.0-linux-x64.tar.xz
27
+ tar -xJf /home/$Username/node/node-v22.17.0-linux-x64.tar.xz -C /home/$Username/node --strip-components=1
28
+ fi
29
+ /home/$Username/node/bin/node cli.js install-deps webkit
30
+ cp lib/server/webkit/wsl/webkit-wsl-transport-client.js /home/$Username/
31
+ sudo -u $Username PLAYWRIGHT_SKIP_BROWSER_GC=1 /home/$Username/node/bin/node cli.js install webkit
32
+ "@ -replace "\r\n", "`n"
33
+
34
+ wsl -d $Distribution --cd $playwrightCoreRoot -u root -- bash -c "$initScript"
35
+ Write-Host "Done!"
package/browsers.json CHANGED
@@ -3,43 +3,43 @@
3
3
  "browsers": [
4
4
  {
5
5
  "name": "chromium",
6
- "revision": "1193",
6
+ "revision": "1194",
7
7
  "installByDefault": true,
8
- "browserVersion": "140.0.7339.186"
8
+ "browserVersion": "141.0.7390.37"
9
9
  },
10
10
  {
11
11
  "name": "chromium-headless-shell",
12
- "revision": "1193",
12
+ "revision": "1194",
13
13
  "installByDefault": true,
14
- "browserVersion": "140.0.7339.186"
14
+ "browserVersion": "141.0.7390.37"
15
15
  },
16
16
  {
17
17
  "name": "chromium-tip-of-tree",
18
- "revision": "1357",
18
+ "revision": "1371",
19
19
  "installByDefault": false,
20
- "browserVersion": "141.0.7342.0"
20
+ "browserVersion": "142.0.7430.0"
21
21
  },
22
22
  {
23
23
  "name": "chromium-tip-of-tree-headless-shell",
24
- "revision": "1357",
24
+ "revision": "1371",
25
25
  "installByDefault": false,
26
- "browserVersion": "141.0.7342.0"
26
+ "browserVersion": "142.0.7430.0"
27
27
  },
28
28
  {
29
29
  "name": "firefox",
30
- "revision": "1490",
30
+ "revision": "1495",
31
31
  "installByDefault": true,
32
- "browserVersion": "141.0"
32
+ "browserVersion": "142.0.1"
33
33
  },
34
34
  {
35
35
  "name": "firefox-beta",
36
- "revision": "1485",
36
+ "revision": "1490",
37
37
  "installByDefault": false,
38
- "browserVersion": "142.0b4"
38
+ "browserVersion": "143.0b10"
39
39
  },
40
40
  {
41
41
  "name": "webkit",
42
- "revision": "2203",
42
+ "revision": "2215",
43
43
  "installByDefault": true,
44
44
  "revisionOverrides": {
45
45
  "debian11-x64": "2105",
@@ -49,8 +49,8 @@ class BrowserServerLauncherImpl {
49
49
  const playwright = (0, import_playwright.createPlaywright)({ sdkLanguage: "javascript", isServer: true });
50
50
  const metadata = { id: "", startTime: 0, endTime: 0, type: "Internal", method: "", params: {}, log: [], internal: true };
51
51
  const validatorContext = {
52
- tChannelImpl: (names, arg, path) => {
53
- throw new validatorPrimitives.ValidationError(`${path}: channels are not expected in launchServer`);
52
+ tChannelImpl: (names, arg, path2) => {
53
+ throw new validatorPrimitives.ValidationError(`${path2}: channels are not expected in launchServer`);
54
54
  },
55
55
  binary: "buffer",
56
56
  isUnderTest: import_debug.isUnderTest
@@ -82,11 +82,8 @@ class BrowserServerLauncherImpl {
82
82
  (0, import_stackTrace.rewriteErrorMessage)(e, `${e.message} Failed to launch browser.${log}`);
83
83
  throw e;
84
84
  }
85
- return this.launchServerOnExistingBrowser(browser, options);
86
- }
87
- async launchServerOnExistingBrowser(browser, options) {
88
85
  const path = options.wsPath ? options.wsPath.startsWith("/") ? options.wsPath : `/${options.wsPath}` : `/${(0, import_crypto.createGuid)()}`;
89
- const server = new import_playwrightServer.PlaywrightServer({ mode: options._sharedBrowser ? "launchServerShared" : "launchServer", path, maxConnections: Infinity, preLaunchedBrowser: browser, debugController: options._debugController });
86
+ const server = new import_playwrightServer.PlaywrightServer({ mode: options._sharedBrowser ? "launchServerShared" : "launchServer", path, maxConnections: Infinity, preLaunchedBrowser: browser });
90
87
  const wsEndpoint = await server.listen(options.port, options.host);
91
88
  const browserServer = new import_utilsBundle.ws.EventEmitter();
92
89
  browserServer.process = () => browser.options.browserProcess.process;
@@ -120,16 +120,6 @@ class Browser extends import_channelOwner.ChannelOwner {
120
120
  async newBrowserCDPSession() {
121
121
  return import_cdpSession.CDPSession.from((await this._channel.newBrowserCDPSession()).session);
122
122
  }
123
- async _launchServer(options = {}) {
124
- const serverLauncher = this._browserType._serverLauncher;
125
- const browserImpl = this._connection.toImpl?.(this);
126
- if (!serverLauncher || !browserImpl)
127
- throw new Error("Launching server is not supported");
128
- return await serverLauncher.launchServerOnExistingBrowser(browserImpl, {
129
- _sharedBrowser: true,
130
- ...options
131
- });
132
- }
133
123
  async startTracing(page, options = {}) {
134
124
  this._path = options.path;
135
125
  await this._channel.startTracing({ ...options, page: page ? page._channel : void 0 });
@@ -67,7 +67,6 @@ class BrowserContext extends import_channelOwner.ChannelOwner {
67
67
  this._browser = null;
68
68
  this._bindings = /* @__PURE__ */ new Map();
69
69
  this._forReuse = false;
70
- this._backgroundPages = /* @__PURE__ */ new Set();
71
70
  this._serviceWorkers = /* @__PURE__ */ new Set();
72
71
  this._harRecorders = /* @__PURE__ */ new Map();
73
72
  this._closingStatus = "none";
@@ -84,11 +83,6 @@ class BrowserContext extends import_channelOwner.ChannelOwner {
84
83
  this._channel.on("page", ({ page }) => this._onPage(import_page.Page.from(page)));
85
84
  this._channel.on("route", ({ route }) => this._onRoute(network.Route.from(route)));
86
85
  this._channel.on("webSocketRoute", ({ webSocketRoute }) => this._onWebSocketRoute(network.WebSocketRoute.from(webSocketRoute)));
87
- this._channel.on("backgroundPage", ({ page }) => {
88
- const backgroundPage = import_page.Page.from(page);
89
- this._backgroundPages.add(backgroundPage);
90
- this.emit(import_events.Events.BrowserContext.BackgroundPage, backgroundPage);
91
- });
92
86
  this._channel.on("serviceWorker", ({ worker }) => {
93
87
  const serviceWorker = import_worker.Worker.from(worker);
94
88
  serviceWorker._context = this;
@@ -96,7 +90,7 @@ class BrowserContext extends import_channelOwner.ChannelOwner {
96
90
  this.emit(import_events.Events.BrowserContext.ServiceWorker, serviceWorker);
97
91
  });
98
92
  this._channel.on("console", (event) => {
99
- const consoleMessage = new import_consoleMessage.ConsoleMessage(this._platform, event);
93
+ const consoleMessage = new import_consoleMessage.ConsoleMessage(this._platform, event, import_page.Page.fromNullable(event.page));
100
94
  this.emit(import_events.Events.BrowserContext.Console, consoleMessage);
101
95
  const page = consoleMessage.page();
102
96
  if (page)
@@ -406,7 +400,7 @@ class BrowserContext extends import_channelOwner.ChannelOwner {
406
400
  return state;
407
401
  }
408
402
  backgroundPages() {
409
- return [...this._backgroundPages];
403
+ return [];
410
404
  }
411
405
  serviceWorkers() {
412
406
  return [...this._serviceWorkers];
@@ -164,14 +164,7 @@ class ChannelOwner extends import_eventEmitter.EventEmitter {
164
164
  else
165
165
  e.stack = "";
166
166
  if (!options?.internal) {
167
- const recoveryHandlers = [];
168
167
  apiZone.error = e;
169
- this._instrumentation.onApiCallRecovery(apiZone, e, recoveryHandlers);
170
- for (const handler of recoveryHandlers) {
171
- const recoverResult = await handler();
172
- if (recoverResult.status === "recovered")
173
- return recoverResult.value;
174
- }
175
168
  logApiCall(this._platform, logger, `<= ${apiZone.apiName} failed`);
176
169
  this._instrumentation.onApiCallEnd(apiZone);
177
170
  }
@@ -22,10 +22,9 @@ __export(consoleMessage_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(consoleMessage_exports);
24
24
  var import_jsHandle = require("./jsHandle");
25
- var import_page = require("./page");
26
25
  class ConsoleMessage {
27
- constructor(platform, event) {
28
- this._page = "page" in event && event.page ? import_page.Page.from(event.page) : null;
26
+ constructor(platform, event, page) {
27
+ this._page = page;
29
28
  this._event = event;
30
29
  if (platform.inspectCustom)
31
30
  this[platform.inspectCustom] = () => this._inspect();
@@ -66,7 +66,7 @@ class ElectronApplication extends import_channelOwner.ChannelOwner {
66
66
  this._channel.on("close", () => {
67
67
  this.emit(import_events.Events.ElectronApplication.Close);
68
68
  });
69
- this._channel.on("console", (event) => this.emit(import_events.Events.ElectronApplication.Console, new import_consoleMessage.ConsoleMessage(this._platform, event)));
69
+ this._channel.on("console", (event) => this.emit(import_events.Events.ElectronApplication.Console, new import_consoleMessage.ConsoleMessage(this._platform, event, null)));
70
70
  this._setEventToSubscriptionMapping(/* @__PURE__ */ new Map([
71
71
  [import_events.Events.ElectronApplication.Console, "console"]
72
72
  ]));
@@ -45,6 +45,7 @@ const Events = {
45
45
  // @see https://nodejs.org/api/events.html#events_error_events
46
46
  WebError: "weberror",
47
47
  BackgroundPage: "backgroundpage",
48
+ // Deprecated in v1.56, never emitted anymore.
48
49
  ServiceWorker: "serviceworker",
49
50
  Request: "request",
50
51
  Response: "response",
@@ -51,6 +51,7 @@ class Request extends import_channelOwner.ChannelOwner {
51
51
  this._redirectedTo = null;
52
52
  this._failureText = null;
53
53
  this._fallbackOverrides = {};
54
+ this._hasResponse = false;
54
55
  this._redirectedFrom = Request.fromNullable(initializer.redirectedFrom);
55
56
  if (this._redirectedFrom)
56
57
  this._redirectedFrom._redirectedTo = this;
@@ -66,6 +67,8 @@ class Request extends import_channelOwner.ChannelOwner {
66
67
  responseStart: -1,
67
68
  responseEnd: -1
68
69
  };
70
+ this._hasResponse = this._initializer.hasResponse;
71
+ this._channel.on("response", () => this._hasResponse = true);
69
72
  }
70
73
  static from(request) {
71
74
  return request._object;
@@ -48,6 +48,7 @@ var import_stringUtils = require("../utils/isomorphic/stringUtils");
48
48
  var import_urlMatch = require("../utils/isomorphic/urlMatch");
49
49
  var import_manualPromise = require("../utils/isomorphic/manualPromise");
50
50
  var import_rtti = require("../utils/isomorphic/rtti");
51
+ var import_consoleMessage = require("./consoleMessage");
51
52
  class Page extends import_channelOwner.ChannelOwner {
52
53
  constructor(parent, type, guid, initializer) {
53
54
  super(parent, type, guid, initializer);
@@ -175,7 +176,6 @@ class Page extends import_channelOwner.ChannelOwner {
175
176
  _onClose() {
176
177
  this._closed = true;
177
178
  this._browserContext._pages.delete(this);
178
- this._browserContext._backgroundPages.delete(this);
179
179
  this._disposeHarRouters();
180
180
  this.emit(import_events.Events.Page.Close, this);
181
181
  }
@@ -538,6 +538,14 @@ class Page extends import_channelOwner.ChannelOwner {
538
538
  async fill(selector, value, options) {
539
539
  return await this._mainFrame.fill(selector, value, options);
540
540
  }
541
+ async consoleMessages() {
542
+ const { messages } = await this._channel.consoleMessages();
543
+ return messages.map((message) => new import_consoleMessage.ConsoleMessage(this._platform, message, this));
544
+ }
545
+ async pageErrors() {
546
+ const { errors } = await this._channel.pageErrors();
547
+ return errors.map((error) => (0, import_errors.parseError)(error));
548
+ }
541
549
  locator(selector, options) {
542
550
  return this.mainFrame().locator(selector, options);
543
551
  }
@@ -631,6 +639,10 @@ class Page extends import_channelOwner.ChannelOwner {
631
639
  async waitForFunction(pageFunction, arg, options) {
632
640
  return await this._mainFrame.waitForFunction(pageFunction, arg, options);
633
641
  }
642
+ async requests() {
643
+ const { requests } = await this._channel.requests();
644
+ return requests.map((request) => import_network.Request.from(request));
645
+ }
634
646
  workers() {
635
647
  return [...this._workers];
636
648
  }
@@ -21,7 +21,7 @@ __export(bindingsControllerSource_exports, {
21
21
  source: () => source
22
22
  });
23
23
  module.exports = __toCommonJS(bindingsControllerSource_exports);
24
- const source = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/bindingsController.ts\nvar bindingsController_exports = {};\n__export(bindingsController_exports, {\n BindingsController: () => BindingsController\n});\nmodule.exports = __toCommonJS(bindingsController_exports);\n\n// packages/playwright-core/src/utils/isomorphic/utilityScriptSerializers.ts\nfunction isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n}\nfunction isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n}\nfunction isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n}\nfunction isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n}\nfunction isTypedArray(obj, constructor) {\n try {\n return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`;\n } catch (error) {\n return false;\n }\n}\nvar typedArrayConstructors = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n // TODO: add Float16Array once it\'s in baseline\n f32: Float32Array,\n f64: Float64Array,\n bi64: BigInt64Array,\n bui64: BigUint64Array\n};\nfunction typedArrayToBase64(array) {\n if ("toBase64" in array)\n return array.toBase64();\n const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join("");\n return btoa(binary);\n}\nfunction serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 });\n}\nfunction serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: <Window>";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: <Document>";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: <Node>";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n}\nfunction innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result = handleSerializer(value);\n if ("fallThrough" in result)\n value = result.fallThrough;\n else\n return result;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = `${value.name}: ${value.message}\n${value.stack}`;\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp(value))\n return { r: { p: value.source, f: value.flags } };\n for (const [k, ctor] of Object.entries(typedArrayConstructors)) {\n if (isTypedArray(value, ctor))\n return { ta: { b: typedArrayToBase64(value), k } };\n }\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n}\n\n// packages/injected/src/bindingsController.ts\nvar BindingsController = class {\n // eslint-disable-next-line no-restricted-globals\n constructor(global, globalBindingName) {\n this._bindings = /* @__PURE__ */ new Map();\n this._global = global;\n this._globalBindingName = globalBindingName;\n }\n addBinding(bindingName, needsHandle) {\n const data = {\n callbacks: /* @__PURE__ */ new Map(),\n lastSeq: 0,\n handles: /* @__PURE__ */ new Map(),\n removed: false\n };\n this._bindings.set(bindingName, data);\n this._global[bindingName] = (...args) => {\n if (data.removed)\n throw new Error(`binding "${bindingName}" has been removed`);\n if (needsHandle && args.slice(1).some((arg) => arg !== void 0))\n throw new Error(`exposeBindingHandle supports a single argument, ${args.length} received`);\n const seq = ++data.lastSeq;\n const promise = new Promise((resolve, reject) => data.callbacks.set(seq, { resolve, reject }));\n let payload;\n if (needsHandle) {\n data.handles.set(seq, args[0]);\n payload = { name: bindingName, seq };\n } else {\n const serializedArgs = [];\n for (let i = 0; i < args.length; i++) {\n serializedArgs[i] = serializeAsCallArgument(args[i], (v) => {\n return { fallThrough: v };\n });\n }\n payload = { name: bindingName, seq, serializedArgs };\n }\n this._global[this._globalBindingName](JSON.stringify(payload));\n return promise;\n };\n }\n removeBinding(bindingName) {\n const data = this._bindings.get(bindingName);\n if (data)\n data.removed = true;\n this._bindings.delete(bindingName);\n delete this._global[bindingName];\n }\n takeBindingHandle(arg) {\n const handles = this._bindings.get(arg.name).handles;\n const handle = handles.get(arg.seq);\n handles.delete(arg.seq);\n return handle;\n }\n deliverBindingResult(arg) {\n const callbacks = this._bindings.get(arg.name).callbacks;\n if ("error" in arg)\n callbacks.get(arg.seq).reject(arg.error);\n else\n callbacks.get(arg.seq).resolve(arg.result);\n callbacks.delete(arg.seq);\n }\n};\n';
24
+ const source = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/bindingsController.ts\nvar bindingsController_exports = {};\n__export(bindingsController_exports, {\n BindingsController: () => BindingsController\n});\nmodule.exports = __toCommonJS(bindingsController_exports);\n\n// packages/playwright-core/src/utils/isomorphic/utilityScriptSerializers.ts\nfunction isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n}\nfunction isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n}\nfunction isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n}\nfunction isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n}\nfunction isTypedArray(obj, constructor) {\n try {\n return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`;\n } catch (error) {\n return false;\n }\n}\nvar typedArrayConstructors = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n // TODO: add Float16Array once it\'s in baseline\n f32: Float32Array,\n f64: Float64Array,\n bi64: BigInt64Array,\n bui64: BigUint64Array\n};\nfunction typedArrayToBase64(array) {\n if ("toBase64" in array)\n return array.toBase64();\n const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join("");\n return btoa(binary);\n}\nfunction serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 });\n}\nfunction serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: <Window>";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: <Document>";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: <Node>";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n}\nfunction innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result = handleSerializer(value);\n if ("fallThrough" in result)\n value = result.fallThrough;\n else\n return result;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = `${value.name}: ${value.message}\n${value.stack}`;\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp(value))\n return { r: { p: value.source, f: value.flags } };\n for (const [k, ctor] of Object.entries(typedArrayConstructors)) {\n if (isTypedArray(value, ctor))\n return { ta: { b: typedArrayToBase64(value), k } };\n }\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n}\n\n// packages/injected/src/bindingsController.ts\nvar BindingsController = class {\n constructor(global, globalBindingName) {\n this._bindings = /* @__PURE__ */ new Map();\n this._global = global;\n this._globalBindingName = globalBindingName;\n }\n addBinding(bindingName, needsHandle) {\n const data = {\n callbacks: /* @__PURE__ */ new Map(),\n lastSeq: 0,\n handles: /* @__PURE__ */ new Map(),\n removed: false\n };\n this._bindings.set(bindingName, data);\n this._global[bindingName] = (...args) => {\n if (data.removed)\n throw new Error(`binding "${bindingName}" has been removed`);\n if (needsHandle && args.slice(1).some((arg) => arg !== void 0))\n throw new Error(`exposeBindingHandle supports a single argument, ${args.length} received`);\n const seq = ++data.lastSeq;\n const promise = new Promise((resolve, reject) => data.callbacks.set(seq, { resolve, reject }));\n let payload;\n if (needsHandle) {\n data.handles.set(seq, args[0]);\n payload = { name: bindingName, seq };\n } else {\n const serializedArgs = [];\n for (let i = 0; i < args.length; i++) {\n serializedArgs[i] = serializeAsCallArgument(args[i], (v) => {\n return { fallThrough: v };\n });\n }\n payload = { name: bindingName, seq, serializedArgs };\n }\n this._global[this._globalBindingName](JSON.stringify(payload));\n return promise;\n };\n }\n removeBinding(bindingName) {\n const data = this._bindings.get(bindingName);\n if (data)\n data.removed = true;\n this._bindings.delete(bindingName);\n delete this._global[bindingName];\n }\n takeBindingHandle(arg) {\n const handles = this._bindings.get(arg.name).handles;\n const handle = handles.get(arg.seq);\n handles.delete(arg.seq);\n return handle;\n }\n deliverBindingResult(arg) {\n const callbacks = this._bindings.get(arg.name).callbacks;\n if ("error" in arg)\n callbacks.get(arg.seq).reject(arg.error);\n else\n callbacks.get(arg.seq).resolve(arg.result);\n callbacks.delete(arg.seq);\n }\n};\n';
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  source