Skip to content

Commit 2da2618

Browse files
authored
Merge branch 'trunk' into switch-to-sys-platform
2 parents 73d50a9 + 83cb4d6 commit 2da2618

File tree

8 files changed

+41
-57
lines changed

8 files changed

+41
-57
lines changed

dotnet/src/webdriver/BiDi/Communication/Broker.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ internal Broker(BiDi bidi, Uri url)
8484
new RealmConverter(_bidi),
8585
new RealmTypeConverter(),
8686
new DateTimeOffsetConverter(),
87-
new TimeSpanConverter(),
8887
new PrintPageRangeConverter(),
8988
new InputOriginConverter(),
9089
new WebExtensionConverter(_bidi),

dotnet/src/webdriver/BiDi/Communication/Json/Converters/DateTimeOffsetConverter.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,24 @@ internal class DateTimeOffsetConverter : JsonConverter<DateTimeOffset>
2727
{
2828
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
2929
{
30-
return DateTimeOffset.FromUnixTimeMilliseconds(reader.GetInt64());
30+
return DateTimeOffset.FromUnixTimeMilliseconds((long)reader.GetDouble()); // still might get a double
3131
}
3232

3333
public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
3434
{
3535
writer.WriteNumberValue(value.ToUnixTimeMilliseconds());
3636
}
3737
}
38+
39+
internal class DateTimeOffsetSecondsConverter : JsonConverter<DateTimeOffset>
40+
{
41+
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
42+
{
43+
return DateTimeOffset.FromUnixTimeSeconds((long)reader.GetDouble()); // still might get a double
44+
}
45+
46+
public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
47+
{
48+
writer.WriteNumberValue(value.ToUnixTimeSeconds());
49+
}
50+
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/TimeSpanConverter.cs

Lines changed: 0 additions & 44 deletions
This file was deleted.

dotnet/src/webdriver/BiDi/Network/Cookie.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
// under the License.
1818
// </copyright>
1919

20+
using OpenQA.Selenium.BiDi.Communication.Json.Converters;
2021
using System;
22+
using System.Text.Json.Serialization;
2123

2224
namespace OpenQA.Selenium.BiDi.Network;
2325

24-
public sealed record Cookie(string Name, BytesValue Value, string Domain, string Path, long Size, bool HttpOnly, bool Secure, SameSite SameSite, TimeSpan? Expiry);
26+
public sealed record Cookie(string Name, BytesValue Value, string Domain, string Path, long Size, bool HttpOnly, bool Secure, SameSite SameSite, [property: JsonConverter(typeof(DateTimeOffsetSecondsConverter))] DateTimeOffset? Expiry);
2527

2628
public enum SameSite
2729
{

dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
// </copyright>
1919

2020
using OpenQA.Selenium.BiDi.Communication;
21+
using OpenQA.Selenium.BiDi.Communication.Json.Converters;
2122
using System;
23+
using System.Text.Json.Serialization;
2224

2325
namespace OpenQA.Selenium.BiDi.Storage;
2426

@@ -37,6 +39,7 @@ public sealed record PartialCookie(string Name, Network.BytesValue Value, string
3739

3840
public Network.SameSite? SameSite { get; set; }
3941

42+
[JsonConverter(typeof(DateTimeOffsetSecondsConverter))]
4043
public DateTimeOffset? Expiry { get; set; }
4144
}
4245

dotnet/src/webdriver/Internal/PortUtilities.cs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,23 @@ public static class PortUtilities
3030
/// <summary>
3131
/// Finds a random, free port to be listened on.
3232
/// </summary>
33+
/// <remarks>
34+
/// Prefers IPv4, but falls back to IPv6 if necessary.
35+
/// </remarks>
3336
/// <returns>A random, free port to be listened on.</returns>
3437
public static int FindFreePort()
3538
{
36-
using var socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
37-
socket.DualMode = true;
38-
socket.Bind(new IPEndPoint(IPAddress.IPv6Loopback, 0));
39-
return (socket.LocalEndPoint as IPEndPoint)!.Port;
40-
39+
try
40+
{
41+
using var ipV4socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
42+
ipV4socket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
43+
return ((IPEndPoint)ipV4socket.LocalEndPoint!).Port;
44+
}
45+
catch (SocketException)
46+
{
47+
using var ipV6socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
48+
ipV6socket.Bind(new IPEndPoint(IPAddress.IPv6Loopback, 0));
49+
return ((IPEndPoint)ipV6socket.LocalEndPoint!).Port;
50+
}
4151
}
4252
}

dotnet/test/common/BiDi/Storage/StorageTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public async Task CanAddAndGetCookie()
8181
{
8282
driver.Url = UrlBuilder.WhereIs("animals");
8383

84-
var expiry = DateTime.Now.AddDays(1);
84+
var expiry = DateTimeOffset.Now.AddDays(1);
8585

8686
await context.Storage.SetCookieAsync(new("fish", "cod", UrlBuilder.HostName)
8787
{
@@ -106,7 +106,7 @@ await context.Storage.SetCookieAsync(new("fish", "cod", UrlBuilder.HostName)
106106
Assert.That(cookie.Secure, Is.False);
107107
Assert.That(cookie.SameSite, Is.EqualTo(SameSite.Lax));
108108
Assert.That(cookie.Size, Is.EqualTo(7));
109-
// Assert.That(cookie.Expiry, Is.EqualTo(expiry)); // chrome issue
109+
Assert.That(cookie.Expiry, Is.EqualTo(expiry).Within(1).Seconds);
110110
}
111111

112112
[Test]

py/selenium/webdriver/common/service.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,15 @@ def __init__(
5757
driver_path_env_key: Optional[str] = None,
5858
**kwargs,
5959
) -> None:
60+
self.log_output: Optional[Union[int, IOBase]]
6061
if isinstance(log_output, str):
6162
self.log_output = cast(IOBase, open(log_output, "a+", encoding="utf-8"))
6263
elif log_output == subprocess.STDOUT:
63-
self.log_output = cast(Optional[Union[int, IOBase]], None)
64+
self.log_output = None
6465
elif log_output is None or log_output == subprocess.DEVNULL:
65-
self.log_output = cast(Optional[Union[int, IOBase]], subprocess.DEVNULL)
66+
self.log_output = subprocess.DEVNULL
6667
else:
67-
self.log_output = log_output
68+
self.log_output = cast(Union[int, IOBase], log_output)
6869

6970
self.port = port or utils.free_port()
7071
# Default value for every python subprocess: subprocess.Popen(..., creationflags=0)

0 commit comments

Comments
 (0)