From d7042505b368fcfeb6e13038b7cbbdc911baeb7e Mon Sep 17 00:00:00 2001 From: Nikolay Borisenko <22616990+nvborisenko@users.noreply.github.com> Date: Wed, 20 Aug 2025 19:17:15 +0300 Subject: [PATCH] [dotnet] [bidi] Adjust cookie expity type according spec (unix seconds) --- .../webdriver/BiDi/Communication/Broker.cs | 1 - .../Converters/DateTimeOffsetConverter.cs | 15 ++++++- .../Json/Converters/TimeSpanConverter.cs | 44 ------------------- dotnet/src/webdriver/BiDi/Network/Cookie.cs | 4 +- .../BiDi/Storage/SetCookieCommand.cs | 3 ++ .../test/common/BiDi/Storage/StorageTest.cs | 4 +- 6 files changed, 22 insertions(+), 49 deletions(-) delete mode 100644 dotnet/src/webdriver/BiDi/Communication/Json/Converters/TimeSpanConverter.cs diff --git a/dotnet/src/webdriver/BiDi/Communication/Broker.cs b/dotnet/src/webdriver/BiDi/Communication/Broker.cs index f0c0f2c279f91..db2058224749b 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Broker.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Broker.cs @@ -84,7 +84,6 @@ internal Broker(BiDi bidi, Uri url) new RealmConverter(_bidi), new RealmTypeConverter(), new DateTimeOffsetConverter(), - new TimeSpanConverter(), new PrintPageRangeConverter(), new InputOriginConverter(), new WebExtensionConverter(_bidi), diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/DateTimeOffsetConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/DateTimeOffsetConverter.cs index e3b2b57ffe4f4..6d51f829dc7ad 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/DateTimeOffsetConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/DateTimeOffsetConverter.cs @@ -27,7 +27,7 @@ internal class DateTimeOffsetConverter : JsonConverter { public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - return DateTimeOffset.FromUnixTimeMilliseconds(reader.GetInt64()); + return DateTimeOffset.FromUnixTimeMilliseconds((long)reader.GetDouble()); // still might get a double } public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) @@ -35,3 +35,16 @@ public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSeri writer.WriteNumberValue(value.ToUnixTimeMilliseconds()); } } + +internal class DateTimeOffsetSecondsConverter : JsonConverter +{ + public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return DateTimeOffset.FromUnixTimeSeconds((long)reader.GetDouble()); // still might get a double + } + + public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) + { + writer.WriteNumberValue(value.ToUnixTimeSeconds()); + } +} diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/TimeSpanConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/TimeSpanConverter.cs deleted file mode 100644 index 8bb6717f2391c..0000000000000 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/TimeSpanConverter.cs +++ /dev/null @@ -1,44 +0,0 @@ -// -// Licensed to the Software Freedom Conservancy (SFC) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The SFC licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -using System; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace OpenQA.Selenium.BiDi.Communication.Json.Converters; - -internal class TimeSpanConverter : JsonConverter -{ - public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - if (reader.TryGetInt64(out long milliseconds) is false) - { - var doubleValue = reader.GetDouble(); - - milliseconds = Convert.ToInt64(doubleValue); - } - - return TimeSpan.FromMilliseconds(milliseconds); - } - - public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options) - { - writer.WriteNumberValue(value.TotalMilliseconds); - } -} diff --git a/dotnet/src/webdriver/BiDi/Network/Cookie.cs b/dotnet/src/webdriver/BiDi/Network/Cookie.cs index 972e02541f1d8..73671bd808fb6 100644 --- a/dotnet/src/webdriver/BiDi/Network/Cookie.cs +++ b/dotnet/src/webdriver/BiDi/Network/Cookie.cs @@ -17,11 +17,13 @@ // under the License. // +using OpenQA.Selenium.BiDi.Communication.Json.Converters; using System; +using System.Text.Json.Serialization; namespace OpenQA.Selenium.BiDi.Network; -public sealed record Cookie(string Name, BytesValue Value, string Domain, string Path, long Size, bool HttpOnly, bool Secure, SameSite SameSite, TimeSpan? Expiry); +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); public enum SameSite { diff --git a/dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs b/dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs index d8f22a6905e3a..635faa93e381a 100644 --- a/dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs +++ b/dotnet/src/webdriver/BiDi/Storage/SetCookieCommand.cs @@ -18,7 +18,9 @@ // using OpenQA.Selenium.BiDi.Communication; +using OpenQA.Selenium.BiDi.Communication.Json.Converters; using System; +using System.Text.Json.Serialization; namespace OpenQA.Selenium.BiDi.Storage; @@ -37,6 +39,7 @@ public sealed record PartialCookie(string Name, Network.BytesValue Value, string public Network.SameSite? SameSite { get; set; } + [JsonConverter(typeof(DateTimeOffsetSecondsConverter))] public DateTimeOffset? Expiry { get; set; } } diff --git a/dotnet/test/common/BiDi/Storage/StorageTest.cs b/dotnet/test/common/BiDi/Storage/StorageTest.cs index 5857d599af513..7d956e5d6424a 100644 --- a/dotnet/test/common/BiDi/Storage/StorageTest.cs +++ b/dotnet/test/common/BiDi/Storage/StorageTest.cs @@ -81,7 +81,7 @@ public async Task CanAddAndGetCookie() { driver.Url = UrlBuilder.WhereIs("animals"); - var expiry = DateTime.Now.AddDays(1); + var expiry = DateTimeOffset.Now.AddDays(1); await context.Storage.SetCookieAsync(new("fish", "cod", UrlBuilder.HostName) { @@ -106,7 +106,7 @@ await context.Storage.SetCookieAsync(new("fish", "cod", UrlBuilder.HostName) Assert.That(cookie.Secure, Is.False); Assert.That(cookie.SameSite, Is.EqualTo(SameSite.Lax)); Assert.That(cookie.Size, Is.EqualTo(7)); - // Assert.That(cookie.Expiry, Is.EqualTo(expiry)); // chrome issue + Assert.That(cookie.Expiry, Is.EqualTo(expiry).Within(1).Seconds); } [Test]