Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions lib/PuppeteerSharp.Tests/CookiesTests/CookiesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,43 @@ public async Task ShouldProperlyReportLaxSameSiteCookie()
Assert.That(cookies[0].SameSite, Is.EqualTo(SameSite.Lax));
}

[Test, PuppeteerTest("cookies.spec", "Cookie specs Page.cookies", "should properly report \"Default\" sameSite cookie")]
public async Task ShouldProperlyReportDefaultSameSiteCookie()
{
await Page.GoToAsync(TestConstants.EmptyPage);
await Page.SetCookieAsync(new CookieParam
{
Name = "a",
Value = "b",
SameSite = SameSite.Default,
});
var cookies = await Page.GetCookiesAsync();
Assert.That(cookies, Has.Exactly(1).Items);
Assert.That(cookies[0].Name, Is.EqualTo("a"));

// Different browsers have different sameSite values for the "Default" sameSite.
Assert.That(
new SameSite?[] { SameSite.Default, SameSite.Lax, null },
Does.Contain(cookies[0].SameSite));
}

[Test, PuppeteerTest("cookies.spec", "Cookie specs Page.cookies", "should report \"Default\" sameSite cookie when not specified")]
public async Task ShouldReportDefaultSameSiteCookieWhenNotSpecified()
{
Server.SetRoute("/empty.html", context =>
{
context.Response.Headers["Set-Cookie"] = "a=b";
return Task.CompletedTask;
});
await Page.GoToAsync(TestConstants.EmptyPage);
var cookies = await Page.GetCookiesAsync();
Assert.That(cookies, Has.Exactly(1).Items);
if (!TestConstants.IsChrome && !PuppeteerTestAttribute.IsCdp)
{
Assert.That(cookies[0].SameSite, Is.EqualTo(SameSite.Default));
}
}

[Test, PuppeteerTest("cookies.spec", "Cookie specs Page.cookies", "should get multiple cookies")]
public async Task ShouldGetMultipleCookies()
{
Expand Down
16 changes: 16 additions & 0 deletions lib/PuppeteerSharp.Tests/CookiesTests/SetCookiesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,22 @@ await page.SetCookieAsync(new CookieParam
Assert.That(cookie.PartitionKey, Is.EqualTo(key));
}

[Test, PuppeteerTest("cookies.spec", "Cookie specs Page.setCookie", "should be able to delete \"Default\" sameSite cookie")]
public async Task ShouldBeAbleToDeleteDefaultSameSiteCookie()
{
await Page.GoToAsync(TestConstants.EmptyPage);
await Page.SetCookieAsync(new CookieParam
{
Name = "a",
Value = "b",
SameSite = SameSite.Default,
});
var cookies = await Page.GetCookiesAsync();
Assert.That(cookies.Any(c => c.Name == "a"), Is.True);
await Page.DeleteCookieAsync(cookies);
Assert.That(await Page.GetCookiesAsync(), Is.Empty);
}

[Test, PuppeteerTest("cookies.spec", "Cookie specs Page.setCookie", "should not set a cookie on a blank page")]
public async Task ShouldNotSetACookieOnABlankPage()
{
Expand Down
5 changes: 3 additions & 2 deletions lib/PuppeteerSharp/Bidi/BidiCookieHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ private static SameSite ConvertSameSiteBidiToPuppeteer(CookieSameSiteValue sameS
{
CookieSameSiteValue.Strict => SameSite.Strict,
CookieSameSiteValue.Lax => SameSite.Lax,
_ => SameSite.None,
CookieSameSiteValue.None => SameSite.None,
_ => SameSite.Default,
};
}

Expand All @@ -189,7 +190,7 @@ private static SameSite ConvertSameSiteBidiToPuppeteer(CookieSameSiteValue sameS
SameSite.Strict => CookieSameSiteValue.Strict,
SameSite.Lax => CookieSameSiteValue.Lax,
SameSite.None => CookieSameSiteValue.None,
_ => null,
_ => CookieSameSiteValue.Default,
};
}

Expand Down
18 changes: 18 additions & 0 deletions lib/PuppeteerSharp/Cdp/CdpPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,11 @@ public override async Task SetCookieAsync(params CookieParam[] cookies)

if (cookies.Length > 0)
{
foreach (var cookie in cookies)
{
cookie.SameSite = ConvertSameSiteForCdp(cookie.SameSite);
}

await PrimaryTargetClient
.SendAsync("Network.setCookies", new NetworkSetCookiesRequest { Cookies = cookies, })
.ConfigureAwait(false);
Expand Down Expand Up @@ -987,6 +992,19 @@ protected override async Task<string> PerformScreenshotAsync(ScreenshotType type
_ => null,
};

/// <summary>
/// Converts a PuppeteerSharp SameSite value to a CDP-compatible value.
/// CDP does not support "Default", so we map it to null (omitted).
/// </summary>
private static SameSite? ConvertSameSiteForCdp(SameSite? sameSite)
{
return sameSite switch
{
SameSite.Strict or SameSite.Lax or SameSite.None => sameSite,
_ => null,
};
}

private void SetupPrimaryTargetListeners()
{
PrimaryTargetClient.Ready += OnAttachedToTarget;
Expand Down
5 changes: 5 additions & 0 deletions lib/PuppeteerSharp/SameSite.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,10 @@ public enum SameSite
/// Extended.
/// </summary>
Extended,

/// <summary>
/// Default. The browser applies its default SameSite behavior.
/// </summary>
Default,
}
}
Loading