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.
Files changed (32) hide show
  1. package/browsers.json +1 -1
  2. package/lib/client/playwright.js +0 -1
  3. package/lib/generated/injectedScriptSource.js +1 -1
  4. package/lib/server/android/backendAdb.js +0 -2
  5. package/lib/server/browserType.js +1 -2
  6. package/lib/server/chromium/chromium.js +0 -1
  7. package/lib/server/chromium/crBrowser.js +1 -1
  8. package/lib/server/chromium/crConnection.js +8 -9
  9. package/lib/server/cookieStore.js +1 -1
  10. package/lib/server/dispatchers/androidDispatcher.js +20 -1
  11. package/lib/server/dispatchers/dispatcher.js +12 -14
  12. package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
  13. package/lib/server/dispatchers/localUtilsDispatcher.js +1 -1
  14. package/lib/server/dispatchers/pageDispatcher.js +2 -2
  15. package/lib/server/dispatchers/playwrightDispatcher.js +4 -4
  16. package/lib/server/dispatchers/streamDispatcher.js +8 -2
  17. package/lib/server/dispatchers/webSocketRouteDispatcher.js +2 -2
  18. package/lib/server/dispatchers/writableStreamDispatcher.js +11 -5
  19. package/lib/server/electron/electron.js +1 -1
  20. package/lib/server/instrumentation.js +8 -0
  21. package/lib/server/network.js +6 -1
  22. package/lib/server/page.js +0 -2
  23. package/lib/server/playwright.js +1 -1
  24. package/lib/server/progress.js +1 -1
  25. package/lib/vite/htmlReport/index.html +11 -11
  26. package/lib/vite/traceViewer/assets/{codeMirrorModule-CyR9bMT4.js → codeMirrorModule-BKr-mZ2D.js} +1 -1
  27. package/lib/vite/traceViewer/assets/{defaultSettingsView-BvdMUV2f.js → defaultSettingsView-CzQxXsO4.js} +39 -39
  28. package/lib/vite/traceViewer/{index.Bk7V5SPV.js → index.BT-45kLv.js} +1 -1
  29. package/lib/vite/traceViewer/index.html +2 -2
  30. package/lib/vite/traceViewer/{uiMode.Dte67t43.js → uiMode.BuGgfvGl.js} +1 -1
  31. package/lib/vite/traceViewer/uiMode.html +2 -2
  32. 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 import_events.EventEmitter {
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 import_events.EventEmitter {
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 import_events.EventEmitter {
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 !== "localhost"))
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, { guid: "" }, "Root", {});
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 instanceof import_instrumentation.SdkObject ? dispatcher._object : void 0;
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?.guid,
270
- pageId: sdkObject?.attribution?.page?.guid,
271
- frameId: sdkObject?.attribution?.frame?.guid,
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 (sdkObject && params?.info?.waitId) {
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?.instrumentation.onBeforeCall(sdkObject, callMetadata);
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) && sdkObject) {
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
- const reason = sdkObject ? closeReason(sdkObject) : void 0;
321
- e = new import_errors.TargetClosedError(reason, e.browserLogMessage());
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?.instrumentation.onAfterCall(sdkObject, callMetadata);
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 import_crypto = require("../utils/crypto");
25
+ var import_instrumentation = require("../instrumentation");
26
26
  class JsonPipeDispatcher extends import_dispatcher.Dispatcher {
27
27
  constructor(scope) {
28
- super(scope, { guid: "jsonPipe@" + (0, import_crypto.createGuid)() }, "JsonPipe", {});
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 import_crypto = require("../utils/crypto");
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, { guid: "bindingCall@" + (0, import_crypto.createGuid)() }, "BindingCall", {
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 import_crypto = require("../utils/crypto");
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, { guid: "socksSupport@" + (0, import_crypto.createGuid)() }, "SocksSupport", {});
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 import_crypto = require("../utils/crypto");
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, { guid: "stream@" + (0, import_crypto.createGuid)(), stream }, "Stream", {});
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 import_crypto = require("../utils/crypto");
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, { guid: "webSocketRoute@" + (0, import_crypto.createGuid)() }, "WebSocketRoute", { url });
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 import_crypto = require("../utils/crypto");
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, { guid: "writableStream@" + (0, import_crypto.createGuid)(), streamOrDirectory }, "WritableStream", {});
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._lastModifiedMs)
62
- await import_fs.default.promises.utimes(this.path(), new Date(this._lastModifiedMs), new Date(this._lastModifiedMs));
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
  });
@@ -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 !== "localhost" && c.secure)
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,
@@ -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;
@@ -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({ attribution: {}, instrumentation: (0, import_instrumentation.createInstrumentation)() }, void 0, "Playwright");
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;
@@ -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) {