Skip to content

Commit 3b2f9f4

Browse files
committed
Introduce AsModule method in BiDi
1 parent 1fb3389 commit 3b2f9f4

File tree

1 file changed

+15
-130
lines changed

1 file changed

+15
-130
lines changed

dotnet/src/webdriver/BiDi/BiDi.cs

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

2020
using System;
21+
using System.Collections.Concurrent;
2122
using System.Threading;
2223
using System.Threading.Tasks;
2324
using OpenQA.Selenium.BiDi.Communication;
@@ -28,18 +29,7 @@ public sealed class BiDi : IAsyncDisposable
2829
{
2930
private readonly Broker _broker;
3031

31-
private Session.SessionModule? _sessionModule;
32-
private BrowsingContext.BrowsingContextModule? _browsingContextModule;
33-
private Browser.BrowserModule? _browserModule;
34-
private Network.NetworkModule? _networkModule;
35-
private Input.InputModule? _inputModule;
36-
private Script.ScriptModule? _scriptModule;
37-
private Log.LogModule? _logModule;
38-
private Storage.StorageModule? _storageModule;
39-
private WebExtension.WebExtensionModule? _webExtensionModule;
40-
private Emulation.EmulationModule? _emulationModule;
41-
42-
private readonly object _moduleLock = new();
32+
private readonly ConcurrentDictionary<Type, Module> _modules = [];
4333

4434
private BiDi(string url)
4535
{
@@ -48,134 +38,29 @@ private BiDi(string url)
4838
_broker = new Broker(this, uri);
4939
}
5040

51-
internal Session.SessionModule SessionModule
52-
{
53-
get
54-
{
55-
if (_sessionModule is not null) return _sessionModule;
56-
lock (_moduleLock)
57-
{
58-
_sessionModule ??= Module.Create<Session.SessionModule>(this, _broker);
59-
}
60-
return _sessionModule;
61-
}
62-
}
41+
internal Session.SessionModule SessionModule => AsModule<Session.SessionModule>();
6342

64-
public BrowsingContext.BrowsingContextModule BrowsingContext
65-
{
66-
get
67-
{
68-
if (_browsingContextModule is not null) return _browsingContextModule;
69-
lock (_moduleLock)
70-
{
71-
_browsingContextModule ??= Module.Create<BrowsingContext.BrowsingContextModule>(this, _broker);
72-
}
73-
return _browsingContextModule;
74-
}
75-
}
43+
public BrowsingContext.BrowsingContextModule BrowsingContext => AsModule<BrowsingContext.BrowsingContextModule>();
7644

77-
public Browser.BrowserModule Browser
78-
{
79-
get
80-
{
81-
if (_browserModule is not null) return _browserModule;
82-
lock (_moduleLock)
83-
{
84-
_browserModule ??= Module.Create<Browser.BrowserModule>(this, _broker);
85-
}
86-
return _browserModule;
87-
}
88-
}
45+
public Browser.BrowserModule Browser => AsModule<Browser.BrowserModule>();
8946

90-
public Network.NetworkModule Network
91-
{
92-
get
93-
{
94-
if (_networkModule is not null) return _networkModule;
95-
lock (_moduleLock)
96-
{
97-
_networkModule ??= Module.Create<Network.NetworkModule>(this, _broker);
98-
}
99-
return _networkModule;
100-
}
101-
}
47+
public Network.NetworkModule Network => AsModule<Network.NetworkModule>();
10248

103-
internal Input.InputModule InputModule
104-
{
105-
get
106-
{
107-
if (_inputModule is not null) return _inputModule;
108-
lock (_moduleLock)
109-
{
110-
_inputModule ??= Module.Create<Input.InputModule>(this, _broker);
111-
}
112-
return _inputModule;
113-
}
114-
}
49+
internal Input.InputModule InputModule => AsModule<Input.InputModule>();
11550

116-
public Script.ScriptModule Script
117-
{
118-
get
119-
{
120-
if (_scriptModule is not null) return _scriptModule;
121-
lock (_moduleLock)
122-
{
123-
_scriptModule ??= Module.Create<Script.ScriptModule>(this, _broker);
124-
}
125-
return _scriptModule;
126-
}
127-
}
51+
public Script.ScriptModule Script => AsModule<Script.ScriptModule>();
12852

129-
public Log.LogModule Log
130-
{
131-
get
132-
{
133-
if (_logModule is not null) return _logModule;
134-
lock (_moduleLock)
135-
{
136-
_logModule ??= Module.Create<Log.LogModule>(this, _broker);
137-
}
138-
return _logModule;
139-
}
140-
}
53+
public Log.LogModule Log => AsModule<Log.LogModule>();
14154

142-
public Storage.StorageModule Storage
143-
{
144-
get
145-
{
146-
if (_storageModule is not null) return _storageModule;
147-
lock (_moduleLock)
148-
{
149-
_storageModule ??= Module.Create<Storage.StorageModule>(this, _broker);
150-
}
151-
return _storageModule;
152-
}
153-
}
55+
public Storage.StorageModule Storage => AsModule<Storage.StorageModule>();
15456

155-
public WebExtension.WebExtensionModule WebExtension
156-
{
157-
get
158-
{
159-
if (_webExtensionModule is not null) return _webExtensionModule;
160-
lock (_moduleLock)
161-
{
162-
_webExtensionModule ??= Module.Create<WebExtension.WebExtensionModule>(this, _broker);
163-
}
164-
return _webExtensionModule;
165-
}
166-
}
57+
public WebExtension.WebExtensionModule WebExtension => AsModule<WebExtension.WebExtensionModule>();
58+
59+
public Emulation.EmulationModule Emulation => AsModule<Emulation.EmulationModule>();
16760

168-
public Emulation.EmulationModule Emulation
61+
public TModule AsModule<TModule>() where TModule : Module, new()
16962
{
170-
get
171-
{
172-
if (_emulationModule is not null) return _emulationModule;
173-
lock (_moduleLock)
174-
{
175-
_emulationModule ??= Module.Create<Emulation.EmulationModule>(this, _broker);
176-
}
177-
return _emulationModule;
178-
}
63+
return (TModule)_modules.GetOrAdd(typeof(TModule), _ => Module.Create<TModule>(this, _broker));
17964
}
18065

18166
public Task<Session.StatusResult> StatusAsync()

0 commit comments

Comments
 (0)