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.
- package/ThirdPartyNotices.txt +3134 -560
- package/bin/install_webkit_wsl.ps1 +1 -3
- package/browsers.json +21 -22
- package/lib/cli/program.js +16 -60
- package/lib/client/api.js +3 -3
- package/lib/client/browser.js +3 -5
- package/lib/client/browserContext.js +62 -8
- package/lib/client/browserType.js +4 -3
- package/lib/client/connection.js +4 -0
- package/lib/client/consoleMessage.js +5 -1
- package/lib/client/electron.js +1 -1
- package/lib/client/elementHandle.js +3 -0
- package/lib/client/events.js +5 -1
- package/lib/client/fetch.js +3 -4
- package/lib/client/frame.js +10 -1
- package/lib/client/locator.js +12 -1
- package/lib/client/network.js +5 -1
- package/lib/client/page.js +31 -6
- package/lib/client/pageAgent.js +64 -0
- package/lib/client/platform.js +3 -0
- package/lib/client/playwright.js +1 -5
- package/lib/client/tracing.js +7 -5
- package/lib/client/worker.js +22 -0
- package/lib/generated/clockSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/inProcessFactory.js +0 -2
- package/lib/mcpBundle.js +84 -0
- package/lib/mcpBundleImpl/index.js +147 -0
- package/lib/protocol/serializers.js +5 -0
- package/lib/protocol/validator.js +112 -50
- package/lib/remote/playwrightServer.js +1 -2
- package/lib/server/agent/actionRunner.js +335 -0
- package/lib/server/agent/actions.js +128 -0
- package/lib/server/agent/codegen.js +111 -0
- package/lib/server/agent/context.js +150 -0
- package/lib/server/agent/expectTools.js +156 -0
- package/lib/server/agent/pageAgent.js +204 -0
- package/lib/server/agent/performTools.js +262 -0
- package/lib/server/agent/tool.js +109 -0
- package/lib/server/android/android.js +1 -1
- package/lib/server/artifact.js +1 -1
- package/lib/server/bidi/bidiBrowser.js +81 -22
- package/lib/server/bidi/bidiChromium.js +9 -13
- package/lib/server/bidi/bidiConnection.js +1 -0
- package/lib/server/bidi/bidiDeserializer.js +116 -0
- package/lib/server/bidi/bidiExecutionContext.js +75 -29
- package/lib/server/bidi/bidiFirefox.js +7 -9
- package/lib/server/bidi/bidiNetworkManager.js +1 -1
- package/lib/server/bidi/bidiPage.js +61 -30
- package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
- package/lib/server/browserContext.js +43 -36
- package/lib/server/browserType.js +12 -4
- package/lib/server/chromium/chromium.js +26 -21
- package/lib/server/chromium/chromiumSwitches.js +12 -3
- package/lib/server/chromium/crBrowser.js +30 -12
- package/lib/server/chromium/crConnection.js +0 -5
- package/lib/server/chromium/crCoverage.js +13 -1
- package/lib/server/chromium/crDevTools.js +0 -2
- package/lib/server/chromium/crNetworkManager.js +107 -18
- package/lib/server/chromium/crPage.js +68 -124
- package/lib/server/chromium/crServiceWorker.js +14 -1
- package/lib/server/codegen/javascript.js +6 -29
- package/lib/server/console.js +5 -1
- package/lib/server/deviceDescriptorsSource.json +56 -56
- package/lib/server/dispatchers/browserContextDispatcher.js +26 -8
- package/lib/server/dispatchers/dispatcher.js +6 -13
- package/lib/server/dispatchers/frameDispatcher.js +1 -1
- package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
- package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
- package/lib/server/dispatchers/pageDispatcher.js +14 -22
- package/lib/server/dispatchers/playwrightDispatcher.js +0 -4
- package/lib/server/dom.js +12 -3
- package/lib/server/electron/electron.js +6 -3
- package/lib/server/firefox/ffBrowser.js +10 -20
- package/lib/server/firefox/ffConnection.js +0 -5
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +18 -24
- package/lib/server/firefox/firefox.js +18 -9
- package/lib/server/frameSelectors.js +18 -8
- package/lib/server/frames.js +257 -87
- package/lib/server/input.js +7 -3
- package/lib/server/instrumentation.js +3 -0
- package/lib/server/javascript.js +8 -4
- package/lib/server/launchApp.js +2 -1
- package/lib/server/localUtils.js +4 -8
- package/lib/server/network.js +50 -12
- package/lib/server/page.js +112 -126
- package/lib/server/playwright.js +2 -4
- package/lib/server/progress.js +26 -6
- package/lib/server/recorder/recorderApp.js +80 -101
- package/lib/server/recorder.js +3 -2
- package/lib/server/registry/browserFetcher.js +6 -4
- package/lib/server/registry/index.js +278 -189
- package/lib/server/registry/oopDownloadBrowserMain.js +9 -2
- package/lib/server/screencast.js +190 -0
- package/lib/server/screenshotter.js +6 -0
- package/lib/server/socksClientCertificatesInterceptor.js +1 -1
- package/lib/server/trace/recorder/snapshotter.js +17 -8
- package/lib/server/trace/recorder/snapshotterInjected.js +30 -72
- package/lib/server/trace/recorder/tracing.js +31 -21
- package/lib/server/trace/viewer/traceParser.js +72 -0
- package/lib/server/trace/viewer/traceViewer.js +45 -40
- package/lib/server/utils/comparators.js +3 -25
- package/lib/server/utils/expectUtils.js +87 -2
- package/lib/server/utils/hostPlatform.js +30 -3
- package/lib/server/utils/httpServer.js +5 -20
- package/lib/server/utils/imageUtils.js +141 -0
- package/lib/server/utils/network.js +55 -40
- package/lib/server/utils/nodePlatform.js +6 -0
- package/lib/server/{chromium/videoRecorder.js → videoRecorder.js} +35 -24
- package/lib/server/webkit/webkit.js +5 -16
- package/lib/server/webkit/wkBrowser.js +2 -6
- package/lib/server/webkit/wkConnection.js +1 -6
- package/lib/server/webkit/wkInterceptableRequest.js +29 -1
- package/lib/server/webkit/wkPage.js +76 -51
- package/lib/server/webkit/wkWorkers.js +2 -1
- package/lib/utils/isomorphic/ariaSnapshot.js +63 -0
- package/lib/utils/isomorphic/locatorGenerators.js +24 -8
- package/lib/utils/isomorphic/lruCache.js +51 -0
- package/lib/utils/isomorphic/mimeType.js +1 -1
- package/lib/utils/isomorphic/protocolFormatter.js +3 -0
- package/lib/utils/isomorphic/protocolMetainfo.js +11 -2
- package/lib/utils/isomorphic/stringUtils.js +49 -0
- package/lib/utils/isomorphic/trace/entries.js +16 -0
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
- package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
- package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
- package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
- package/lib/utils/isomorphic/trace/traceModel.js +365 -0
- package/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
- package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
- package/lib/utils/isomorphic/urlMatch.js +19 -5
- package/lib/utils/isomorphic/yaml.js +84 -0
- package/lib/utils.js +4 -0
- package/lib/utilsBundle.js +1 -1
- package/lib/utilsBundleImpl/index.js +124 -124
- package/lib/vite/htmlReport/index.html +21 -21
- package/lib/vite/recorder/assets/codeMirrorModule-CFUTFUO7.js +32 -0
- package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
- package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
- package/lib/vite/recorder/assets/index-CVkBxsGf.js +193 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-BVA4h_ZY.js +32 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +266 -0
- package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
- package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
- package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
- package/lib/vite/traceViewer/index.BtyWtaE-.js +2 -0
- package/lib/vite/traceViewer/index.html +6 -6
- package/lib/vite/traceViewer/manifest.webmanifest +16 -0
- package/lib/vite/traceViewer/snapshot.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +5 -3
- package/lib/vite/traceViewer/uiMode.fyrXARf2.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/package.json +2 -1
- package/types/protocol.d.ts +939 -245
- package/types/types.d.ts +143 -153
- package/lib/client/accessibility.js +0 -49
- package/lib/server/accessibility.js +0 -69
- package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
- package/lib/server/chromium/crAccessibility.js +0 -263
- package/lib/server/firefox/ffAccessibility.js +0 -238
- package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
- package/lib/server/webkit/wkAccessibility.js +0 -237
- package/lib/server/webkit/wsl/webkit-wsl-transport-client.js +0 -74
- package/lib/server/webkit/wsl/webkit-wsl-transport-server.js +0 -113
- package/lib/vite/recorder/assets/codeMirrorModule-RJCXzfmE.js +0 -24
- package/lib/vite/recorder/assets/index-Y-X2TGJv.js +0 -193
- package/lib/vite/traceViewer/assets/codeMirrorModule-rbQPefq7.js +0 -24
- package/lib/vite/traceViewer/assets/defaultSettingsView-CLbol9XR.js +0 -265
- package/lib/vite/traceViewer/defaultSettingsView.TQ8_7ybu.css +0 -1
- package/lib/vite/traceViewer/index.I8N9v4jT.css +0 -1
- package/lib/vite/traceViewer/index.zIVi6mN9.js +0 -2
- 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.
|
|
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.
|
|
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) =>
|
|
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,
|
|
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:
|
|
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
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
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, "
|
|
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(
|
|
53
|
-
if (
|
|
54
|
-
|
|
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 (
|
|
59
|
-
|
|
60
|
-
return
|
|
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()))
|
|
@@ -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
|
|
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,
|
|
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.
|
|
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
|
|
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
|
|
521
|
-
|
|
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
|
-
|
|
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;
|
|
@@ -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.
|
|
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.
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
await this.
|
|
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().
|
|
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 = {
|