playwright-core 1.54.0-alpha-2025-06-10 → 1.54.0-alpha-2025-06-12
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/browsers.json +1 -1
- package/lib/client/playwright.js +0 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/server/android/backendAdb.js +0 -2
- package/lib/server/browserType.js +1 -2
- package/lib/server/chromium/chromium.js +0 -1
- package/lib/server/chromium/crBrowser.js +1 -1
- package/lib/server/chromium/crConnection.js +8 -9
- package/lib/server/cookieStore.js +1 -1
- package/lib/server/dispatchers/androidDispatcher.js +20 -1
- package/lib/server/dispatchers/dispatcher.js +12 -14
- package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
- package/lib/server/dispatchers/localUtilsDispatcher.js +1 -1
- package/lib/server/dispatchers/pageDispatcher.js +2 -2
- package/lib/server/dispatchers/playwrightDispatcher.js +4 -4
- package/lib/server/dispatchers/streamDispatcher.js +8 -2
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +2 -2
- package/lib/server/dispatchers/writableStreamDispatcher.js +11 -5
- package/lib/server/electron/electron.js +1 -1
- package/lib/server/instrumentation.js +8 -0
- package/lib/server/network.js +6 -1
- package/lib/server/page.js +0 -2
- package/lib/server/playwright.js +1 -1
- package/lib/server/progress.js +1 -1
- package/lib/vite/htmlReport/index.html +11 -11
- package/lib/vite/traceViewer/assets/{codeMirrorModule-CyR9bMT4.js → codeMirrorModule-BKr-mZ2D.js} +1 -1
- package/lib/vite/traceViewer/assets/{defaultSettingsView-BvdMUV2f.js → defaultSettingsView-CzQxXsO4.js} +39 -39
- package/lib/vite/traceViewer/{index.Bk7V5SPV.js → index.BT-45kLv.js} +1 -1
- package/lib/vite/traceViewer/index.html +2 -2
- package/lib/vite/traceViewer/{uiMode.Dte67t43.js → uiMode.BuGgfvGl.js} +1 -1
- package/lib/vite/traceViewer/uiMode.html +2 -2
- package/package.json +1 -1
|
@@ -34,7 +34,6 @@ module.exports = __toCommonJS(backendAdb_exports);
|
|
|
34
34
|
var import_events = require("events");
|
|
35
35
|
var import_net = __toESM(require("net"));
|
|
36
36
|
var import_assert = require("../../utils/isomorphic/assert");
|
|
37
|
-
var import_crypto = require("../utils/crypto");
|
|
38
37
|
var import_utilsBundle = require("../../utilsBundle");
|
|
39
38
|
class AdbBackend {
|
|
40
39
|
async devices(options = {}) {
|
|
@@ -116,7 +115,6 @@ function encodeMessage(message) {
|
|
|
116
115
|
class BufferedSocketWrapper extends import_events.EventEmitter {
|
|
117
116
|
constructor(command, socket) {
|
|
118
117
|
super();
|
|
119
|
-
this.guid = (0, import_crypto.createGuid)();
|
|
120
118
|
this._buffer = Buffer.from([]);
|
|
121
119
|
this._isSocket = false;
|
|
122
120
|
this._isClosed = false;
|
|
@@ -57,6 +57,7 @@ class BrowserType extends import_instrumentation.SdkObject {
|
|
|
57
57
|
super(parent, "browser-type");
|
|
58
58
|
this.attribution.browserType = this;
|
|
59
59
|
this._name = browserName;
|
|
60
|
+
this.logName = "browser";
|
|
60
61
|
}
|
|
61
62
|
executablePath() {
|
|
62
63
|
return import_registry.registry.findExecutable(this._name).executablePath(this.attribution.playwright.options.sdkLanguage) || "";
|
|
@@ -67,7 +68,6 @@ class BrowserType extends import_instrumentation.SdkObject {
|
|
|
67
68
|
async launch(metadata, options, protocolLogger) {
|
|
68
69
|
options = this._validateLaunchOptions(options);
|
|
69
70
|
const controller = new import_progress.ProgressController(metadata, this);
|
|
70
|
-
controller.setLogName("browser");
|
|
71
71
|
const browser = await controller.run((progress) => {
|
|
72
72
|
const seleniumHubUrl = options.__testHookSeleniumRemoteURL || process.env.SELENIUM_REMOTE_URL;
|
|
73
73
|
if (seleniumHubUrl)
|
|
@@ -81,7 +81,6 @@ class BrowserType extends import_instrumentation.SdkObject {
|
|
|
81
81
|
async launchPersistentContext(metadata, userDataDir, options) {
|
|
82
82
|
const launchOptions = this._validateLaunchOptions(options);
|
|
83
83
|
const controller = new import_progress.ProgressController(metadata, this);
|
|
84
|
-
controller.setLogName("browser");
|
|
85
84
|
const browser = await controller.run(async (progress) => {
|
|
86
85
|
let clientCertificatesProxy;
|
|
87
86
|
if (options.clientCertificates?.length) {
|
|
@@ -63,7 +63,6 @@ class Chromium extends import_browserType.BrowserType {
|
|
|
63
63
|
}
|
|
64
64
|
async connectOverCDP(metadata, endpointURL, options) {
|
|
65
65
|
const controller = new import_progress.ProgressController(metadata, this);
|
|
66
|
-
controller.setLogName("browser");
|
|
67
66
|
return controller.run(async (progress) => {
|
|
68
67
|
return await this._connectOverCDPInternal(progress, endpointURL, options);
|
|
69
68
|
}, options.timeout);
|
|
@@ -66,7 +66,7 @@ class CRBrowser extends import_browser.Browser {
|
|
|
66
66
|
}
|
|
67
67
|
static async connect(parent, transport, options, devtools) {
|
|
68
68
|
options = { ...options };
|
|
69
|
-
const connection = new import_crConnection.CRConnection(transport, options.protocolLogger, options.browserLogsCollector);
|
|
69
|
+
const connection = new import_crConnection.CRConnection(parent, transport, options.protocolLogger, options.browserLogsCollector);
|
|
70
70
|
const browser = new CRBrowser(parent, connection, options);
|
|
71
71
|
browser._devtools = devtools;
|
|
72
72
|
if (browser.isClank())
|
|
@@ -25,18 +25,18 @@ __export(crConnection_exports, {
|
|
|
25
25
|
kBrowserCloseMessageId: () => kBrowserCloseMessageId
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(crConnection_exports);
|
|
28
|
-
var import_events = require("events");
|
|
29
28
|
var import_utils = require("../../utils");
|
|
30
29
|
var import_debugLogger = require("../utils/debugLogger");
|
|
31
30
|
var import_helper = require("../helper");
|
|
32
31
|
var import_protocolError = require("../protocolError");
|
|
32
|
+
var import_instrumentation = require("../instrumentation");
|
|
33
33
|
const ConnectionEvents = {
|
|
34
34
|
Disconnected: Symbol("ConnectionEvents.Disconnected")
|
|
35
35
|
};
|
|
36
36
|
const kBrowserCloseMessageId = -9999;
|
|
37
|
-
class CRConnection extends
|
|
38
|
-
constructor(transport, protocolLogger, browserLogsCollector) {
|
|
39
|
-
super();
|
|
37
|
+
class CRConnection extends import_instrumentation.SdkObject {
|
|
38
|
+
constructor(parent, transport, protocolLogger, browserLogsCollector) {
|
|
39
|
+
super(parent, "cr-connection");
|
|
40
40
|
this._lastId = 0;
|
|
41
41
|
this._sessions = /* @__PURE__ */ new Map();
|
|
42
42
|
this._closed = false;
|
|
@@ -83,9 +83,9 @@ class CRConnection extends import_events.EventEmitter {
|
|
|
83
83
|
return new CDPSession(this.rootSession, sessionId);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
class CRSession extends
|
|
86
|
+
class CRSession extends import_instrumentation.SdkObject {
|
|
87
87
|
constructor(connection, parentSession, sessionId, eventListener) {
|
|
88
|
-
super();
|
|
88
|
+
super(connection, "cr-session");
|
|
89
89
|
this._callbacks = /* @__PURE__ */ new Map();
|
|
90
90
|
this._crashed = false;
|
|
91
91
|
this._closed = false;
|
|
@@ -160,11 +160,10 @@ class CRSession extends import_events.EventEmitter {
|
|
|
160
160
|
this._callbacks.clear();
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
-
class CDPSession extends
|
|
163
|
+
class CDPSession extends import_instrumentation.SdkObject {
|
|
164
164
|
constructor(parentSession, sessionId) {
|
|
165
|
-
super();
|
|
165
|
+
super(parentSession, "cdp-session");
|
|
166
166
|
this._listeners = [];
|
|
167
|
-
this.guid = `cdp-session@${sessionId}`;
|
|
168
167
|
this._session = parentSession.createChildSession(sessionId, (method, params) => this.emit(CDPSession.Events.Event, { method, params }));
|
|
169
168
|
this._listeners = [import_utils.eventsHelper.addEventListener(parentSession, "Target.detachedFromTarget", (event) => {
|
|
170
169
|
if (event.sessionId === sessionId)
|
|
@@ -34,7 +34,7 @@ class Cookie {
|
|
|
34
34
|
}
|
|
35
35
|
// https://datatracker.ietf.org/doc/html/rfc6265#section-5.4
|
|
36
36
|
matches(url) {
|
|
37
|
-
if (this._raw.secure && (url.protocol !== "https:" && url.hostname
|
|
37
|
+
if (this._raw.secure && (url.protocol !== "https:" && !(0, import_network.isLocalHostname)(url.hostname)))
|
|
38
38
|
return false;
|
|
39
39
|
if (!domainMatches(url.hostname, this._raw.domain))
|
|
40
40
|
return false;
|
|
@@ -26,6 +26,8 @@ module.exports = __toCommonJS(androidDispatcher_exports);
|
|
|
26
26
|
var import_browserContextDispatcher = require("./browserContextDispatcher");
|
|
27
27
|
var import_dispatcher = require("./dispatcher");
|
|
28
28
|
var import_android = require("../android/android");
|
|
29
|
+
var import_eventsHelper = require("../utils/eventsHelper");
|
|
30
|
+
var import_instrumentation = require("../instrumentation");
|
|
29
31
|
class AndroidDispatcher extends import_dispatcher.Dispatcher {
|
|
30
32
|
constructor(scope, android) {
|
|
31
33
|
super(scope, android, "Android", {});
|
|
@@ -125,7 +127,7 @@ class AndroidDeviceDispatcher extends import_dispatcher.Dispatcher {
|
|
|
125
127
|
}
|
|
126
128
|
async open(params, metadata) {
|
|
127
129
|
const socket = await this._object.open(params.command);
|
|
128
|
-
return { socket: new AndroidSocketDispatcher(this, socket) };
|
|
130
|
+
return { socket: new AndroidSocketDispatcher(this, new SocketSdkObject(this._object, socket)) };
|
|
129
131
|
}
|
|
130
132
|
async installApk(params) {
|
|
131
133
|
await this._object.installApk(params.file, { args: params.args });
|
|
@@ -144,6 +146,23 @@ class AndroidDeviceDispatcher extends import_dispatcher.Dispatcher {
|
|
|
144
146
|
return { context: import_browserContextDispatcher.BrowserContextDispatcher.from(this, await this._object.connectToWebView(params.socketName)) };
|
|
145
147
|
}
|
|
146
148
|
}
|
|
149
|
+
class SocketSdkObject extends import_instrumentation.SdkObject {
|
|
150
|
+
constructor(parent, socket) {
|
|
151
|
+
super(parent, "socket");
|
|
152
|
+
this._socket = socket;
|
|
153
|
+
this._eventListeners = [
|
|
154
|
+
import_eventsHelper.eventsHelper.addEventListener(socket, "data", (data) => this.emit("data", data)),
|
|
155
|
+
import_eventsHelper.eventsHelper.addEventListener(socket, "close", () => this.emit("close"))
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
async write(data) {
|
|
159
|
+
await this._socket.write(data);
|
|
160
|
+
}
|
|
161
|
+
close() {
|
|
162
|
+
this._socket.close();
|
|
163
|
+
import_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
147
166
|
class AndroidSocketDispatcher extends import_dispatcher.Dispatcher {
|
|
148
167
|
constructor(scope, socket) {
|
|
149
168
|
super(scope, socket, "AndroidSocket", {});
|
|
@@ -134,7 +134,7 @@ class Dispatcher extends import_events.EventEmitter {
|
|
|
134
134
|
}
|
|
135
135
|
class RootDispatcher extends Dispatcher {
|
|
136
136
|
constructor(connection, createPlaywright) {
|
|
137
|
-
super(connection,
|
|
137
|
+
super(connection, (0, import_instrumentation.createRootSdkObject)(), "Root", {});
|
|
138
138
|
this.createPlaywright = createPlaywright;
|
|
139
139
|
this._initialized = false;
|
|
140
140
|
}
|
|
@@ -259,16 +259,16 @@ class DispatcherConnection {
|
|
|
259
259
|
if (import_protocolMetainfo.methodMetainfo.get(dispatcher._type + "." + method)?.internal) {
|
|
260
260
|
validMetadata.internal = true;
|
|
261
261
|
}
|
|
262
|
-
const sdkObject = dispatcher._object
|
|
262
|
+
const sdkObject = dispatcher._object;
|
|
263
263
|
const callMetadata = {
|
|
264
264
|
id: `call@${id}`,
|
|
265
265
|
location: validMetadata.location,
|
|
266
266
|
title: validMetadata.title,
|
|
267
267
|
internal: validMetadata.internal,
|
|
268
268
|
stepId: validMetadata.stepId,
|
|
269
|
-
objectId: sdkObject
|
|
270
|
-
pageId: sdkObject
|
|
271
|
-
frameId: sdkObject
|
|
269
|
+
objectId: sdkObject.guid,
|
|
270
|
+
pageId: sdkObject.attribution?.page?.guid,
|
|
271
|
+
frameId: sdkObject.attribution?.frame?.guid,
|
|
272
272
|
startTime: (0, import_utils.monotonicTime)(),
|
|
273
273
|
endTime: 0,
|
|
274
274
|
type: dispatcher._type,
|
|
@@ -276,7 +276,7 @@ class DispatcherConnection {
|
|
|
276
276
|
params: params || {},
|
|
277
277
|
log: []
|
|
278
278
|
};
|
|
279
|
-
if (
|
|
279
|
+
if (params?.info?.waitId) {
|
|
280
280
|
const info = params.info;
|
|
281
281
|
switch (info.phase) {
|
|
282
282
|
case "before": {
|
|
@@ -303,7 +303,7 @@ class DispatcherConnection {
|
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
|
-
await sdkObject
|
|
306
|
+
await sdkObject.instrumentation.onBeforeCall(sdkObject, callMetadata);
|
|
307
307
|
const response = { id };
|
|
308
308
|
try {
|
|
309
309
|
const result = await dispatcher._handleCommand(callMetadata, method, validParams);
|
|
@@ -311,23 +311,21 @@ class DispatcherConnection {
|
|
|
311
311
|
response.result = validator(result, "", this._validatorToWireContext());
|
|
312
312
|
callMetadata.result = result;
|
|
313
313
|
} catch (e) {
|
|
314
|
-
if ((0, import_errors.isTargetClosedError)(e)
|
|
314
|
+
if ((0, import_errors.isTargetClosedError)(e)) {
|
|
315
315
|
const reason = closeReason(sdkObject);
|
|
316
316
|
if (reason)
|
|
317
317
|
(0, import_utils.rewriteErrorMessage)(e, reason);
|
|
318
318
|
} else if ((0, import_protocolError.isProtocolError)(e)) {
|
|
319
|
-
if (e.type === "closed")
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
} else if (e.type === "crashed") {
|
|
319
|
+
if (e.type === "closed")
|
|
320
|
+
e = new import_errors.TargetClosedError(closeReason(sdkObject), e.browserLogMessage());
|
|
321
|
+
else if (e.type === "crashed")
|
|
323
322
|
(0, import_utils.rewriteErrorMessage)(e, "Target crashed " + e.browserLogMessage());
|
|
324
|
-
}
|
|
325
323
|
}
|
|
326
324
|
response.error = (0, import_errors.serializeError)(e);
|
|
327
325
|
callMetadata.error = response.error;
|
|
328
326
|
} finally {
|
|
329
327
|
callMetadata.endTime = (0, import_utils.monotonicTime)();
|
|
330
|
-
await sdkObject
|
|
328
|
+
await sdkObject.instrumentation.onAfterCall(sdkObject, callMetadata);
|
|
331
329
|
}
|
|
332
330
|
if (response.error)
|
|
333
331
|
response.log = (0, import_callLog.compressCallLog)(callMetadata.log);
|
|
@@ -22,10 +22,10 @@ __export(jsonPipeDispatcher_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(jsonPipeDispatcher_exports);
|
|
24
24
|
var import_dispatcher = require("./dispatcher");
|
|
25
|
-
var
|
|
25
|
+
var import_instrumentation = require("../instrumentation");
|
|
26
26
|
class JsonPipeDispatcher extends import_dispatcher.Dispatcher {
|
|
27
27
|
constructor(scope) {
|
|
28
|
-
super(scope,
|
|
28
|
+
super(scope, new import_instrumentation.SdkObject(scope._object, "jsonPipe"), "JsonPipe", {});
|
|
29
29
|
this._type_JsonPipe = true;
|
|
30
30
|
}
|
|
31
31
|
async send(params) {
|
|
@@ -45,6 +45,7 @@ var import_urlMatch = require("../../utils/isomorphic/urlMatch");
|
|
|
45
45
|
class LocalUtilsDispatcher extends import_dispatcher.Dispatcher {
|
|
46
46
|
constructor(scope, playwright) {
|
|
47
47
|
const localUtils2 = new import_instrumentation.SdkObject(playwright, "localUtils", "localUtils");
|
|
48
|
+
localUtils2.logName = "browser";
|
|
48
49
|
const deviceDescriptors = Object.entries(import_deviceDescriptors.deviceDescriptors).map(([name, descriptor]) => ({ name, descriptor }));
|
|
49
50
|
super(scope, localUtils2, "LocalUtils", {
|
|
50
51
|
deviceDescriptors
|
|
@@ -79,7 +80,6 @@ class LocalUtilsDispatcher extends import_dispatcher.Dispatcher {
|
|
|
79
80
|
}
|
|
80
81
|
async connect(params, metadata) {
|
|
81
82
|
const controller = new import_progress.ProgressController(metadata, this._object);
|
|
82
|
-
controller.setLogName("browser");
|
|
83
83
|
return await controller.run(async (progress) => {
|
|
84
84
|
const wsHeaders = {
|
|
85
85
|
"User-Agent": (0, import_userAgent.getUserAgent)(),
|
|
@@ -34,7 +34,7 @@ var import_networkDispatchers = require("./networkDispatchers");
|
|
|
34
34
|
var import_networkDispatchers2 = require("./networkDispatchers");
|
|
35
35
|
var import_networkDispatchers3 = require("./networkDispatchers");
|
|
36
36
|
var import_webSocketRouteDispatcher = require("./webSocketRouteDispatcher");
|
|
37
|
-
var
|
|
37
|
+
var import_instrumentation = require("../instrumentation");
|
|
38
38
|
var import_urlMatch = require("../../utils/isomorphic/urlMatch");
|
|
39
39
|
class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
40
40
|
constructor(parentScope, page) {
|
|
@@ -338,7 +338,7 @@ class WorkerDispatcher extends import_dispatcher.Dispatcher {
|
|
|
338
338
|
class BindingCallDispatcher extends import_dispatcher.Dispatcher {
|
|
339
339
|
constructor(scope, name, needsHandle, source, args) {
|
|
340
340
|
const frameDispatcher = import_frameDispatcher.FrameDispatcher.from(scope.parentScope(), source.frame);
|
|
341
|
-
super(scope,
|
|
341
|
+
super(scope, new import_instrumentation.SdkObject(scope._object, "bindingCall"), "BindingCall", {
|
|
342
342
|
frame: frameDispatcher,
|
|
343
343
|
name,
|
|
344
344
|
args: needsHandle ? void 0 : args.map(import_jsHandleDispatcher.serializeResult),
|
|
@@ -31,7 +31,7 @@ var import_dispatcher = require("./dispatcher");
|
|
|
31
31
|
var import_electronDispatcher = require("./electronDispatcher");
|
|
32
32
|
var import_localUtilsDispatcher = require("./localUtilsDispatcher");
|
|
33
33
|
var import_networkDispatchers = require("./networkDispatchers");
|
|
34
|
-
var
|
|
34
|
+
var import_instrumentation = require("../instrumentation");
|
|
35
35
|
var import_eventsHelper = require("../utils/eventsHelper");
|
|
36
36
|
class PlaywrightDispatcher extends import_dispatcher.Dispatcher {
|
|
37
37
|
constructor(scope, playwright, options = {}) {
|
|
@@ -50,7 +50,7 @@ class PlaywrightDispatcher extends import_dispatcher.Dispatcher {
|
|
|
50
50
|
android,
|
|
51
51
|
electron: new import_electronDispatcher.ElectronDispatcher(scope, playwright.electron),
|
|
52
52
|
utils: playwright.options.isServer ? void 0 : new import_localUtilsDispatcher.LocalUtilsDispatcher(scope, playwright),
|
|
53
|
-
socksSupport: options.socksProxy ? new SocksSupportDispatcher(scope, options.socksProxy) : void 0
|
|
53
|
+
socksSupport: options.socksProxy ? new SocksSupportDispatcher(scope, playwright, options.socksProxy) : void 0
|
|
54
54
|
};
|
|
55
55
|
let browserDispatcher;
|
|
56
56
|
if (options.preLaunchedBrowser) {
|
|
@@ -92,8 +92,8 @@ class PlaywrightDispatcher extends import_dispatcher.Dispatcher {
|
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
class SocksSupportDispatcher extends import_dispatcher.Dispatcher {
|
|
95
|
-
constructor(scope, socksProxy) {
|
|
96
|
-
super(scope,
|
|
95
|
+
constructor(scope, parent, socksProxy) {
|
|
96
|
+
super(scope, new import_instrumentation.SdkObject(parent, "socksSupport"), "SocksSupport", {});
|
|
97
97
|
this._type_SocksSupport = true;
|
|
98
98
|
this._socksProxy = socksProxy;
|
|
99
99
|
this._socksListeners = [
|
|
@@ -23,10 +23,16 @@ __export(streamDispatcher_exports, {
|
|
|
23
23
|
module.exports = __toCommonJS(streamDispatcher_exports);
|
|
24
24
|
var import_dispatcher = require("./dispatcher");
|
|
25
25
|
var import_manualPromise = require("../../utils/isomorphic/manualPromise");
|
|
26
|
-
var
|
|
26
|
+
var import_instrumentation = require("../instrumentation");
|
|
27
|
+
class StreamSdkObject extends import_instrumentation.SdkObject {
|
|
28
|
+
constructor(parent, stream) {
|
|
29
|
+
super(parent, "stream");
|
|
30
|
+
this.stream = stream;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
27
33
|
class StreamDispatcher extends import_dispatcher.Dispatcher {
|
|
28
34
|
constructor(scope, stream) {
|
|
29
|
-
super(scope,
|
|
35
|
+
super(scope, new StreamSdkObject(scope._object, stream), "Stream", {});
|
|
30
36
|
this._type_Stream = true;
|
|
31
37
|
this._ended = false;
|
|
32
38
|
stream.once("end", () => this._ended = true);
|
|
@@ -35,12 +35,12 @@ var import_page = require("../page");
|
|
|
35
35
|
var import_dispatcher = require("./dispatcher");
|
|
36
36
|
var import_pageDispatcher = require("./pageDispatcher");
|
|
37
37
|
var rawWebSocketMockSource = __toESM(require("../../generated/webSocketMockSource"));
|
|
38
|
-
var
|
|
38
|
+
var import_instrumentation = require("../instrumentation");
|
|
39
39
|
var import_urlMatch = require("../../utils/isomorphic/urlMatch");
|
|
40
40
|
var import_eventsHelper = require("../utils/eventsHelper");
|
|
41
41
|
class WebSocketRouteDispatcher extends import_dispatcher.Dispatcher {
|
|
42
42
|
constructor(scope, id, url, frame) {
|
|
43
|
-
super(scope,
|
|
43
|
+
super(scope, new import_instrumentation.SdkObject(scope._object, "webSocketRoute"), "WebSocketRoute", { url });
|
|
44
44
|
this._type_WebSocketRoute = true;
|
|
45
45
|
this._id = id;
|
|
46
46
|
this._frame = frame;
|
|
@@ -33,12 +33,18 @@ __export(writableStreamDispatcher_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(writableStreamDispatcher_exports);
|
|
34
34
|
var import_fs = __toESM(require("fs"));
|
|
35
35
|
var import_dispatcher = require("./dispatcher");
|
|
36
|
-
var
|
|
36
|
+
var import_instrumentation = require("../instrumentation");
|
|
37
|
+
class WritableStreamSdkObject extends import_instrumentation.SdkObject {
|
|
38
|
+
constructor(parent, streamOrDirectory, lastModifiedMs) {
|
|
39
|
+
super(parent, "stream");
|
|
40
|
+
this.streamOrDirectory = streamOrDirectory;
|
|
41
|
+
this.lastModifiedMs = lastModifiedMs;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
37
44
|
class WritableStreamDispatcher extends import_dispatcher.Dispatcher {
|
|
38
45
|
constructor(scope, streamOrDirectory, lastModifiedMs) {
|
|
39
|
-
super(scope,
|
|
46
|
+
super(scope, new WritableStreamSdkObject(scope._object, streamOrDirectory, lastModifiedMs), "WritableStream", {});
|
|
40
47
|
this._type_WritableStream = true;
|
|
41
|
-
this._lastModifiedMs = lastModifiedMs;
|
|
42
48
|
}
|
|
43
49
|
async write(params) {
|
|
44
50
|
if (typeof this._object.streamOrDirectory === "string")
|
|
@@ -58,8 +64,8 @@ class WritableStreamDispatcher extends import_dispatcher.Dispatcher {
|
|
|
58
64
|
throw new Error("Cannot close a directory");
|
|
59
65
|
const stream = this._object.streamOrDirectory;
|
|
60
66
|
await new Promise((fulfill) => stream.end(fulfill));
|
|
61
|
-
if (this.
|
|
62
|
-
await import_fs.default.promises.utimes(this.path(), new Date(this.
|
|
67
|
+
if (this._object.lastModifiedMs)
|
|
68
|
+
await import_fs.default.promises.utimes(this.path(), new Date(this._object.lastModifiedMs), new Date(this._object.lastModifiedMs));
|
|
63
69
|
}
|
|
64
70
|
path() {
|
|
65
71
|
if (typeof this._object.streamOrDirectory === "string")
|
|
@@ -203,7 +203,7 @@ class Electron extends import_instrumentation.SdkObject {
|
|
|
203
203
|
const debuggerDisconnectPromise = waitForLine(progress, launchedProcess, /Waiting for the debugger to disconnect\.\.\./);
|
|
204
204
|
const nodeMatch = await nodeMatchPromise;
|
|
205
205
|
const nodeTransport = await import_transport.WebSocketTransport.connect(progress, nodeMatch[1]);
|
|
206
|
-
const nodeConnection = new import_crConnection.CRConnection(nodeTransport, import_helper.helper.debugProtocolLogger(), browserLogsCollector);
|
|
206
|
+
const nodeConnection = new import_crConnection.CRConnection(this, nodeTransport, import_helper.helper.debugProtocolLogger(), browserLogsCollector);
|
|
207
207
|
debuggerDisconnectPromise.then(() => {
|
|
208
208
|
nodeTransport.close();
|
|
209
209
|
}).catch(() => {
|
|
@@ -20,6 +20,7 @@ var instrumentation_exports = {};
|
|
|
20
20
|
__export(instrumentation_exports, {
|
|
21
21
|
SdkObject: () => SdkObject,
|
|
22
22
|
createInstrumentation: () => createInstrumentation,
|
|
23
|
+
createRootSdkObject: () => createRootSdkObject,
|
|
23
24
|
serverSideCallMetadata: () => serverSideCallMetadata
|
|
24
25
|
});
|
|
25
26
|
module.exports = __toCommonJS(instrumentation_exports);
|
|
@@ -34,6 +35,12 @@ class SdkObject extends import_events.EventEmitter {
|
|
|
34
35
|
this.instrumentation = parent.instrumentation;
|
|
35
36
|
}
|
|
36
37
|
}
|
|
38
|
+
function createRootSdkObject() {
|
|
39
|
+
const fakeParent = { attribution: {}, instrumentation: createInstrumentation() };
|
|
40
|
+
const root = new SdkObject(fakeParent);
|
|
41
|
+
root.guid = "";
|
|
42
|
+
return root;
|
|
43
|
+
}
|
|
37
44
|
function createInstrumentation() {
|
|
38
45
|
const listeners = /* @__PURE__ */ new Map();
|
|
39
46
|
return new Proxy({}, {
|
|
@@ -71,5 +78,6 @@ function serverSideCallMetadata() {
|
|
|
71
78
|
0 && (module.exports = {
|
|
72
79
|
SdkObject,
|
|
73
80
|
createInstrumentation,
|
|
81
|
+
createRootSdkObject,
|
|
74
82
|
serverSideCallMetadata
|
|
75
83
|
});
|
package/lib/server/network.js
CHANGED
|
@@ -23,6 +23,7 @@ __export(network_exports, {
|
|
|
23
23
|
Route: () => Route,
|
|
24
24
|
WebSocket: () => WebSocket,
|
|
25
25
|
filterCookies: () => filterCookies,
|
|
26
|
+
isLocalHostname: () => isLocalHostname,
|
|
26
27
|
kMaxCookieExpiresDateInSeconds: () => kMaxCookieExpiresDateInSeconds,
|
|
27
28
|
mergeHeaders: () => mergeHeaders,
|
|
28
29
|
parseURL: () => parseURL,
|
|
@@ -50,13 +51,16 @@ function filterCookies(cookies, urls) {
|
|
|
50
51
|
continue;
|
|
51
52
|
if (!parsedURL.pathname.startsWith(c.path))
|
|
52
53
|
continue;
|
|
53
|
-
if (parsedURL.protocol !== "https:" && parsedURL.hostname
|
|
54
|
+
if (parsedURL.protocol !== "https:" && !isLocalHostname(parsedURL.hostname) && c.secure)
|
|
54
55
|
continue;
|
|
55
56
|
return true;
|
|
56
57
|
}
|
|
57
58
|
return false;
|
|
58
59
|
});
|
|
59
60
|
}
|
|
61
|
+
function isLocalHostname(hostname) {
|
|
62
|
+
return hostname === "localhost" || hostname.endsWith(".localhost");
|
|
63
|
+
}
|
|
60
64
|
const kMaxCookieExpiresDateInSeconds = 253402300799;
|
|
61
65
|
function rewriteCookies(cookies) {
|
|
62
66
|
return cookies.map((c) => {
|
|
@@ -598,6 +602,7 @@ function mergeHeaders(headers) {
|
|
|
598
602
|
Route,
|
|
599
603
|
WebSocket,
|
|
600
604
|
filterCookies,
|
|
605
|
+
isLocalHostname,
|
|
601
606
|
kMaxCookieExpiresDateInSeconds,
|
|
602
607
|
mergeHeaders,
|
|
603
608
|
parseURL,
|
package/lib/server/page.js
CHANGED
|
@@ -321,8 +321,6 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
321
321
|
await this._performWaitForNavigationCheck(progress);
|
|
322
322
|
}
|
|
323
323
|
async _performWaitForNavigationCheck(progress) {
|
|
324
|
-
if (process.env.PLAYWRIGHT_SKIP_NAVIGATION_CHECK)
|
|
325
|
-
return;
|
|
326
324
|
const mainFrame = this.frameManager.mainFrame();
|
|
327
325
|
if (!mainFrame || !mainFrame.pendingDocument())
|
|
328
326
|
return;
|
package/lib/server/playwright.js
CHANGED
|
@@ -35,7 +35,7 @@ var import_instrumentation = require("./instrumentation");
|
|
|
35
35
|
var import_webkit = require("./webkit/webkit");
|
|
36
36
|
class Playwright extends import_instrumentation.SdkObject {
|
|
37
37
|
constructor(options) {
|
|
38
|
-
super(
|
|
38
|
+
super((0, import_instrumentation.createRootSdkObject)(), void 0, "Playwright");
|
|
39
39
|
this._allPages = /* @__PURE__ */ new Set();
|
|
40
40
|
this._allBrowsers = /* @__PURE__ */ new Set();
|
|
41
41
|
this.options = options;
|
package/lib/server/progress.js
CHANGED
|
@@ -29,13 +29,13 @@ class ProgressController {
|
|
|
29
29
|
this._forceAbortPromise = new import_manualPromise.ManualPromise();
|
|
30
30
|
// Cleanups to be run only in the case of abort.
|
|
31
31
|
this._cleanups = [];
|
|
32
|
-
this._logName = "api";
|
|
33
32
|
this._state = "before";
|
|
34
33
|
this._deadline = 0;
|
|
35
34
|
this._timeout = 0;
|
|
36
35
|
this.metadata = metadata;
|
|
37
36
|
this.sdkObject = sdkObject;
|
|
38
37
|
this.instrumentation = sdkObject.instrumentation;
|
|
38
|
+
this._logName = sdkObject.logName || "api";
|
|
39
39
|
this._forceAbortPromise.catch((e) => null);
|
|
40
40
|
}
|
|
41
41
|
setLogName(logName) {
|