patchright-core 1.56.1 → 1.58.2

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 (180) hide show
  1. package/ThirdPartyNotices.txt +3134 -560
  2. package/bin/install_webkit_wsl.ps1 +1 -3
  3. package/browsers.json +21 -22
  4. package/lib/cli/program.js +16 -60
  5. package/lib/client/api.js +3 -3
  6. package/lib/client/browser.js +3 -5
  7. package/lib/client/browserContext.js +62 -8
  8. package/lib/client/browserType.js +4 -3
  9. package/lib/client/connection.js +4 -0
  10. package/lib/client/consoleMessage.js +5 -1
  11. package/lib/client/electron.js +1 -1
  12. package/lib/client/elementHandle.js +3 -0
  13. package/lib/client/events.js +5 -1
  14. package/lib/client/fetch.js +3 -4
  15. package/lib/client/frame.js +10 -1
  16. package/lib/client/locator.js +12 -1
  17. package/lib/client/network.js +5 -1
  18. package/lib/client/page.js +31 -6
  19. package/lib/client/pageAgent.js +64 -0
  20. package/lib/client/platform.js +3 -0
  21. package/lib/client/playwright.js +1 -5
  22. package/lib/client/tracing.js +7 -5
  23. package/lib/client/worker.js +22 -0
  24. package/lib/generated/clockSource.js +1 -1
  25. package/lib/generated/injectedScriptSource.js +1 -1
  26. package/lib/generated/pollingRecorderSource.js +1 -1
  27. package/lib/inProcessFactory.js +0 -2
  28. package/lib/mcpBundle.js +84 -0
  29. package/lib/mcpBundleImpl/index.js +147 -0
  30. package/lib/protocol/serializers.js +5 -0
  31. package/lib/protocol/validator.js +112 -50
  32. package/lib/remote/playwrightServer.js +1 -2
  33. package/lib/server/agent/actionRunner.js +335 -0
  34. package/lib/server/agent/actions.js +128 -0
  35. package/lib/server/agent/codegen.js +111 -0
  36. package/lib/server/agent/context.js +150 -0
  37. package/lib/server/agent/expectTools.js +156 -0
  38. package/lib/server/agent/pageAgent.js +204 -0
  39. package/lib/server/agent/performTools.js +262 -0
  40. package/lib/server/agent/tool.js +109 -0
  41. package/lib/server/android/android.js +1 -1
  42. package/lib/server/artifact.js +1 -1
  43. package/lib/server/bidi/bidiBrowser.js +81 -22
  44. package/lib/server/bidi/bidiChromium.js +9 -13
  45. package/lib/server/bidi/bidiConnection.js +1 -0
  46. package/lib/server/bidi/bidiDeserializer.js +116 -0
  47. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  48. package/lib/server/bidi/bidiFirefox.js +7 -9
  49. package/lib/server/bidi/bidiNetworkManager.js +1 -1
  50. package/lib/server/bidi/bidiPage.js +61 -30
  51. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  52. package/lib/server/browserContext.js +43 -36
  53. package/lib/server/browserType.js +12 -4
  54. package/lib/server/chromium/chromium.js +26 -21
  55. package/lib/server/chromium/chromiumSwitches.js +12 -3
  56. package/lib/server/chromium/crBrowser.js +30 -12
  57. package/lib/server/chromium/crConnection.js +0 -5
  58. package/lib/server/chromium/crCoverage.js +13 -1
  59. package/lib/server/chromium/crDevTools.js +0 -2
  60. package/lib/server/chromium/crNetworkManager.js +107 -18
  61. package/lib/server/chromium/crPage.js +68 -124
  62. package/lib/server/chromium/crServiceWorker.js +14 -1
  63. package/lib/server/codegen/javascript.js +6 -29
  64. package/lib/server/console.js +5 -1
  65. package/lib/server/deviceDescriptorsSource.json +56 -56
  66. package/lib/server/dispatchers/browserContextDispatcher.js +26 -8
  67. package/lib/server/dispatchers/dispatcher.js +6 -13
  68. package/lib/server/dispatchers/frameDispatcher.js +1 -1
  69. package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
  70. package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
  71. package/lib/server/dispatchers/pageDispatcher.js +14 -22
  72. package/lib/server/dispatchers/playwrightDispatcher.js +0 -4
  73. package/lib/server/dom.js +12 -3
  74. package/lib/server/electron/electron.js +6 -3
  75. package/lib/server/firefox/ffBrowser.js +10 -20
  76. package/lib/server/firefox/ffConnection.js +0 -5
  77. package/lib/server/firefox/ffNetworkManager.js +2 -2
  78. package/lib/server/firefox/ffPage.js +18 -24
  79. package/lib/server/firefox/firefox.js +18 -9
  80. package/lib/server/frameSelectors.js +18 -8
  81. package/lib/server/frames.js +257 -87
  82. package/lib/server/input.js +7 -3
  83. package/lib/server/instrumentation.js +3 -0
  84. package/lib/server/javascript.js +8 -4
  85. package/lib/server/launchApp.js +2 -1
  86. package/lib/server/localUtils.js +4 -8
  87. package/lib/server/network.js +50 -12
  88. package/lib/server/page.js +112 -126
  89. package/lib/server/playwright.js +2 -4
  90. package/lib/server/progress.js +26 -6
  91. package/lib/server/recorder/recorderApp.js +80 -101
  92. package/lib/server/recorder.js +3 -2
  93. package/lib/server/registry/browserFetcher.js +6 -4
  94. package/lib/server/registry/index.js +278 -189
  95. package/lib/server/registry/oopDownloadBrowserMain.js +9 -2
  96. package/lib/server/screencast.js +190 -0
  97. package/lib/server/screenshotter.js +6 -0
  98. package/lib/server/socksClientCertificatesInterceptor.js +1 -1
  99. package/lib/server/trace/recorder/snapshotter.js +17 -8
  100. package/lib/server/trace/recorder/snapshotterInjected.js +30 -72
  101. package/lib/server/trace/recorder/tracing.js +31 -21
  102. package/lib/server/trace/viewer/traceParser.js +72 -0
  103. package/lib/server/trace/viewer/traceViewer.js +45 -40
  104. package/lib/server/utils/comparators.js +3 -25
  105. package/lib/server/utils/expectUtils.js +87 -2
  106. package/lib/server/utils/hostPlatform.js +30 -3
  107. package/lib/server/utils/httpServer.js +5 -20
  108. package/lib/server/utils/imageUtils.js +141 -0
  109. package/lib/server/utils/network.js +55 -40
  110. package/lib/server/utils/nodePlatform.js +6 -0
  111. package/lib/server/{chromium/videoRecorder.js → videoRecorder.js} +35 -24
  112. package/lib/server/webkit/webkit.js +5 -16
  113. package/lib/server/webkit/wkBrowser.js +2 -6
  114. package/lib/server/webkit/wkConnection.js +1 -6
  115. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  116. package/lib/server/webkit/wkPage.js +76 -51
  117. package/lib/server/webkit/wkWorkers.js +2 -1
  118. package/lib/utils/isomorphic/ariaSnapshot.js +63 -0
  119. package/lib/utils/isomorphic/locatorGenerators.js +24 -8
  120. package/lib/utils/isomorphic/lruCache.js +51 -0
  121. package/lib/utils/isomorphic/mimeType.js +1 -1
  122. package/lib/utils/isomorphic/protocolFormatter.js +3 -0
  123. package/lib/utils/isomorphic/protocolMetainfo.js +11 -2
  124. package/lib/utils/isomorphic/stringUtils.js +49 -0
  125. package/lib/utils/isomorphic/trace/entries.js +16 -0
  126. package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
  127. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  128. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  129. package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
  130. package/lib/utils/isomorphic/trace/traceModel.js +365 -0
  131. package/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
  132. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  133. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  134. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  135. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  136. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  137. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  138. package/lib/utils/isomorphic/urlMatch.js +19 -5
  139. package/lib/utils/isomorphic/yaml.js +84 -0
  140. package/lib/utils.js +4 -0
  141. package/lib/utilsBundle.js +1 -1
  142. package/lib/utilsBundleImpl/index.js +124 -124
  143. package/lib/vite/htmlReport/index.html +21 -21
  144. package/lib/vite/recorder/assets/codeMirrorModule-CFUTFUO7.js +32 -0
  145. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  146. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  147. package/lib/vite/recorder/assets/index-CVkBxsGf.js +193 -0
  148. package/lib/vite/recorder/index.html +2 -2
  149. package/lib/vite/traceViewer/assets/codeMirrorModule-BVA4h_ZY.js +32 -0
  150. package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +266 -0
  151. package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
  152. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
  153. package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
  154. package/lib/vite/traceViewer/index.BtyWtaE-.js +2 -0
  155. package/lib/vite/traceViewer/index.html +6 -6
  156. package/lib/vite/traceViewer/manifest.webmanifest +16 -0
  157. package/lib/vite/traceViewer/snapshot.html +3 -3
  158. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  159. package/lib/vite/traceViewer/uiMode.fyrXARf2.js +5 -0
  160. package/lib/vite/traceViewer/uiMode.html +3 -3
  161. package/package.json +2 -1
  162. package/types/protocol.d.ts +939 -245
  163. package/types/types.d.ts +143 -153
  164. package/lib/client/accessibility.js +0 -49
  165. package/lib/server/accessibility.js +0 -69
  166. package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
  167. package/lib/server/chromium/crAccessibility.js +0 -263
  168. package/lib/server/firefox/ffAccessibility.js +0 -238
  169. package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
  170. package/lib/server/webkit/wkAccessibility.js +0 -237
  171. package/lib/server/webkit/wsl/webkit-wsl-transport-client.js +0 -74
  172. package/lib/server/webkit/wsl/webkit-wsl-transport-server.js +0 -113
  173. package/lib/vite/recorder/assets/codeMirrorModule-RJCXzfmE.js +0 -24
  174. package/lib/vite/recorder/assets/index-Y-X2TGJv.js +0 -193
  175. package/lib/vite/traceViewer/assets/codeMirrorModule-rbQPefq7.js +0 -24
  176. package/lib/vite/traceViewer/assets/defaultSettingsView-CLbol9XR.js +0 -265
  177. package/lib/vite/traceViewer/defaultSettingsView.TQ8_7ybu.css +0 -1
  178. package/lib/vite/traceViewer/index.I8N9v4jT.css +0 -1
  179. package/lib/vite/traceViewer/index.zIVi6mN9.js +0 -2
  180. package/lib/vite/traceViewer/uiMode.B_CpmIpF.js +0 -5
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var bidiDeserializer_exports = {};
20
+ __export(bidiDeserializer_exports, {
21
+ deserializeBidiValue: () => deserializeBidiValue
22
+ });
23
+ module.exports = __toCommonJS(bidiDeserializer_exports);
24
+ var import_javascript = require("../javascript");
25
+ function deserializeBidiValue(result, internalIdMap = /* @__PURE__ */ new Map()) {
26
+ switch (result.type) {
27
+ case "undefined":
28
+ return void 0;
29
+ case "null":
30
+ return null;
31
+ case "number":
32
+ return typeof result.value === "number" ? result.value : (0, import_javascript.parseUnserializableValue)(result.value);
33
+ case "boolean":
34
+ return Boolean(result.value);
35
+ case "string":
36
+ return result.value;
37
+ case "bigint":
38
+ return BigInt(result.value);
39
+ case "array":
40
+ return deserializeBidiList(result, internalIdMap);
41
+ case "arraybuffer":
42
+ return getValue(result, internalIdMap, () => ({}));
43
+ case "date":
44
+ return getValue(result, internalIdMap, () => new Date(result.value));
45
+ case "error":
46
+ return getValue(result, internalIdMap, () => {
47
+ const error = new Error();
48
+ error.stack = "";
49
+ return error;
50
+ });
51
+ case "function":
52
+ return void 0;
53
+ case "generator":
54
+ return getValue(result, internalIdMap, () => ({}));
55
+ case "htmlcollection":
56
+ return { ...deserializeBidiList(result, internalIdMap) };
57
+ case "map":
58
+ return getValue(result, internalIdMap, () => ({}));
59
+ case "node":
60
+ return "ref: <Node>";
61
+ case "nodelist":
62
+ return { ...deserializeBidiList(result, internalIdMap) };
63
+ case "object":
64
+ return deserializeBidiMapping(result, internalIdMap);
65
+ case "promise":
66
+ return getValue(result, internalIdMap, () => ({}));
67
+ case "proxy":
68
+ return getValue(result, internalIdMap, () => ({}));
69
+ case "regexp":
70
+ return getValue(result, internalIdMap, () => new RegExp(result.value.pattern, result.value.flags));
71
+ case "set":
72
+ return getValue(result, internalIdMap, () => ({}));
73
+ case "symbol":
74
+ return void 0;
75
+ case "typedarray":
76
+ return void 0;
77
+ case "weakmap":
78
+ return getValue(result, internalIdMap, () => ({}));
79
+ case "weakset":
80
+ return getValue(result, internalIdMap, () => ({}));
81
+ case "window":
82
+ return "ref: <Window>";
83
+ }
84
+ }
85
+ function getValue(bidiValue, internalIdMap, defaultValue) {
86
+ if ("internalId" in bidiValue && bidiValue.internalId) {
87
+ if (internalIdMap.has(bidiValue.internalId)) {
88
+ return internalIdMap.get(bidiValue.internalId);
89
+ } else {
90
+ const value = defaultValue();
91
+ internalIdMap.set(bidiValue.internalId, value);
92
+ return value;
93
+ }
94
+ } else {
95
+ return defaultValue();
96
+ }
97
+ }
98
+ function deserializeBidiList(bidiValue, internalIdMap) {
99
+ const result = getValue(bidiValue, internalIdMap, () => []);
100
+ for (const val of bidiValue.value || [])
101
+ result.push(deserializeBidiValue(val, internalIdMap));
102
+ return result;
103
+ }
104
+ function deserializeBidiMapping(bidiValue, internalIdMap) {
105
+ const result = getValue(bidiValue, internalIdMap, () => ({}));
106
+ for (const [serializedKey, serializedValue] of bidiValue.value || []) {
107
+ const key = typeof serializedKey === "string" ? serializedKey : deserializeBidiValue(serializedKey, internalIdMap);
108
+ const value = deserializeBidiValue(serializedValue, internalIdMap);
109
+ result[key] = value;
110
+ }
111
+ return result;
112
+ }
113
+ // Annotate the CommonJS export names for ESM import in node:
114
+ 0 && (module.exports = {
115
+ deserializeBidiValue
116
+ });
@@ -36,9 +36,9 @@ var import_utils = require("../../utils");
36
36
  var import_utilityScriptSerializers = require("../../utils/isomorphic/utilityScriptSerializers");
37
37
  var js = __toESM(require("../javascript"));
38
38
  var dom = __toESM(require("../dom"));
39
- var import_bidiDeserializer = require("./third_party/bidiDeserializer");
40
39
  var bidi = __toESM(require("./third_party/bidiProtocol"));
41
40
  var import_bidiSerializer = require("./third_party/bidiSerializer");
41
+ var import_bidiDeserializer = require("./bidiDeserializer");
42
42
  class BidiExecutionContext {
43
43
  constructor(session, realmInfo) {
44
44
  this._session = session;
@@ -65,7 +65,7 @@ class BidiExecutionContext {
65
65
  userActivation: true
66
66
  });
67
67
  if (response.type === "success")
68
- return import_bidiDeserializer.BidiDeserializer.deserialize(response.result);
68
+ return (0, import_bidiDeserializer.deserializeBidiValue)(response.result);
69
69
  if (response.type === "exception")
70
70
  throw new js.JavaScriptErrorInEvaluate(response.exceptionDetails.text);
71
71
  throw new js.JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response));
@@ -108,7 +108,7 @@ class BidiExecutionContext {
108
108
  throw new js.JavaScriptErrorInEvaluate(response.exceptionDetails.text);
109
109
  if (response.type === "success") {
110
110
  if (returnByValue)
111
- return (0, import_utilityScriptSerializers.parseEvaluationResultValue)(import_bidiDeserializer.BidiDeserializer.deserialize(response.result));
111
+ return (0, import_utilityScriptSerializers.parseEvaluationResultValue)((0, import_bidiDeserializer.deserializeBidiValue)(response.result));
112
112
  return createHandle(utilityScript._context, response.result);
113
113
  }
114
114
  throw new js.JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response));
@@ -123,7 +123,10 @@ class BidiExecutionContext {
123
123
  }
124
124
  return names2;
125
125
  });
126
- const values = await Promise.all(names.map((name) => handle.evaluateHandle((object, name2) => object[name2], name)));
126
+ const values = await Promise.all(names.map(async (name) => {
127
+ const value = await this._rawCallFunction("(object, name) => object[name]", [{ handle: handle._objectId }, { type: "string", value: name }], true, false);
128
+ return createHandle(handle._context, value);
129
+ }));
127
130
  const map = /* @__PURE__ */ new Map();
128
131
  for (let i = 0; i < names.length; i++)
129
132
  map.set(names[i], values[i]);
@@ -152,7 +155,7 @@ class BidiExecutionContext {
152
155
  return createHandle(context, result);
153
156
  }
154
157
  async contentFrameIdForFrame(handle) {
155
- const contentWindow = await this._rawCallFunction("e => e.contentWindow", { handle: handle._objectId });
158
+ const contentWindow = await this._rawCallFunction("e => e.contentWindow", [{ handle: handle._objectId }]);
156
159
  if (contentWindow?.type === "window")
157
160
  return contentWindow.value.context;
158
161
  return null;
@@ -166,17 +169,17 @@ class BidiExecutionContext {
166
169
  return null;
167
170
  }
168
171
  async _remoteValueForReference(reference, createHandle2) {
169
- return await this._rawCallFunction("e => e", reference, createHandle2);
172
+ return await this._rawCallFunction("e => e", [reference], createHandle2);
170
173
  }
171
- async _rawCallFunction(functionDeclaration, arg, createHandle2) {
174
+ async _rawCallFunction(functionDeclaration, args, createHandle2, awaitPromise = true) {
172
175
  const response = await this._session.send("script.callFunction", {
173
176
  functionDeclaration,
174
177
  target: this._target,
175
- arguments: [arg],
178
+ arguments: args,
176
179
  // "Root" is necessary for the handle to be returned.
177
180
  resultOwnership: createHandle2 ? bidi.Script.ResultOwnership.Root : bidi.Script.ResultOwnership.None,
178
181
  serializationOptions: { maxObjectDepth: 0, maxDomDepth: 0 },
179
- awaitPromise: true,
182
+ awaitPromise,
180
183
  userActivation: true
181
184
  });
182
185
  if (response.type === "exception")
@@ -186,25 +189,65 @@ class BidiExecutionContext {
186
189
  throw new js.JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response));
187
190
  }
188
191
  }
189
- function renderPreview(remoteObject) {
190
- if (remoteObject.type === "undefined")
191
- return "undefined";
192
- if (remoteObject.type === "null")
193
- return "null";
194
- if ("value" in remoteObject)
195
- return String(remoteObject.value);
196
- return `<${remoteObject.type}>`;
197
- }
198
- function remoteObjectValue(remoteObject) {
199
- if (remoteObject.type === "undefined")
200
- return void 0;
201
- if (remoteObject.type === "null")
202
- return null;
203
- if (remoteObject.type === "number" && typeof remoteObject.value === "string")
204
- return js.parseUnserializableValue(remoteObject.value);
205
- if ("value" in remoteObject)
206
- return remoteObject.value;
207
- return void 0;
192
+ function renderPreview(remoteObject, nested = false) {
193
+ switch (remoteObject.type) {
194
+ case "undefined":
195
+ case "null":
196
+ return remoteObject.type;
197
+ case "number":
198
+ case "boolean":
199
+ case "string":
200
+ return String(remoteObject.value);
201
+ case "bigint":
202
+ return `${remoteObject.value}n`;
203
+ case "date":
204
+ return String(new Date(remoteObject.value));
205
+ case "regexp":
206
+ return String(new RegExp(remoteObject.value.pattern, remoteObject.value.flags));
207
+ case "node":
208
+ return remoteObject.value?.localName || "Node";
209
+ case "object":
210
+ if (nested)
211
+ return "Object";
212
+ const tokens = [];
213
+ for (const [name, value] of remoteObject.value || []) {
214
+ if (typeof name === "string")
215
+ tokens.push(`${name}: ${renderPreview(value, true)}`);
216
+ }
217
+ return `{${tokens.join(", ")}}`;
218
+ case "array":
219
+ case "htmlcollection":
220
+ case "nodelist":
221
+ if (nested || !remoteObject.value)
222
+ return remoteObject.value ? `Array(${remoteObject.value.length})` : "Array";
223
+ return `[${remoteObject.value.map((v) => renderPreview(v, true)).join(", ")}]`;
224
+ case "map":
225
+ return remoteObject.value ? `Map(${remoteObject.value.length})` : "Map";
226
+ case "set":
227
+ return remoteObject.value ? `Set(${remoteObject.value.length})` : "Set";
228
+ case "arraybuffer":
229
+ return "ArrayBuffer";
230
+ case "error":
231
+ return "Error";
232
+ case "function":
233
+ return "Function";
234
+ case "generator":
235
+ return "Generator";
236
+ case "promise":
237
+ return "Promise";
238
+ case "proxy":
239
+ return "Proxy";
240
+ case "symbol":
241
+ return "Symbol()";
242
+ case "typedarray":
243
+ return "TypedArray";
244
+ case "weakmap":
245
+ return "WeakMap";
246
+ case "weakset":
247
+ return "WeakSet";
248
+ case "window":
249
+ return "Window";
250
+ }
208
251
  }
209
252
  function createHandle(context, remoteObject) {
210
253
  if (remoteObject.type === "node") {
@@ -212,7 +255,10 @@ function createHandle(context, remoteObject) {
212
255
  return new dom.ElementHandle(context, remoteObject.handle);
213
256
  }
214
257
  const objectId = "handle" in remoteObject ? remoteObject.handle : void 0;
215
- return new js.JSHandle(context, remoteObject.type, renderPreview(remoteObject), objectId, remoteObjectValue(remoteObject));
258
+ const preview = renderPreview(remoteObject);
259
+ const handle = new js.JSHandle(context, remoteObject.type, preview, objectId, (0, import_bidiDeserializer.deserializeBidiValue)(remoteObject));
260
+ handle._setPreview(preview);
261
+ return handle;
216
262
  }
217
263
  // Annotate the CommonJS export names for ESM import in node:
218
264
  0 && (module.exports = {
@@ -41,7 +41,7 @@ var import_firefoxPrefs = require("./third_party/firefoxPrefs");
41
41
  var import_manualPromise = require("../../utils/isomorphic/manualPromise");
42
42
  class BidiFirefox extends import_browserType.BrowserType {
43
43
  constructor(parent) {
44
- super(parent, "_bidiFirefox");
44
+ super(parent, "firefox");
45
45
  }
46
46
  executablePath() {
47
47
  return "";
@@ -49,15 +49,13 @@ class BidiFirefox extends import_browserType.BrowserType {
49
49
  async connectToTransport(transport, options) {
50
50
  return import_bidiBrowser.BidiBrowser.connect(this.attribution.playwright, transport, options);
51
51
  }
52
- doRewriteStartupLog(error) {
53
- if (!error.logs)
54
- return error;
55
- if (error.logs.includes(`as root in a regular user's session is not supported.`))
56
- error.logs = "\n" + (0, import_ascii.wrapInASCIIBox)(`Firefox is unable to launch if the $HOME folder isn't owned by the current user.
52
+ doRewriteStartupLog(logs) {
53
+ if (logs.includes(`as root in a regular user's session is not supported.`))
54
+ logs = "\n" + (0, import_ascii.wrapInASCIIBox)(`Firefox is unable to launch if the $HOME folder isn't owned by the current user.
57
55
  Workaround: Set the HOME=/root environment variable${process.env.GITHUB_ACTION ? " in your GitHub Actions workflow file" : ""} when running Playwright.`, 1);
58
- if (error.logs.includes("no DISPLAY environment variable specified"))
59
- error.logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
60
- return error;
56
+ if (logs.includes("no DISPLAY environment variable specified"))
57
+ logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
58
+ return logs;
61
59
  }
62
60
  amendEnvironment(env) {
63
61
  if (!import_path.default.isAbsolute(import_os.default.homedir()))
@@ -342,7 +342,7 @@ function resourceTypeFromBidi(requestDestination, requestInitiatorType, eventIni
342
342
  case "image":
343
343
  return "image";
344
344
  case "object":
345
- return "object";
345
+ return "other";
346
346
  case "paintworklet":
347
347
  return "script";
348
348
  case "script":
@@ -32,6 +32,7 @@ __export(bidiPage_exports, {
32
32
  kPlaywrightBindingChannel: () => kPlaywrightBindingChannel
33
33
  });
34
34
  module.exports = __toCommonJS(bidiPage_exports);
35
+ var import_debugLogger = require("../utils/debugLogger");
35
36
  var import_eventsHelper = require("../utils/eventsHelper");
36
37
  var dialog = __toESM(require("../dialog"));
37
38
  var dom = __toESM(require("../dom"));
@@ -42,6 +43,7 @@ var import_bidiInput = require("./bidiInput");
42
43
  var import_bidiNetworkManager = require("./bidiNetworkManager");
43
44
  var import_bidiPdf = require("./bidiPdf");
44
45
  var bidi = __toESM(require("./third_party/bidiProtocol"));
46
+ var network = __toESM(require("../network"));
45
47
  const UTILITY_WORLD_NAME = "__playwright_utility_world__";
46
48
  const kPlaywrightBindingChannel = "playwrightChannel";
47
49
  class BidiPage {
@@ -75,7 +77,8 @@ class BidiPage {
75
77
  import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.downloadWillBegin", this._onDownloadWillBegin.bind(this)),
76
78
  import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.downloadEnd", this._onDownloadEnded.bind(this)),
77
79
  import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.userPromptOpened", this._onUserPromptOpened.bind(this)),
78
- import_eventsHelper.eventsHelper.addEventListener(bidiSession, "log.entryAdded", this._onLogEntryAdded.bind(this))
80
+ import_eventsHelper.eventsHelper.addEventListener(bidiSession, "log.entryAdded", this._onLogEntryAdded.bind(this)),
81
+ import_eventsHelper.eventsHelper.addEventListener(bidiSession, "input.fileDialogOpened", this._onFileDialogOpened.bind(this))
79
82
  ];
80
83
  this._initialize().then(
81
84
  () => this._page.reportAsNew(this._opener?._page),
@@ -85,8 +88,7 @@ class BidiPage {
85
88
  async _initialize() {
86
89
  this._onFrameAttached(this._session.sessionId, null);
87
90
  await Promise.all([
88
- this.updateHttpCredentials(),
89
- this.updateRequestInterception()
91
+ this.updateHttpCredentials()
90
92
  // If the page is created by the Playwright client's call, some initialization
91
93
  // may be pending. Wait for it to complete before reporting the page as new.
92
94
  ]);
@@ -113,6 +115,7 @@ class BidiPage {
113
115
  const delegate2 = new import_bidiExecutionContext.BidiExecutionContext(this._session, realmInfo);
114
116
  const worker = new import_page.Worker(this._page, realmInfo.origin);
115
117
  this._realmToWorkerContext.set(realmInfo.realm, worker.createExecutionContext(delegate2));
118
+ worker.workerScriptLoaded();
116
119
  this._page.addWorker(realmInfo.realm, worker);
117
120
  return;
118
121
  }
@@ -176,10 +179,12 @@ class BidiPage {
176
179
  }
177
180
  _onNavigationCommitted(params) {
178
181
  const frameId = params.context;
182
+ const frame = this._page.frameManager.frame(frameId);
183
+ this._browserContext.doGrantGlobalPermissionsForURL(params.url).catch((error) => import_debugLogger.debugLogger.log("error", error));
179
184
  this._page.frameManager.frameCommittedNewDocumentNavigation(
180
185
  frameId,
181
186
  params.url,
182
- "",
187
+ frame._name,
183
188
  params.navigation,
184
189
  /* initial */
185
190
  false
@@ -260,7 +265,20 @@ ${params.stackTrace?.callFrames.map((f) => {
260
265
  return;
261
266
  const callFrame = params.stackTrace?.callFrames[0];
262
267
  const location = callFrame ?? { url: "", lineNumber: 1, columnNumber: 1 };
263
- this._page.addConsoleMessage(entry.method, entry.args.map((arg) => (0, import_bidiExecutionContext.createHandle)(context, arg)), location, params.text || void 0);
268
+ this._page.addConsoleMessage(null, entry.method, entry.args.map((arg) => (0, import_bidiExecutionContext.createHandle)(context, arg)), location);
269
+ }
270
+ async _onFileDialogOpened(params) {
271
+ if (!params.element)
272
+ return;
273
+ const frame = this._page.frameManager.frame(params.context);
274
+ if (!frame)
275
+ return;
276
+ const executionContext = await frame._mainContext();
277
+ try {
278
+ const handle = await toBidiExecutionContext(executionContext).remoteObjectForNodeId(executionContext, { sharedId: params.element.sharedId });
279
+ await this._page._onFileChooserOpened(handle);
280
+ } catch {
281
+ }
264
282
  }
265
283
  async navigateFrame(frame, url, referrer) {
266
284
  const { navigation } = await this._session.send("browsingContext.navigate", {
@@ -270,6 +288,14 @@ ${params.stackTrace?.callFrames.map((f) => {
270
288
  return { newDocumentId: navigation || void 0 };
271
289
  }
272
290
  async updateExtraHTTPHeaders() {
291
+ const allHeaders = network.mergeHeaders([
292
+ this._browserContext._options.extraHTTPHeaders,
293
+ this._page.extraHTTPHeaders()
294
+ ]);
295
+ await this._session.send("network.setExtraHeaders", {
296
+ headers: allHeaders.map(({ name, value }) => ({ name, value: { type: "string", value } })),
297
+ contexts: [this._session.sessionId]
298
+ });
273
299
  }
274
300
  async updateEmulateMedia() {
275
301
  }
@@ -285,6 +311,7 @@ ${params.stackTrace?.callFrames.map((f) => {
285
311
  const emulatedSize = this._page.emulatedSize();
286
312
  if (!emulatedSize)
287
313
  return;
314
+ const screenSize = emulatedSize.screen;
288
315
  const viewportSize = emulatedSize.viewport;
289
316
  await Promise.all([
290
317
  this._session.send("browsingContext.setViewport", {
@@ -297,12 +324,19 @@ ${params.stackTrace?.callFrames.map((f) => {
297
324
  }),
298
325
  this._session.send("emulation.setScreenOrientationOverride", {
299
326
  contexts: [this._session.sessionId],
300
- screenOrientation: (0, import_bidiBrowser.getScreenOrientation)(!!options.isMobile, viewportSize)
327
+ screenOrientation: (0, import_bidiBrowser.getScreenOrientation)(!!options.isMobile, screenSize)
328
+ }),
329
+ this._session.send("emulation.setScreenSettingsOverride", {
330
+ contexts: [this._session.sessionId],
331
+ screenArea: {
332
+ width: screenSize.width,
333
+ height: screenSize.height
334
+ }
301
335
  })
302
336
  ]);
303
337
  }
304
338
  async updateRequestInterception() {
305
- await this._networkManager.setRequestInterception(this._page.needsRequestInterception());
339
+ await this._networkManager.setRequestInterception(this._page.requestInterceptors.length > 0);
306
340
  }
307
341
  async updateOffline() {
308
342
  }
@@ -379,6 +413,8 @@ ${params.stackTrace?.callFrames.map((f) => {
379
413
  }
380
414
  }
381
415
  async setBackgroundColor(color) {
416
+ if (color)
417
+ throw new Error("Not implemented");
382
418
  }
383
419
  async takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, scale) {
384
420
  const rect = documentRect || viewportRect;
@@ -459,7 +495,9 @@ ${params.stackTrace?.callFrames.map((f) => {
459
495
  throw e;
460
496
  });
461
497
  }
462
- async setScreencastOptions(options) {
498
+ async startScreencast(options) {
499
+ }
500
+ async stopScreencast() {
463
501
  }
464
502
  rafCountForStablePosition() {
465
503
  return 1;
@@ -503,9 +541,6 @@ ${params.stackTrace?.callFrames.map((f) => {
503
541
  const executionContext = toBidiExecutionContext(to);
504
542
  return await executionContext.remoteObjectForNodeId(to, nodeId);
505
543
  }
506
- async getAccessibilityTree(needle) {
507
- throw new Error("Method not implemented.");
508
- }
509
544
  async inputActionEpilogue() {
510
545
  }
511
546
  async resetForReuse(progress) {
@@ -517,26 +552,22 @@ ${params.stackTrace?.callFrames.map((f) => {
517
552
  const parent = frame.parentFrame();
518
553
  if (!parent)
519
554
  throw new Error("Frame has been detached.");
520
- const parentContext = await parent._mainContext();
521
- const list = await parentContext.evaluateHandle(() => {
522
- return [...document.querySelectorAll("iframe,frame")];
523
- });
524
- const length = await list.evaluate((list2) => list2.length);
525
- let foundElement = null;
526
- for (let i = 0; i < length; i++) {
527
- const element = await list.evaluateHandle((list2, i2) => list2[i2], i);
528
- const candidate = await element.contentFrame();
529
- if (frame === candidate) {
530
- foundElement = element;
531
- break;
532
- } else {
533
- element.dispose();
534
- }
535
- }
536
- list.dispose();
537
- if (!foundElement)
555
+ const node = await this._getFrameNode(frame);
556
+ if (!node?.sharedId)
538
557
  throw new Error("Frame has been detached.");
539
- return foundElement;
558
+ const parentFrameExecutionContext = await parent._mainContext();
559
+ return await toBidiExecutionContext(parentFrameExecutionContext).remoteObjectForNodeId(parentFrameExecutionContext, { sharedId: node.sharedId });
560
+ }
561
+ async _getFrameNode(frame) {
562
+ const parent = frame.parentFrame();
563
+ if (!parent)
564
+ return void 0;
565
+ const result = await this._session.send("browsingContext.locateNodes", {
566
+ context: parent._id,
567
+ locator: { type: "context", value: { context: frame._id } }
568
+ });
569
+ const node = result.nodes[0];
570
+ return node;
540
571
  }
541
572
  shouldToggleStyleSheetToSyncAnimations() {
542
573
  return true;
@@ -128,6 +128,7 @@ var Network;
128
128
  ((Network2) => {
129
129
  let DataType;
130
130
  ((DataType2) => {
131
+ DataType2["Request"] = "request";
131
132
  DataType2["Response"] = "response";
132
133
  })(DataType = Network2.DataType || (Network2.DataType = {}));
133
134
  })(Network || (Network = {}));
@@ -55,6 +55,24 @@ var import_recorderApp = require("./recorder/recorderApp");
55
55
  var import_selectors = require("./selectors");
56
56
  var import_tracing = require("./trace/recorder/tracing");
57
57
  var rawStorageSource = __toESM(require("../generated/storageScriptSource"));
58
+ const BrowserContextEvent = {
59
+ Console: "console",
60
+ Close: "close",
61
+ Page: "page",
62
+ // Can't use just 'error' due to node.js special treatment of error events.
63
+ // @see https://nodejs.org/api/events.html#events_error_events
64
+ PageError: "pageerror",
65
+ Request: "request",
66
+ Response: "response",
67
+ RequestFailed: "requestfailed",
68
+ RequestFinished: "requestfinished",
69
+ RequestAborted: "requestaborted",
70
+ RequestFulfilled: "requestfulfilled",
71
+ RequestContinued: "requestcontinued",
72
+ BeforeClose: "beforeclose",
73
+ VideoStarted: "videostarted",
74
+ RecorderEvent: "recorderevent"
75
+ };
58
76
  class BrowserContext extends import_instrumentation.SdkObject {
59
77
  constructor(browser, options, browserContextId) {
60
78
  super(browser, "browser-context");
@@ -69,7 +87,7 @@ class BrowserContext extends import_instrumentation.SdkObject {
69
87
  this._creatingStorageStatePage = false;
70
88
  this.initScripts = [];
71
89
  this._routesInFlight = /* @__PURE__ */ new Set();
72
- this._playwrightBindingExposed = false;
90
+ this._consoleApiExposed = false;
73
91
  this.attribution.context = this;
74
92
  this._browser = browser;
75
93
  this._options = options;
@@ -83,24 +101,7 @@ class BrowserContext extends import_instrumentation.SdkObject {
83
101
  this.dialogManager = new import_dialog.DialogManager(this.instrumentation);
84
102
  }
85
103
  static {
86
- this.Events = {
87
- Console: "console",
88
- Close: "close",
89
- Page: "page",
90
- // Can't use just 'error' due to node.js special treatment of error events.
91
- // @see https://nodejs.org/api/events.html#events_error_events
92
- PageError: "pageerror",
93
- Request: "request",
94
- Response: "response",
95
- RequestFailed: "requestfailed",
96
- RequestFinished: "requestfinished",
97
- RequestAborted: "requestaborted",
98
- RequestFulfilled: "requestfulfilled",
99
- RequestContinued: "requestcontinued",
100
- BeforeClose: "beforeclose",
101
- VideoStarted: "videostarted",
102
- RecorderEvent: "recorderevent"
103
- };
104
+ this.Events = BrowserContextEvent;
104
105
  }
105
106
  isPersistentContext() {
106
107
  return this._isPersistentContext;
@@ -120,12 +121,8 @@ class BrowserContext extends import_instrumentation.SdkObject {
120
121
  if (this._debugger.isPaused())
121
122
  import_recorderApp.RecorderApp.showInspectorNoReply(this);
122
123
  });
123
- if ((0, import_debug.debugMode)() === "console") {
124
- await this.extendInjectedScript(`
125
- function installConsoleApi(injectedScript) { injectedScript.consoleApi.install(); }
126
- module.exports = { default: () => installConsoleApi };
127
- `);
128
- }
124
+ if ((0, import_debug.debugMode)() === "console")
125
+ await this.exposeConsoleApi();
129
126
  if (this._options.serviceWorkers === "block")
130
127
  await this.addInitScript(void 0, `navigator.serviceWorker.register = async () => { };`);
131
128
  if (this._options.permissions)
@@ -134,6 +131,15 @@ class BrowserContext extends import_instrumentation.SdkObject {
134
131
  debugger() {
135
132
  return this._debugger;
136
133
  }
134
+ async exposeConsoleApi() {
135
+ if (this._consoleApiExposed)
136
+ return;
137
+ this._consoleApiExposed = true;
138
+ await this.extendInjectedScript(`
139
+ function installConsoleApi(injectedScript) { injectedScript.consoleApi.install(); }
140
+ module.exports = { default: () => installConsoleApi };
141
+ `);
142
+ }
137
143
  async _ensureVideosPath() {
138
144
  if (this._options.recordVideo)
139
145
  await (0, import_fileUtils.mkdirIfNeeded)(import_path.default.join(this._options.recordVideo.dir, "dummy"));
@@ -229,17 +235,17 @@ class BrowserContext extends import_instrumentation.SdkObject {
229
235
  return this._pageBindings.get(name)?.forClient;
230
236
  }
231
237
  async exposePlaywrightBindingIfNeeded() {
232
- if (this._playwrightBindingExposed)
233
- return;
234
- this._playwrightBindingExposed = true;
235
- await this.doExposePlaywrightBinding();
236
- this.bindingsInitScript = import_page2.PageBinding.createInitScript();
237
- this.initScripts.push(this.bindingsInitScript);
238
- await this.doAddInitScript(this.bindingsInitScript);
239
- await this.safeNonStallingEvaluateInAllFrames(this.bindingsInitScript.source, "main");
238
+ this._playwrightBindingExposed ??= (async () => {
239
+ await this.doExposePlaywrightBinding();
240
+ this.bindingsInitScript = import_page2.PageBinding.createInitScript();
241
+ this.initScripts.push(this.bindingsInitScript);
242
+ await this.doAddInitScript(this.bindingsInitScript);
243
+ await this.safeNonStallingEvaluateInAllFrames(this.bindingsInitScript.source, "main");
244
+ })();
245
+ return await this._playwrightBindingExposed;
240
246
  }
241
247
  needsPlaywrightBinding() {
242
- return this._playwrightBindingExposed;
248
+ return this._playwrightBindingExposed !== void 0;
243
249
  }
244
250
  async exposeBinding(progress, name, needsHandle, playwrightBinding, forClient) {
245
251
  if (this._pageBindings.has(name))
@@ -310,7 +316,7 @@ class BrowserContext extends import_instrumentation.SdkObject {
310
316
  const pageOrError = await progress.race(page.waitForInitializedOrError());
311
317
  if (pageOrError instanceof Error)
312
318
  throw pageOrError;
313
- await page.mainFrame()._waitForLoadState(progress, "load");
319
+ await page.mainFrame().waitForLoadState(progress, "load");
314
320
  return page;
315
321
  }
316
322
  async _loadDefaultContext(progress) {
@@ -670,7 +676,8 @@ const defaultNewContextParamValues = {
670
676
  acceptDownloads: "accept",
671
677
  strictSelectors: false,
672
678
  serviceWorkers: "allow",
673
- locale: "en-US"
679
+ locale: "en-US",
680
+ focusControl: false
674
681
  };
675
682
  // Annotate the CommonJS export names for ESM import in node:
676
683
  0 && (module.exports = {