Skip to content

Commit 9935e51

Browse files
[dotnet] [bidi] Address BiDi's JSON converter AOT warnings (SeleniumHQ#15390)
Co-authored-by: Nikolay Borisenko <[email protected]>
1 parent 55d0708 commit 9935e51

12 files changed

+66
-49
lines changed

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetClientWindowsResultConverter.cs

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

20+
using OpenQA.Selenium.BiDi.Communication.Json.Internal;
2021
using OpenQA.Selenium.BiDi.Modules.Browser;
2122
using System;
2223
using System.Collections.Generic;
@@ -30,7 +31,7 @@ internal class GetClientWindowsResultConverter : JsonConverter<GetClientWindowsR
3031
public override GetClientWindowsResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
3132
{
3233
using var doc = JsonDocument.ParseValue(ref reader);
33-
var clientWindows = doc.RootElement.GetProperty("clientWindows").Deserialize<IReadOnlyList<ClientWindowInfo>>(options);
34+
var clientWindows = doc.RootElement.GetProperty("clientWindows").Deserialize(options.GetTypeInfo<IReadOnlyList<ClientWindowInfo>>());
3435

3536
return new GetClientWindowsResult(clientWindows!);
3637
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetCookiesResultConverter.cs

Lines changed: 4 additions & 2 deletions
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.Internal;
2021
using OpenQA.Selenium.BiDi.Modules.Storage;
2122
using System;
2223
using System.Collections.Generic;
2324
using System.Text.Json;
2425
using System.Text.Json.Serialization;
26+
using System.Text.Json.Serialization.Metadata;
2527

2628
namespace OpenQA.Selenium.BiDi.Communication.Json.Converters.Enumerable;
2729

@@ -30,8 +32,8 @@ internal class GetCookiesResultConverter : JsonConverter<GetCookiesResult>
3032
public override GetCookiesResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
3133
{
3234
using var doc = JsonDocument.ParseValue(ref reader);
33-
var cookies = doc.RootElement.GetProperty("cookies").Deserialize<IReadOnlyList<Modules.Network.Cookie>>(options);
34-
var partitionKey = doc.RootElement.GetProperty("partitionKey").Deserialize<PartitionKey>(options);
35+
var cookies = doc.RootElement.GetProperty("cookies").Deserialize(options.GetTypeInfo<IReadOnlyList<Modules.Network.Cookie>>());
36+
var partitionKey = doc.RootElement.GetProperty("partitionKey").Deserialize((JsonTypeInfo<PartitionKey>)options.GetTypeInfo(typeof(PartitionKey)));
3537

3638
return new GetCookiesResult(cookies!, partitionKey!);
3739
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetRealmsResultConverter.cs

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

20+
using OpenQA.Selenium.BiDi.Communication.Json.Internal;
2021
using OpenQA.Selenium.BiDi.Modules.Script;
2122
using System;
2223
using System.Collections.Generic;
@@ -30,7 +31,7 @@ internal class GetRealmsResultConverter : JsonConverter<GetRealmsResult>
3031
public override GetRealmsResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
3132
{
3233
using var doc = JsonDocument.ParseValue(ref reader);
33-
var realms = doc.RootElement.GetProperty("realms").Deserialize<IReadOnlyList<RealmInfo>>(options);
34+
var realms = doc.RootElement.GetProperty("realms").Deserialize(options.GetTypeInfo<IReadOnlyList<RealmInfo>>());
3435

3536
return new GetRealmsResult(realms!);
3637
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/GetUserContextsResultConverter.cs

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

20+
using OpenQA.Selenium.BiDi.Communication.Json.Internal;
2021
using OpenQA.Selenium.BiDi.Modules.Browser;
2122
using System;
2223
using System.Collections.Generic;
@@ -30,7 +31,7 @@ internal class GetUserContextsResultConverter : JsonConverter<GetUserContextsRes
3031
public override GetUserContextsResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
3132
{
3233
using var doc = JsonDocument.ParseValue(ref reader);
33-
var userContexts = doc.RootElement.GetProperty("userContexts").Deserialize<IReadOnlyList<UserContextInfo>>(options);
34+
var userContexts = doc.RootElement.GetProperty("userContexts").Deserialize(options.GetTypeInfo<IReadOnlyList<UserContextInfo>>());
3435

3536
return new GetUserContextsResult(userContexts!);
3637
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/InputSourceActionsConverter.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
// under the License.
1818
// </copyright>
1919

20+
using OpenQA.Selenium.BiDi.Communication.Json.Internal;
2021
using OpenQA.Selenium.BiDi.Modules.Input;
2122
using System;
23+
using System.Collections.Generic;
2224
using System.Linq;
2325
using System.Text.Json;
2426
using System.Text.Json.Serialization;
@@ -43,31 +45,31 @@ public override void Write(Utf8JsonWriter writer, SourceActions value, JsonSeria
4345
case KeyActions keys:
4446
writer.WriteString("type", "key");
4547
writer.WritePropertyName("actions");
46-
JsonSerializer.Serialize(writer, keys.Actions.Select(a => a as IKeySourceAction), options);
48+
JsonSerializer.Serialize(writer, keys.Actions.Select(a => a as IKeySourceAction), options.GetTypeInfo<IEnumerable<IKeySourceAction?>>());
4749

4850
break;
4951
case PointerActions pointers:
5052
writer.WriteString("type", "pointer");
5153
if (pointers.Options is not null)
5254
{
5355
writer.WritePropertyName("parameters");
54-
JsonSerializer.Serialize(writer, pointers.Options, options);
56+
JsonSerializer.Serialize(writer, pointers.Options, options.GetTypeInfo(typeof(PointerParameters)));
5557
}
5658

5759
writer.WritePropertyName("actions");
58-
JsonSerializer.Serialize(writer, pointers.Actions.Select(a => a as IPointerSourceAction), options);
60+
JsonSerializer.Serialize(writer, pointers.Actions.Select(a => a as IPointerSourceAction), options.GetTypeInfo<IEnumerable<IPointerSourceAction?>>());
5961

6062
break;
6163
case WheelActions wheels:
6264
writer.WriteString("type", "wheel");
6365
writer.WritePropertyName("actions");
64-
JsonSerializer.Serialize(writer, wheels.Actions.Select(a => a as IWheelSourceAction), options);
66+
JsonSerializer.Serialize(writer, wheels.Actions.Select(a => a as IWheelSourceAction), options.GetTypeInfo<IEnumerable<IWheelSourceAction?>>());
6567

6668
break;
6769
case NoneActions none:
6870
writer.WriteString("type", "none");
6971
writer.WritePropertyName("actions");
70-
JsonSerializer.Serialize(writer, none.Actions.Select(a => a as INoneSourceAction), options);
72+
JsonSerializer.Serialize(writer, none.Actions.Select(a => a as INoneSourceAction), options.GetTypeInfo<IEnumerable<INoneSourceAction?>>());
7173

7274
break;
7375
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Enumerable/LocateNodesResultConverter.cs

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

20+
using OpenQA.Selenium.BiDi.Communication.Json.Internal;
2021
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
2122
using OpenQA.Selenium.BiDi.Modules.Script;
2223
using System;
@@ -31,7 +32,7 @@ internal class LocateNodesResultConverter : JsonConverter<LocateNodesResult>
3132
public override LocateNodesResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
3233
{
3334
using var doc = JsonDocument.ParseValue(ref reader);
34-
var nodes = doc.RootElement.GetProperty("nodes").Deserialize<IReadOnlyList<NodeRemoteValue>>(options);
35+
var nodes = doc.RootElement.GetProperty("nodes").Deserialize(options.GetTypeInfo<IReadOnlyList<NodeRemoteValue>>());
3536

3637
return new LocateNodesResult(nodes!);
3738
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@
1919

2020
using OpenQA.Selenium.BiDi.Modules.Input;
2121
using System;
22+
using System.Diagnostics.CodeAnalysis;
2223
using System.Text.Json;
2324
using System.Text.Json.Serialization;
2425

2526
namespace OpenQA.Selenium.BiDi.Communication.Json.Converters;
2627

28+
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Json serializer options should have AOT-safe type resolution")]
29+
[UnconditionalSuppressMessage("AOT", "IL3050", Justification = "Json serializer options should have AOT-safe type resolution")]
2730
internal class InputOriginConverter : JsonConverter<Origin>
2831
{
2932
public override Origin Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/EvaluateResultConverter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ internal class EvaluateResultConverter : JsonConverter<EvaluateResult>
3232
{
3333
return reader.GetDiscriminator("type") switch
3434
{
35-
"success" => JsonSerializer.Deserialize<EvaluateResultSuccess>(ref reader, options),
36-
"exception" => JsonSerializer.Deserialize<EvaluateResultException>(ref reader, options),
35+
"success" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<EvaluateResultSuccess>()),
36+
"exception" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<EvaluateResultException>()),
3737
_ => null,
3838
};
3939
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/LogEntryConverter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ internal class LogEntryConverter : JsonConverter<Modules.Log.LogEntry>
3232
{
3333
return reader.GetDiscriminator("type") switch
3434
{
35-
"console" => JsonSerializer.Deserialize<ConsoleLogEntry>(ref reader, options),
36-
"javascript" => JsonSerializer.Deserialize<JavascriptLogEntry>(ref reader, options),
35+
"console" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<ConsoleLogEntry>()),
36+
"javascript" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<JavascriptLogEntry>()),
3737
_ => null,
3838
};
3939
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RealmInfoConverter.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ internal class RealmInfoConverter : JsonConverter<RealmInfo>
3232
{
3333
return reader.GetDiscriminator("type") switch
3434
{
35-
"window" => JsonSerializer.Deserialize<WindowRealmInfo>(ref reader, options),
36-
"dedicated-worker" => JsonSerializer.Deserialize<DedicatedWorkerRealmInfo>(ref reader, options),
37-
"shared-worker" => JsonSerializer.Deserialize<SharedWorkerRealmInfo>(ref reader, options),
38-
"service-worker" => JsonSerializer.Deserialize<ServiceWorkerRealmInfo>(ref reader, options),
39-
"worker" => JsonSerializer.Deserialize<WorkerRealmInfo>(ref reader, options),
40-
"paint-worklet" => JsonSerializer.Deserialize<PaintWorkletRealmInfo>(ref reader, options),
41-
"audio-worklet" => JsonSerializer.Deserialize<AudioWorkletRealmInfo>(ref reader, options),
42-
"worklet" => JsonSerializer.Deserialize<WorkletRealmInfo>(ref reader, options),
35+
"window" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<WindowRealmInfo>()),
36+
"dedicated-worker" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<DedicatedWorkerRealmInfo>()),
37+
"shared-worker" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<SharedWorkerRealmInfo>()),
38+
"service-worker" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<ServiceWorkerRealmInfo>()),
39+
"worker" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<WorkerRealmInfo>()),
40+
"paint-worklet" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<PaintWorkletRealmInfo>()),
41+
"audio-worklet" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<AudioWorkletRealmInfo>()),
42+
"worklet" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<WorkletRealmInfo>()),
4343
_ => null,
4444
};
4545
}

dotnet/src/webdriver/BiDi/Communication/Json/Converters/Polymorphic/RemoteValueConverter.cs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,32 +37,32 @@ internal class RemoteValueConverter : JsonConverter<RemoteValue>
3737

3838
return reader.GetDiscriminator("type") switch
3939
{
40-
"number" => JsonSerializer.Deserialize<NumberRemoteValue>(ref reader, options),
41-
"boolean" => JsonSerializer.Deserialize<BooleanRemoteValue>(ref reader, options),
42-
"bigint" => JsonSerializer.Deserialize<BigIntRemoteValue>(ref reader, options),
43-
"string" => JsonSerializer.Deserialize<StringRemoteValue>(ref reader, options),
44-
"null" => JsonSerializer.Deserialize<NullRemoteValue>(ref reader, options),
45-
"undefined" => JsonSerializer.Deserialize<UndefinedRemoteValue>(ref reader, options),
46-
"symbol" => JsonSerializer.Deserialize<SymbolRemoteValue>(ref reader, options),
47-
"array" => JsonSerializer.Deserialize<ArrayRemoteValue>(ref reader, options),
48-
"object" => JsonSerializer.Deserialize<ObjectRemoteValue>(ref reader, options),
49-
"function" => JsonSerializer.Deserialize<FunctionRemoteValue>(ref reader, options),
50-
"regexp" => JsonSerializer.Deserialize<RegExpRemoteValue>(ref reader, options),
51-
"date" => JsonSerializer.Deserialize<DateRemoteValue>(ref reader, options),
52-
"map" => JsonSerializer.Deserialize<MapRemoteValue>(ref reader, options),
53-
"set" => JsonSerializer.Deserialize<SetRemoteValue>(ref reader, options),
54-
"weakmap" => JsonSerializer.Deserialize<WeakMapRemoteValue>(ref reader, options),
55-
"weakset" => JsonSerializer.Deserialize<WeakSetRemoteValue>(ref reader, options),
56-
"generator" => JsonSerializer.Deserialize<GeneratorRemoteValue>(ref reader, options),
57-
"error" => JsonSerializer.Deserialize<ErrorRemoteValue>(ref reader, options),
58-
"proxy" => JsonSerializer.Deserialize<ProxyRemoteValue>(ref reader, options),
59-
"promise" => JsonSerializer.Deserialize<PromiseRemoteValue>(ref reader, options),
60-
"typedarray" => JsonSerializer.Deserialize<TypedArrayRemoteValue>(ref reader, options),
61-
"arraybuffer" => JsonSerializer.Deserialize<ArrayBufferRemoteValue>(ref reader, options),
62-
"nodelist" => JsonSerializer.Deserialize<NodeListRemoteValue>(ref reader, options),
63-
"htmlcollection" => JsonSerializer.Deserialize<HtmlCollectionRemoteValue>(ref reader, options),
64-
"node" => JsonSerializer.Deserialize<NodeRemoteValue>(ref reader, options),
65-
"window" => JsonSerializer.Deserialize<WindowProxyRemoteValue>(ref reader, options),
40+
"number" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<NumberRemoteValue>()),
41+
"boolean" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<BooleanRemoteValue>()),
42+
"bigint" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<BigIntRemoteValue>()),
43+
"string" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<StringRemoteValue>()),
44+
"null" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<NullRemoteValue>()),
45+
"undefined" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<UndefinedRemoteValue>()),
46+
"symbol" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<SymbolRemoteValue>()),
47+
"array" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<ArrayRemoteValue>()),
48+
"object" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<ObjectRemoteValue>()),
49+
"function" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<FunctionRemoteValue>()),
50+
"regexp" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<RegExpRemoteValue>()),
51+
"date" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<DateRemoteValue>()),
52+
"map" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<MapRemoteValue>()),
53+
"set" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<SetRemoteValue>()),
54+
"weakmap" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<WeakMapRemoteValue>()),
55+
"weakset" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<WeakSetRemoteValue>()),
56+
"generator" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<GeneratorRemoteValue>()),
57+
"error" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<ErrorRemoteValue>()),
58+
"proxy" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<ProxyRemoteValue>()),
59+
"promise" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<PromiseRemoteValue>()),
60+
"typedarray" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<TypedArrayRemoteValue>()),
61+
"arraybuffer" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<ArrayBufferRemoteValue>()),
62+
"nodelist" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<NodeListRemoteValue>()),
63+
"htmlcollection" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<HtmlCollectionRemoteValue>()),
64+
"node" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<NodeRemoteValue>()),
65+
"window" => JsonSerializer.Deserialize(ref reader, options.GetTypeInfo<WindowProxyRemoteValue>()),
6666
_ => null,
6767
};
6868
}

dotnet/src/webdriver/BiDi/Communication/Json/Internal/JsonExtensions.cs

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

2020
using System.Text.Json;
21+
using System.Text.Json.Serialization.Metadata;
2122

2223
namespace OpenQA.Selenium.BiDi.Communication.Json.Internal;
2324

@@ -51,4 +52,9 @@ public static string GetDiscriminator(this ref Utf8JsonReader reader, string nam
5152

5253
return discriminator ?? throw new JsonException($"Couldn't determine '{name}' discriminator.");
5354
}
55+
56+
public static JsonTypeInfo<T> GetTypeInfo<T>(this JsonSerializerOptions options)
57+
{
58+
return (JsonTypeInfo<T>)options.GetTypeInfo(typeof(T));
59+
}
5460
}

0 commit comments

Comments
 (0)