Skip to content

Commit b46629e

Browse files
committed
[dotnet] [bidi] Provide extension points for custom BiDi modules
1 parent 60302ba commit b46629e

File tree

2 files changed

+38
-22
lines changed

2 files changed

+38
-22
lines changed

dotnet/src/webdriver/BiDi/BiDi.cs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace OpenQA.Selenium.BiDi;
2727
public class BiDi : IAsyncDisposable
2828
{
2929
private readonly ITransport _transport;
30-
private readonly Broker _broker;
30+
protected Broker Broker { get; }
3131

3232
private readonly Lazy<Modules.Session.SessionModule> _sessionModule;
3333
private readonly Lazy<Modules.BrowsingContext.BrowsingContextModule> _browsingContextModule;
@@ -38,21 +38,21 @@ public class BiDi : IAsyncDisposable
3838
private readonly Lazy<Modules.Log.LogModule> _logModule;
3939
private readonly Lazy<Modules.Storage.StorageModule> _storageModule;
4040

41-
internal BiDi(string url)
41+
protected internal BiDi(string url)
4242
{
4343
var uri = new Uri(url);
4444

4545
_transport = new WebSocketTransport(new Uri(url));
46-
_broker = new Broker(this, _transport);
46+
Broker = new Broker(this, _transport);
4747

48-
_sessionModule = new Lazy<Modules.Session.SessionModule>(() => new Modules.Session.SessionModule(_broker));
49-
_browsingContextModule = new Lazy<Modules.BrowsingContext.BrowsingContextModule>(() => new Modules.BrowsingContext.BrowsingContextModule(_broker));
50-
_browserModule = new Lazy<Modules.Browser.BrowserModule>(() => new Modules.Browser.BrowserModule(_broker));
51-
_networkModule = new Lazy<Modules.Network.NetworkModule>(() => new Modules.Network.NetworkModule(_broker));
52-
_inputModule = new Lazy<Modules.Input.InputModule>(() => new Modules.Input.InputModule(_broker));
53-
_scriptModule = new Lazy<Modules.Script.ScriptModule>(() => new Modules.Script.ScriptModule(_broker));
54-
_logModule = new Lazy<Modules.Log.LogModule>(() => new Modules.Log.LogModule(_broker));
55-
_storageModule = new Lazy<Modules.Storage.StorageModule>(() => new Modules.Storage.StorageModule(_broker));
48+
_sessionModule = new Lazy<Modules.Session.SessionModule>(() => new Modules.Session.SessionModule(Broker));
49+
_browsingContextModule = new Lazy<Modules.BrowsingContext.BrowsingContextModule>(() => new Modules.BrowsingContext.BrowsingContextModule(Broker));
50+
_browserModule = new Lazy<Modules.Browser.BrowserModule>(() => new Modules.Browser.BrowserModule(Broker));
51+
_networkModule = new Lazy<Modules.Network.NetworkModule>(() => new Modules.Network.NetworkModule(Broker));
52+
_inputModule = new Lazy<Modules.Input.InputModule>(() => new Modules.Input.InputModule(Broker));
53+
_scriptModule = new Lazy<Modules.Script.ScriptModule>(() => new Modules.Script.ScriptModule(Broker));
54+
_logModule = new Lazy<Modules.Log.LogModule>(() => new Modules.Log.LogModule(Broker));
55+
_storageModule = new Lazy<Modules.Storage.StorageModule>(() => new Modules.Storage.StorageModule(Broker));
5656
}
5757

5858
internal Modules.Session.SessionModule SessionModule => _sessionModule.Value;
@@ -73,7 +73,7 @@ public static async Task<BiDi> ConnectAsync(string url)
7373
{
7474
var bidi = new BiDi(url);
7575

76-
await bidi._broker.ConnectAsync(default).ConfigureAwait(false);
76+
await bidi.Broker.ConnectAsync().ConfigureAwait(false);
7777

7878
return bidi;
7979
}
@@ -83,10 +83,15 @@ public Task EndAsync(Modules.Session.EndOptions? options = null)
8383
return SessionModule.EndAsync(options);
8484
}
8585

86-
public async ValueTask DisposeAsync()
86+
protected virtual async ValueTask DisposeAsyncCore()
8787
{
88-
await _broker.DisposeAsync().ConfigureAwait(false);
89-
88+
await Broker.DisposeAsync().ConfigureAwait(false);
9089
_transport?.Dispose();
9190
}
91+
92+
public async ValueTask DisposeAsync()
93+
{
94+
await DisposeAsyncCore();
95+
GC.SuppressFinalize(this);
96+
}
9297
}

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
using System.Linq;
2828
using System.Text.Json;
2929
using System.Text.Json.Serialization;
30+
using System.Text.Json.Serialization.Metadata;
3031
using System.Threading;
3132
using System.Threading.Tasks;
3233

@@ -52,7 +53,7 @@ public class Broker : IAsyncDisposable
5253
private Task? _eventEmitterTask;
5354
private CancellationTokenSource? _receiveMessagesCancellationTokenSource;
5455

55-
private readonly BiDiJsonSerializerContext _jsonSerializerContext;
56+
private readonly JsonSerializerOptions _jsonSerializerContext;
5657

5758
internal Broker(BiDi bidi, ITransport transport)
5859
{
@@ -99,13 +100,22 @@ internal Broker(BiDi bidi, ITransport transport)
99100
new Json.Converters.Enumerable.GetUserContextsResultConverter(),
100101
new Json.Converters.Enumerable.GetClientWindowsResultConverter(),
101102
new Json.Converters.Enumerable.GetRealmsResultConverter(),
103+
},
104+
TypeInfoResolverChain =
105+
{
106+
BiDiJsonSerializerContext.Default
102107
}
103108
};
104109

105-
_jsonSerializerContext = new BiDiJsonSerializerContext(jsonSerializerOptions);
110+
_jsonSerializerContext = jsonSerializerOptions;
111+
}
112+
113+
public void ProvideCustomSerializationContext(JsonSerializerContext extensionContext)
114+
{
115+
_jsonSerializerContext.TypeInfoResolverChain.Add(extensionContext);
106116
}
107117

108-
public async Task ConnectAsync(CancellationToken cancellationToken)
118+
public async Task ConnectAsync(CancellationToken cancellationToken = default)
109119
{
110120
await _transport.ConnectAsync(cancellationToken).ConfigureAwait(false);
111121

@@ -120,7 +130,8 @@ private async Task ReceiveMessagesAsync(CancellationToken cancellationToken)
120130
{
121131
var data = await _transport.ReceiveAsync(cancellationToken).ConfigureAwait(false);
122132

123-
var message = JsonSerializer.Deserialize(new ReadOnlySpan<byte>(data), _jsonSerializerContext.Message);
133+
var messageTypeInfo = (JsonTypeInfo<Message>)_jsonSerializerContext.GetTypeInfo(typeof(Message));
134+
var message = JsonSerializer.Deserialize(new ReadOnlySpan<byte>(data), messageTypeInfo);
124135

125136
switch (message)
126137
{
@@ -131,9 +142,9 @@ private async Task ReceiveMessagesAsync(CancellationToken cancellationToken)
131142
case MessageEvent messageEvent:
132143
_pendingEvents.Add(messageEvent);
133144
break;
134-
case MessageError mesageError:
135-
_pendingCommands[mesageError.Id].SetException(new BiDiException($"{mesageError.Error}: {mesageError.Message}"));
136-
_pendingCommands.TryRemove(mesageError.Id, out _);
145+
case MessageError messageError:
146+
_pendingCommands[messageError.Id].SetException(new BiDiException($"{messageError.Error}: {messageError.Message}"));
147+
_pendingCommands.TryRemove(messageError.Id, out _);
137148
break;
138149
}
139150
}

0 commit comments

Comments
 (0)