Skip to content

Commit f4edf7a

Browse files
committed
Dummy
1 parent 3b61afe commit f4edf7a

File tree

13 files changed

+113
-38
lines changed

13 files changed

+113
-38
lines changed

dotnet/src/webdriver/BiDi/BiDi.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ internal Session.SessionModule SessionModule
5555
if (_sessionModule is not null) return _sessionModule;
5656
lock (_moduleLock)
5757
{
58-
_sessionModule ??= new Session.SessionModule(_broker);
58+
_sessionModule ??= Module.Create<Session.SessionModule>(_broker);
5959
}
6060
return _sessionModule;
6161
}
@@ -68,7 +68,7 @@ public BrowsingContext.BrowsingContextModule BrowsingContext
6868
if (_browsingContextModule is not null) return _browsingContextModule;
6969
lock (_moduleLock)
7070
{
71-
_browsingContextModule ??= new BrowsingContext.BrowsingContextModule(_broker);
71+
_browsingContextModule ??= Module.Create<BrowsingContext.BrowsingContextModule>(_broker);
7272
}
7373
return _browsingContextModule;
7474
}
@@ -81,7 +81,7 @@ public Browser.BrowserModule Browser
8181
if (_browserModule is not null) return _browserModule;
8282
lock (_moduleLock)
8383
{
84-
_browserModule ??= new Browser.BrowserModule(_broker);
84+
_browserModule ??= Module.Create<Browser.BrowserModule>(_broker);
8585
}
8686
return _browserModule;
8787
}
@@ -94,7 +94,7 @@ public Network.NetworkModule Network
9494
if (_networkModule is not null) return _networkModule;
9595
lock (_moduleLock)
9696
{
97-
_networkModule ??= new Network.NetworkModule(_broker);
97+
_networkModule ??= Module.Create<Network.NetworkModule>(_broker);
9898
}
9999
return _networkModule;
100100
}
@@ -107,7 +107,7 @@ internal Input.InputModule InputModule
107107
if (_inputModule is not null) return _inputModule;
108108
lock (_moduleLock)
109109
{
110-
_inputModule ??= new Input.InputModule(_broker);
110+
_inputModule ??= Module.Create<Input.InputModule>(_broker);
111111
}
112112
return _inputModule;
113113
}
@@ -120,7 +120,7 @@ public Script.ScriptModule Script
120120
if (_scriptModule is not null) return _scriptModule;
121121
lock (_moduleLock)
122122
{
123-
_scriptModule ??= new Script.ScriptModule(_broker);
123+
_scriptModule ??= Module.Create<Script.ScriptModule>(_broker);
124124
}
125125
return _scriptModule;
126126
}
@@ -133,7 +133,7 @@ public Log.LogModule Log
133133
if (_logModule is not null) return _logModule;
134134
lock (_moduleLock)
135135
{
136-
_logModule ??= new Log.LogModule(_broker);
136+
_logModule ??= Module.Create<Log.LogModule>(_broker);
137137
}
138138
return _logModule;
139139
}
@@ -146,7 +146,7 @@ public Storage.StorageModule Storage
146146
if (_storageModule is not null) return _storageModule;
147147
lock (_moduleLock)
148148
{
149-
_storageModule ??= new Storage.StorageModule(_broker);
149+
_storageModule ??= Module.Create<Storage.StorageModule>(_broker);
150150
}
151151
return _storageModule;
152152
}
@@ -159,7 +159,7 @@ public WebExtension.WebExtensionModule WebExtension
159159
if (_webExtensionModule is not null) return _webExtensionModule;
160160
lock (_moduleLock)
161161
{
162-
_webExtensionModule ??= new WebExtension.WebExtensionModule(_broker);
162+
_webExtensionModule ??= Module.Create<WebExtension.WebExtensionModule>(_broker);
163163
}
164164
return _webExtensionModule;
165165
}
@@ -172,7 +172,7 @@ public Emulation.EmulationModule Emulation
172172
if (_emulationModule is not null) return _emulationModule;
173173
lock (_moduleLock)
174174
{
175-
_emulationModule ??= new Emulation.EmulationModule(_broker);
175+
_emulationModule ??= Module.Create<Emulation.EmulationModule>(_broker);
176176
}
177177
return _emulationModule;
178178
}

dotnet/src/webdriver/BiDi/Browser/BrowserModule.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717
// under the License.
1818
// </copyright>
1919

20-
using System.Threading.Tasks;
2120
using OpenQA.Selenium.BiDi.Communication;
21+
using System.Collections.Generic;
22+
using System.Text.Json.Serialization;
23+
using System.Threading.Tasks;
2224

2325
namespace OpenQA.Selenium.BiDi.Browser;
2426

25-
public sealed class BrowserModule(Broker broker) : Module(broker)
27+
public sealed class BrowserModule : Module
2628
{
2729
public async Task<EmptyResult> CloseAsync(CloseOptions? options = null)
2830
{
@@ -73,4 +75,22 @@ public async Task<EmptyResult> SetDownloadBehaviorDeniedAsync(SetDownloadBehavio
7375

7476
return await Broker.ExecuteCommandAsync<SetDownloadBehaviorCommand, EmptyResult>(new SetDownloadBehaviorCommand(@params), options).ConfigureAwait(false);
7577
}
78+
79+
protected internal override void Initialize(Broker broker)
80+
{
81+
broker.ConfigureJsonContext(opts => opts.TypeInfoResolverChain.Add(BrowserModuleJsonSerializerContext.Default));
82+
}
7683
}
84+
85+
[JsonSerializable(typeof(CloseCommand))]
86+
[JsonSerializable(typeof(CreateUserContextCommand))]
87+
[JsonSerializable(typeof(GetUserContextsCommand))]
88+
[JsonSerializable(typeof(GetUserContextsResult))]
89+
[JsonSerializable(typeof(RemoveUserContextCommand))]
90+
[JsonSerializable(typeof(GetClientWindowsCommand))]
91+
[JsonSerializable(typeof(GetClientWindowsResult))]
92+
[JsonSerializable(typeof(SetDownloadBehaviorCommand))]
93+
[JsonSerializable(typeof(UserContextInfo))]
94+
[JsonSerializable(typeof(IReadOnlyList<UserContextInfo>))]
95+
[JsonSerializable(typeof(IReadOnlyList<ClientWindowInfo>))]
96+
internal partial class BrowserModuleJsonSerializerContext : JsonSerializerContext;

dotnet/src/webdriver/BiDi/BrowsingContext/BrowsingContextModule.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
namespace OpenQA.Selenium.BiDi.BrowsingContext;
2525

26-
public sealed class BrowsingContextModule(Broker broker) : Module(broker)
26+
public sealed class BrowsingContextModule : Module
2727
{
2828
public async Task<BrowsingContext> CreateAsync(ContextType type, CreateOptions? options = null)
2929
{
@@ -250,4 +250,9 @@ public async Task<Subscription> OnUserPromptClosedAsync(Action<UserPromptClosedE
250250
{
251251
return await Broker.SubscribeAsync("browsingContext.userPromptClosed", handler, options).ConfigureAwait(false);
252252
}
253+
254+
protected internal override void Initialize(Broker broker)
255+
{
256+
257+
}
253258
}

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

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,14 @@ public sealed class Broker : IAsyncDisposable
5353
private Task? _eventEmitterTask;
5454
private CancellationTokenSource? _receiveMessagesCancellationTokenSource;
5555

56-
private readonly BiDiJsonSerializerContext _jsonSerializerContext;
56+
private readonly JsonSerializerOptions _jsonSerializerOptions;
5757

5858
internal Broker(BiDi bidi, Uri url)
5959
{
6060
_bidi = bidi;
6161
_transport = new WebSocketTransport(url);
6262

63-
var jsonSerializerOptions = new JsonSerializerOptions
63+
_jsonSerializerOptions = new JsonSerializerOptions
6464
{
6565
PropertyNameCaseInsensitive = true,
6666
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
@@ -108,7 +108,14 @@ internal Broker(BiDi bidi, Uri url)
108108
}
109109
};
110110

111-
_jsonSerializerContext = new BiDiJsonSerializerContext(jsonSerializerOptions);
111+
// Add base BiDi generated context resolver; keep options mutable for module contexts
112+
_jsonSerializerOptions.TypeInfoResolverChain.Add(BiDiJsonSerializerContext.Default);
113+
}
114+
115+
public void ConfigureJsonContext(Action<JsonSerializerOptions> action)
116+
{
117+
// Keep options mutable; do not create a context bound to them (avoids InvalidOperationException)
118+
action(_jsonSerializerOptions);
112119
}
113120

114121
public async Task ConnectAsync(CancellationToken cancellationToken)
@@ -205,21 +212,14 @@ private async Task<EmptyResult> ExecuteCommandCoreAsync<TCommand>(TCommand comma
205212
where TCommand : Command
206213
{
207214
command.Id = Interlocked.Increment(ref _currentCommandId);
208-
209215
var tcs = new TaskCompletionSource<EmptyResult>(TaskCreationOptions.RunContinuationsAsynchronously);
210-
211216
var timeout = options?.Timeout ?? TimeSpan.FromSeconds(30);
212-
213217
using var cts = new CancellationTokenSource(timeout);
214-
215218
cts.Token.Register(() => tcs.TrySetCanceled(cts.Token));
216-
217219
_pendingCommands[command.Id] = new(command.Id, command.ResultType, tcs);
218220

219-
var data = JsonSerializer.SerializeToUtf8Bytes(command, typeof(TCommand), _jsonSerializerContext);
220-
221+
var data = JsonSerializer.SerializeToUtf8Bytes(command, typeof(TCommand), _jsonSerializerOptions);
221222
await _transport.SendAsync(data, cts.Token).ConfigureAwait(false);
222-
223223
return await tcs.Task.ConfigureAwait(false);
224224
}
225225

@@ -341,11 +341,11 @@ private void ProcessReceivedMessage(byte[]? data)
341341
break;
342342

343343
case "result":
344-
resultReader = reader; // cloning reader with current position
344+
resultReader = reader; // snapshot
345345
break;
346346

347347
case "params":
348-
paramsReader = reader; // cloning reader with current position
348+
paramsReader = reader; // snapshot
349349
break;
350350

351351
case "error":
@@ -368,7 +368,7 @@ private void ProcessReceivedMessage(byte[]? data)
368368

369369
if (_pendingCommands.TryGetValue(id.Value, out var successCommand))
370370
{
371-
var messageSuccess = JsonSerializer.Deserialize(ref resultReader, successCommand.ResultType, _jsonSerializerContext)!;
371+
var messageSuccess = JsonSerializer.Deserialize(ref resultReader, successCommand.ResultType, _jsonSerializerOptions)!;
372372
successCommand.TaskCompletionSource.SetResult((EmptyResult)messageSuccess);
373373
_pendingCommands.TryRemove(id.Value, out _);
374374
}
@@ -384,7 +384,7 @@ private void ProcessReceivedMessage(byte[]? data)
384384

385385
if (_eventTypesMap.TryGetValue(method, out var eventType))
386386
{
387-
var eventArgs = (EventArgs)JsonSerializer.Deserialize(ref paramsReader, eventType, _jsonSerializerContext)!;
387+
var eventArgs = (EventArgs)JsonSerializer.Deserialize(ref paramsReader, eventType, _jsonSerializerOptions)!;
388388

389389
var messageEvent = new MessageEvent(method, eventArgs);
390390
_pendingEvents.Add(messageEvent);

dotnet/src/webdriver/BiDi/Emulation/EmulationModule.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
namespace OpenQA.Selenium.BiDi.Emulation;
2525

26-
public sealed class EmulationModule(Broker broker) : Module(broker)
26+
public sealed class EmulationModule : Module
2727
{
2828
public async Task<EmptyResult> SetTimezoneOverrideAsync(string? timezone, SetTimezoneOverrideOptions? options = null)
2929
{
@@ -89,4 +89,9 @@ public async Task<EmptyResult> SetGeolocationPositionErrorOverrideAsync(SetGeolo
8989

9090
return await Broker.ExecuteCommandAsync<SetGeolocationOverrideCommand, EmptyResult>(new SetGeolocationOverrideCommand(@params), options).ConfigureAwait(false);
9191
}
92+
93+
protected internal override void Initialize(Broker broker)
94+
{
95+
throw new NotImplementedException();
96+
}
9297
}

dotnet/src/webdriver/BiDi/Input/InputModule.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
namespace OpenQA.Selenium.BiDi.Input;
2525

26-
public sealed class InputModule(Broker broker) : Module(broker)
26+
public sealed class InputModule : Module
2727
{
2828
public async Task<EmptyResult> PerformActionsAsync(BrowsingContext.BrowsingContext context, IEnumerable<SourceActions> actions, PerformActionsOptions? options = null)
2929
{
@@ -45,4 +45,9 @@ public async Task<EmptyResult> SetFilesAsync(BrowsingContext.BrowsingContext con
4545

4646
return await Broker.ExecuteCommandAsync<SetFilesCommand, EmptyResult>(new SetFilesCommand(@params), options).ConfigureAwait(false);
4747
}
48+
49+
protected internal override void Initialize(Broker broker)
50+
{
51+
throw new System.NotImplementedException();
52+
}
4853
}

dotnet/src/webdriver/BiDi/Log/LogModule.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
namespace OpenQA.Selenium.BiDi.Log;
2525

26-
public sealed class LogModule(Broker broker) : Module(broker)
26+
public sealed class LogModule : Module
2727
{
2828
public async Task<Subscription> OnEntryAddedAsync(Func<LogEntry, Task> handler, SubscriptionOptions? options = null)
2929
{
@@ -34,4 +34,9 @@ public async Task<Subscription> OnEntryAddedAsync(Action<LogEntry> handler, Subs
3434
{
3535
return await Broker.SubscribeAsync("log.entryAdded", handler, options).ConfigureAwait(false);
3636
}
37+
38+
protected internal override void Initialize(Broker broker)
39+
{
40+
throw new NotImplementedException();
41+
}
3742
}

dotnet/src/webdriver/BiDi/Module.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,17 @@
2121

2222
namespace OpenQA.Selenium.BiDi;
2323

24-
public abstract class Module(Broker broker)
24+
public abstract class Module
2525
{
26-
protected Broker Broker { get; } = broker;
26+
protected Broker Broker { get; private set; }
27+
28+
protected internal abstract void Initialize(Broker broker);
29+
30+
public static TModule Create<TModule>(Broker broker) where TModule : Module, new()
31+
{
32+
TModule module = new();
33+
module.Broker = broker;
34+
module.Initialize(broker);
35+
return module;
36+
}
2737
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
namespace OpenQA.Selenium.BiDi.Network;
2626

27-
public sealed partial class NetworkModule(Broker broker) : Module(broker)
27+
public sealed partial class NetworkModule : Module
2828
{
2929
public async Task<Collector> AddDataCollectorAsync(IEnumerable<DataType> DataTypes, int MaxEncodedDataSize, AddDataCollectorOptions? options = null)
3030
{
@@ -173,4 +173,9 @@ public async Task<Subscription> OnAuthRequiredAsync(Action<AuthRequiredEventArgs
173173
{
174174
return await Broker.SubscribeAsync("network.authRequired", handler, options).ConfigureAwait(false);
175175
}
176+
177+
protected internal override void Initialize(Broker broker)
178+
{
179+
throw new System.NotImplementedException();
180+
}
176181
}

dotnet/src/webdriver/BiDi/Script/ScriptModule.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
namespace OpenQA.Selenium.BiDi.Script;
2525

26-
public sealed class ScriptModule(Broker broker) : Module(broker)
26+
public sealed class ScriptModule : Module
2727
{
2828
public async Task<EvaluateResult> EvaluateAsync(string expression, bool awaitPromise, Target target, EvaluateOptions? options = null)
2929
{
@@ -105,4 +105,9 @@ public async Task<Subscription> OnRealmDestroyedAsync(Action<RealmDestroyedEvent
105105
{
106106
return await Broker.SubscribeAsync("script.realmDestroyed", handler, options).ConfigureAwait(false);
107107
}
108+
109+
protected internal override void Initialize(Broker broker)
110+
{
111+
throw new NotImplementedException();
112+
}
108113
}

0 commit comments

Comments
 (0)