diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetClientWindowsResultConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetClientWindowsResultConverter.cs index e3bee0238a8e1..f3184aaa607da 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetClientWindowsResultConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetClientWindowsResultConverter.cs @@ -17,6 +17,7 @@ // under the License. // +using OpenQA.Selenium.BiDi.Communication.Json.Internal; using OpenQA.Selenium.BiDi.Modules.Browser; using System; using System.Collections.Generic; @@ -30,7 +31,7 @@ internal class GetClientWindowsResultConverter : JsonConverter>(options); + var clientWindows = doc.RootElement.GetProperty("clientWindows").Deserialize(options.GetTypeInfo>()); return new GetClientWindowsResult(clientWindows!); } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetCookiesResultConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetCookiesResultConverter.cs index 48c4fcd83f75d..eb5944eb1719c 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetCookiesResultConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetCookiesResultConverter.cs @@ -17,11 +17,13 @@ // under the License. // +using OpenQA.Selenium.BiDi.Communication.Json.Internal; using OpenQA.Selenium.BiDi.Modules.Storage; using System; using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; +using System.Text.Json.Serialization.Metadata; namespace OpenQA.Selenium.BiDi.Communication.Json.Converters.Enumerable; @@ -30,8 +32,8 @@ internal class GetCookiesResultConverter : JsonConverter public override GetCookiesResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var doc = JsonDocument.ParseValue(ref reader); - var cookies = doc.RootElement.GetProperty("cookies").Deserialize>(options); - var partitionKey = doc.RootElement.GetProperty("partitionKey").Deserialize(options); + var cookies = doc.RootElement.GetProperty("cookies").Deserialize(options.GetTypeInfo>()); + var partitionKey = doc.RootElement.GetProperty("partitionKey").Deserialize((JsonTypeInfo)options.GetTypeInfo(typeof(PartitionKey))); return new GetCookiesResult(cookies!, partitionKey!); } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetRealmsResultConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetRealmsResultConverter.cs index 069628d4f0776..2759ba6ba6b7f 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetRealmsResultConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetRealmsResultConverter.cs @@ -17,6 +17,7 @@ // under the License. // +using OpenQA.Selenium.BiDi.Communication.Json.Internal; using OpenQA.Selenium.BiDi.Modules.Script; using System; using System.Collections.Generic; @@ -30,7 +31,7 @@ internal class GetRealmsResultConverter : JsonConverter public override GetRealmsResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var doc = JsonDocument.ParseValue(ref reader); - var realms = doc.RootElement.GetProperty("realms").Deserialize>(options); + var realms = doc.RootElement.GetProperty("realms").Deserialize(options.GetTypeInfo>()); return new GetRealmsResult(realms!); } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetUserContextsResultConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetUserContextsResultConverter.cs index 02b22c2e82a02..55b533e877518 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetUserContextsResultConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetUserContextsResultConverter.cs @@ -17,6 +17,7 @@ // under the License. // +using OpenQA.Selenium.BiDi.Communication.Json.Internal; using OpenQA.Selenium.BiDi.Modules.Browser; using System; using System.Collections.Generic; @@ -30,7 +31,7 @@ internal class GetUserContextsResultConverter : JsonConverter>(options); + var userContexts = doc.RootElement.GetProperty("userContexts").Deserialize(options.GetTypeInfo>()); return new GetUserContextsResult(userContexts!); } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/InputSourceActionsConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/InputSourceActionsConverter.cs index f66ff5e9c6ed9..478cdf423cb50 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/InputSourceActionsConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/InputSourceActionsConverter.cs @@ -17,8 +17,10 @@ // under the License. // +using OpenQA.Selenium.BiDi.Communication.Json.Internal; using OpenQA.Selenium.BiDi.Modules.Input; using System; +using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; @@ -43,7 +45,7 @@ public override void Write(Utf8JsonWriter writer, SourceActions value, JsonSeria case KeyActions keys: writer.WriteString("type", "key"); writer.WritePropertyName("actions"); - JsonSerializer.Serialize(writer, keys.Actions.Select(a => a as IKeySourceAction), options); + JsonSerializer.Serialize(writer, keys.Actions.Select(a => a as IKeySourceAction), options.GetTypeInfo>()); break; case PointerActions pointers: @@ -51,23 +53,23 @@ public override void Write(Utf8JsonWriter writer, SourceActions value, JsonSeria if (pointers.Options is not null) { writer.WritePropertyName("parameters"); - JsonSerializer.Serialize(writer, pointers.Options, options); + JsonSerializer.Serialize(writer, pointers.Options, options.GetTypeInfo(typeof(PointerParameters))); } writer.WritePropertyName("actions"); - JsonSerializer.Serialize(writer, pointers.Actions.Select(a => a as IPointerSourceAction), options); + JsonSerializer.Serialize(writer, pointers.Actions.Select(a => a as IPointerSourceAction), options.GetTypeInfo>()); break; case WheelActions wheels: writer.WriteString("type", "wheel"); writer.WritePropertyName("actions"); - JsonSerializer.Serialize(writer, wheels.Actions.Select(a => a as IWheelSourceAction), options); + JsonSerializer.Serialize(writer, wheels.Actions.Select(a => a as IWheelSourceAction), options.GetTypeInfo>()); break; case NoneActions none: writer.WriteString("type", "none"); writer.WritePropertyName("actions"); - JsonSerializer.Serialize(writer, none.Actions.Select(a => a as INoneSourceAction), options); + JsonSerializer.Serialize(writer, none.Actions.Select(a => a as INoneSourceAction), options.GetTypeInfo>()); break; } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/LocateNodesResultConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/LocateNodesResultConverter.cs index 4bc7af14acf4a..36afde9ef7094 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/LocateNodesResultConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/LocateNodesResultConverter.cs @@ -17,6 +17,7 @@ // under the License. // +using OpenQA.Selenium.BiDi.Communication.Json.Internal; using OpenQA.Selenium.BiDi.Modules.BrowsingContext; using OpenQA.Selenium.BiDi.Modules.Script; using System; @@ -31,7 +32,7 @@ internal class LocateNodesResultConverter : JsonConverter public override LocateNodesResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var doc = JsonDocument.ParseValue(ref reader); - var nodes = doc.RootElement.GetProperty("nodes").Deserialize>(options); + var nodes = doc.RootElement.GetProperty("nodes").Deserialize(options.GetTypeInfo>()); return new LocateNodesResult(nodes!); } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/InputOriginConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/InputOriginConverter.cs index 2f98250659e9b..9ff3a88973670 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/InputOriginConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/InputOriginConverter.cs @@ -19,11 +19,14 @@ using OpenQA.Selenium.BiDi.Modules.Input; using System; +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; namespace OpenQA.Selenium.BiDi.Communication.Json.Converters; +[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Json serializer options should have AOT-safe type resolution")] +[UnconditionalSuppressMessage("AOT", "IL3050", Justification = "Json serializer options should have AOT-safe type resolution")] internal class InputOriginConverter : JsonConverter { public override Origin Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/EvaluateResultConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/EvaluateResultConverter.cs index 6a03de48ebd3f..81da2edda5a2b 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/EvaluateResultConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/EvaluateResultConverter.cs @@ -32,8 +32,8 @@ internal class EvaluateResultConverter : JsonConverter { return reader.GetDiscriminator("type") switch { - "success" => JsonSerializer.Deserialize(ref reader, options), - "exception" => JsonSerializer.Deserialize(ref reader, options), + "success" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "exception" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), _ => null, }; } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/LogEntryConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/LogEntryConverter.cs index 07bbbcd4221e3..17c917d3cd82a 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/LogEntryConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/LogEntryConverter.cs @@ -32,8 +32,8 @@ internal class LogEntryConverter : JsonConverter { return reader.GetDiscriminator("type") switch { - "console" => JsonSerializer.Deserialize(ref reader, options), - "javascript" => JsonSerializer.Deserialize(ref reader, options), + "console" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "javascript" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), _ => null, }; } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RealmInfoConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RealmInfoConverter.cs index 443d42331d1bc..635e2eb79864c 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RealmInfoConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RealmInfoConverter.cs @@ -32,14 +32,14 @@ internal class RealmInfoConverter : JsonConverter { return reader.GetDiscriminator("type") switch { - "window" => JsonSerializer.Deserialize(ref reader, options), - "dedicated-worker" => JsonSerializer.Deserialize(ref reader, options), - "shared-worker" => JsonSerializer.Deserialize(ref reader, options), - "service-worker" => JsonSerializer.Deserialize(ref reader, options), - "worker" => JsonSerializer.Deserialize(ref reader, options), - "paint-worklet" => JsonSerializer.Deserialize(ref reader, options), - "audio-worklet" => JsonSerializer.Deserialize(ref reader, options), - "worklet" => JsonSerializer.Deserialize(ref reader, options), + "window" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "dedicated-worker" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "shared-worker" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "service-worker" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "worker" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "paint-worklet" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "audio-worklet" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "worklet" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), _ => null, }; } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RemoteValueConverter.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RemoteValueConverter.cs index 87adb82269d52..2daacdf987e4c 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RemoteValueConverter.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RemoteValueConverter.cs @@ -37,32 +37,32 @@ internal class RemoteValueConverter : JsonConverter return reader.GetDiscriminator("type") switch { - "number" => JsonSerializer.Deserialize(ref reader, options), - "boolean" => JsonSerializer.Deserialize(ref reader, options), - "bigint" => JsonSerializer.Deserialize(ref reader, options), - "string" => JsonSerializer.Deserialize(ref reader, options), - "null" => JsonSerializer.Deserialize(ref reader, options), - "undefined" => JsonSerializer.Deserialize(ref reader, options), - "symbol" => JsonSerializer.Deserialize(ref reader, options), - "array" => JsonSerializer.Deserialize(ref reader, options), - "object" => JsonSerializer.Deserialize(ref reader, options), - "function" => JsonSerializer.Deserialize(ref reader, options), - "regexp" => JsonSerializer.Deserialize(ref reader, options), - "date" => JsonSerializer.Deserialize(ref reader, options), - "map" => JsonSerializer.Deserialize(ref reader, options), - "set" => JsonSerializer.Deserialize(ref reader, options), - "weakmap" => JsonSerializer.Deserialize(ref reader, options), - "weakset" => JsonSerializer.Deserialize(ref reader, options), - "generator" => JsonSerializer.Deserialize(ref reader, options), - "error" => JsonSerializer.Deserialize(ref reader, options), - "proxy" => JsonSerializer.Deserialize(ref reader, options), - "promise" => JsonSerializer.Deserialize(ref reader, options), - "typedarray" => JsonSerializer.Deserialize(ref reader, options), - "arraybuffer" => JsonSerializer.Deserialize(ref reader, options), - "nodelist" => JsonSerializer.Deserialize(ref reader, options), - "htmlcollection" => JsonSerializer.Deserialize(ref reader, options), - "node" => JsonSerializer.Deserialize(ref reader, options), - "window" => JsonSerializer.Deserialize(ref reader, options), + "number" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "boolean" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "bigint" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "string" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "null" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "undefined" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "symbol" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "array" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "object" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "function" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "regexp" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "date" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "map" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "set" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "weakmap" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "weakset" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "generator" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "error" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "proxy" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "promise" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "typedarray" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "arraybuffer" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "nodelist" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "htmlcollection" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "node" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), + "window" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo()), _ => null, }; } diff --git a/dotnet/src/webdriver/BiDi/Communication/Json/Internal/JsonExtensions.cs b/dotnet/src/webdriver/BiDi/Communication/Json/Internal/JsonExtensions.cs index 812416dc02e95..95bc5ad4915e3 100644 --- a/dotnet/src/webdriver/BiDi/Communication/Json/Internal/JsonExtensions.cs +++ b/dotnet/src/webdriver/BiDi/Communication/Json/Internal/JsonExtensions.cs @@ -18,6 +18,7 @@ // using System.Text.Json; +using System.Text.Json.Serialization.Metadata; namespace OpenQA.Selenium.BiDi.Communication.Json.Internal; @@ -51,4 +52,9 @@ public static string GetDiscriminator(this ref Utf8JsonReader reader, string nam return discriminator ?? throw new JsonException($"Couldn't determine '{name}' discriminator."); } + + public static JsonTypeInfo GetTypeInfo(this JsonSerializerOptions options) + { + return (JsonTypeInfo)options.GetTypeInfo(typeof(T)); + } }