1818// </copyright>
1919
2020using System ;
21+ using System . Collections . Concurrent ;
2122using System . Threading ;
2223using System . Threading . Tasks ;
2324using 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