playwright-core 1.56.0-alpha-2025-09-08 → 1.56.0-alpha-1757456950000

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.
@@ -189,6 +189,12 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
189
189
  userContexts: [this._userContextId()]
190
190
  }));
191
191
  }
192
+ if (this._options.timezoneId) {
193
+ promises.push(this._browser._browserSession.send("emulation.setTimezoneOverride", {
194
+ timezone: this._options.timezoneId,
195
+ userContexts: [this._userContextId()]
196
+ }));
197
+ }
192
198
  await Promise.all(promises);
193
199
  }
194
200
  possiblyUninitializedPages() {
@@ -86,7 +86,7 @@ class BidiChromium extends import_browserType.BrowserType {
86
86
  supportsPipeTransport() {
87
87
  return false;
88
88
  }
89
- defaultArgs(options, isPersistent, userDataDir) {
89
+ async defaultArgs(options, isPersistent, userDataDir) {
90
90
  const chromeArguments = this._innerDefaultArgs(options);
91
91
  chromeArguments.push(`--user-data-dir=${userDataDir}`);
92
92
  chromeArguments.push("--remote-debugging-port=0");
@@ -85,7 +85,7 @@ Workaround: Set the HOME=/root environment variable${process.env.GITHUB_ACTION ?
85
85
  preferences: options.firefoxUserPrefs || {}
86
86
  });
87
87
  }
88
- defaultArgs(options, isPersistent, userDataDir) {
88
+ async defaultArgs(options, isPersistent, userDataDir) {
89
89
  const { args = [], headless } = options;
90
90
  const userDataDirArg = args.find((arg) => arg.startsWith("-profile") || arg.startsWith("--profile"));
91
91
  if (userDataDirArg)
@@ -148,7 +148,7 @@ class BidiNetworkManager {
148
148
  _onAuthRequired(params) {
149
149
  const isBasic = params.response.authChallenges?.some((challenge) => challenge.scheme.startsWith("Basic"));
150
150
  const credentials = this._page.browserContext._options.httpCredentials;
151
- if (isBasic && credentials) {
151
+ if (isBasic && credentials && (!credentials.origin || new URL(params.request.url).origin.toLowerCase() === credentials.origin.toLowerCase())) {
152
152
  if (this._attemptedAuthentications.has(params.request.request)) {
153
153
  this._session.sendMayFail("network.continueWithAuth", {
154
154
  request: params.request.request,
@@ -169,7 +169,7 @@ class BidiNetworkManager {
169
169
  } else {
170
170
  this._session.sendMayFail("network.continueWithAuth", {
171
171
  request: params.request.request,
172
- action: "default"
172
+ action: "cancel"
173
173
  });
174
174
  }
175
175
  }
@@ -222,7 +222,7 @@ class BidiRequest {
222
222
  redirectedFrom ? redirectedFrom.request : null,
223
223
  payload.navigation ?? void 0,
224
224
  payload.request.url,
225
- "other",
225
+ resourceTypeFromBidi(payload.request.destination, payload.request.initiatorType, payload.initiator?.type),
226
226
  payload.request.method,
227
227
  postDataBuffer,
228
228
  fromBidiHeaders(payload.request.headers)
@@ -323,6 +323,57 @@ function toBidiSameSite(sameSite) {
323
323
  return bidi.Network.SameSite.Lax;
324
324
  return bidi.Network.SameSite.None;
325
325
  }
326
+ function resourceTypeFromBidi(requestDestination, requestInitiatorType, eventInitiatorType) {
327
+ switch (requestDestination) {
328
+ case "audio":
329
+ return "media";
330
+ case "audioworklet":
331
+ return "script";
332
+ case "document":
333
+ return "document";
334
+ case "font":
335
+ return "font";
336
+ case "frame":
337
+ return "document";
338
+ case "iframe":
339
+ return "document";
340
+ case "image":
341
+ return "image";
342
+ case "object":
343
+ return "object";
344
+ case "paintworklet":
345
+ return "script";
346
+ case "script":
347
+ return "script";
348
+ case "serviceworker":
349
+ return "script";
350
+ case "sharedworker":
351
+ return "script";
352
+ case "style":
353
+ return "stylesheet";
354
+ case "track":
355
+ return "texttrack";
356
+ case "video":
357
+ return "media";
358
+ case "worker":
359
+ return "script";
360
+ case "":
361
+ switch (requestInitiatorType) {
362
+ case "fetch":
363
+ return "fetch";
364
+ case "font":
365
+ return "font";
366
+ case "xmlhttprequest":
367
+ return "xhr";
368
+ case null:
369
+ return eventInitiatorType === "script" ? "xhr" : "document";
370
+ default:
371
+ return "other";
372
+ }
373
+ default:
374
+ return "other";
375
+ }
376
+ }
326
377
  // Annotate the CommonJS export names for ESM import in node:
327
378
  0 && (module.exports = {
328
379
  BidiNetworkManager,
@@ -36,6 +36,7 @@ var import_eventsHelper = require("../utils/eventsHelper");
36
36
  var dialog = __toESM(require("../dialog"));
37
37
  var dom = __toESM(require("../dom"));
38
38
  var import_page = require("../page");
39
+ var import_bidiBrowser = require("./bidiBrowser");
39
40
  var import_bidiExecutionContext = require("./bidiExecutionContext");
40
41
  var import_bidiInput = require("./bidiInput");
41
42
  var import_bidiNetworkManager = require("./bidiNetworkManager");
@@ -70,6 +71,8 @@ class BidiPage {
70
71
  import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.historyUpdated", this._onHistoryUpdated.bind(this)),
71
72
  import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.domContentLoaded", this._onDomContentLoaded.bind(this)),
72
73
  import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.load", this._onLoad.bind(this)),
74
+ import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.downloadWillBegin", this._onDownloadWillBegin.bind(this)),
75
+ import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.downloadEnd", this._onDownloadEnded.bind(this)),
73
76
  import_eventsHelper.eventsHelper.addEventListener(bidiSession, "browsingContext.userPromptOpened", this._onUserPromptOpened.bind(this)),
74
77
  import_eventsHelper.eventsHelper.addEventListener(bidiSession, "log.entryAdded", this._onLogEntryAdded.bind(this))
75
78
  ];
@@ -198,7 +201,42 @@ class BidiPage {
198
201
  event.defaultValue
199
202
  ));
200
203
  }
204
+ _onDownloadWillBegin(event) {
205
+ if (!event.navigation)
206
+ return;
207
+ let originPage = this._page.initializedOrUndefined();
208
+ if (!originPage && this._opener)
209
+ originPage = this._opener._page.initializedOrUndefined();
210
+ if (!originPage)
211
+ return;
212
+ this._browserContext._browser._downloadCreated(originPage, event.navigation, event.url, event.suggestedFilename);
213
+ }
214
+ _onDownloadEnded(event) {
215
+ if (!event.navigation)
216
+ return;
217
+ this._browserContext._browser._downloadFinished(event.navigation, event.status === "canceled" ? "canceled" : void 0);
218
+ }
201
219
  _onLogEntryAdded(params) {
220
+ if (params.type === "javascript" && params.level === "error") {
221
+ let errorName = "";
222
+ let errorMessage;
223
+ if (params.text?.includes(": ")) {
224
+ const index = params.text.indexOf(": ");
225
+ errorName = params.text.substring(0, index);
226
+ errorMessage = params.text.substring(index + 2);
227
+ } else {
228
+ errorMessage = params.text ?? void 0;
229
+ }
230
+ const error = new Error(errorMessage);
231
+ error.name = errorName;
232
+ error.stack = `${params.text}
233
+ ${params.stackTrace?.callFrames.map((f) => {
234
+ const location2 = `${f.url}:${f.lineNumber + 1}:${f.columnNumber + 1}`;
235
+ return f.functionName ? ` at ${f.functionName} (${location2})` : ` at ${location2}`;
236
+ }).join("\n")}`;
237
+ this._page.emitOnContextOnceInitialized(import_bidiBrowser.BidiBrowserContext.Events.PageError, error, this._page);
238
+ return;
239
+ }
202
240
  if (params.type !== "console")
203
241
  return;
204
242
  const entry = params;
@@ -169,9 +169,9 @@ class BrowserType extends import_instrumentation.SdkObject {
169
169
  if (ignoreAllDefaultArgs)
170
170
  browserArguments.push(...args);
171
171
  else if (ignoreDefaultArgs)
172
- browserArguments.push(...this.defaultArgs(options, isPersistent, userDataDir).filter((arg) => ignoreDefaultArgs.indexOf(arg) === -1));
172
+ browserArguments.push(...(await this.defaultArgs(options, isPersistent, userDataDir)).filter((arg) => ignoreDefaultArgs.indexOf(arg) === -1));
173
173
  else
174
- browserArguments.push(...this.defaultArgs(options, isPersistent, userDataDir));
174
+ browserArguments.push(...await this.defaultArgs(options, isPersistent, userDataDir));
175
175
  let executable;
176
176
  if (executablePath) {
177
177
  if (!await (0, import_fileUtils.existsAsync)(executablePath))
@@ -200,7 +200,7 @@ class BrowserType extends import_instrumentation.SdkObject {
200
200
  const { launchedProcess, gracefullyClose, kill } = await (0, import_processLauncher.launchProcess)({
201
201
  command: prepared.executable,
202
202
  args: prepared.browserArguments,
203
- env: this.amendEnvironment(env, prepared.userDataDir, isPersistent),
203
+ env: this.amendEnvironment(env, prepared.userDataDir, isPersistent, options),
204
204
  handleSIGINT,
205
205
  handleSIGTERM,
206
206
  handleSIGHUP,
@@ -250,7 +250,7 @@ class Chromium extends import_browserType.BrowserType {
250
250
  throw e;
251
251
  }
252
252
  }
253
- defaultArgs(options, isPersistent, userDataDir) {
253
+ async defaultArgs(options, isPersistent, userDataDir) {
254
254
  const chromeArguments = this._innerDefaultArgs(options);
255
255
  chromeArguments.push(`--user-data-dir=${userDataDir}`);
256
256
  if (options.cdpPort !== void 0)