Skip to content

Commit 36a3c84

Browse files
committed
Thread safe
1 parent 9ad6ae2 commit 36a3c84

File tree

1 file changed

+152
-24
lines changed

1 file changed

+152
-24
lines changed

dotnet/src/webdriver/BiDi/BiDi.cs

Lines changed: 152 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,39 +27,167 @@ public class BiDi : IAsyncDisposable
2727
{
2828
private readonly Broker _broker;
2929

30-
private readonly Session.SessionModule _sessionModule;
31-
private readonly BrowsingContext.BrowsingContextModule _browsingContextModule;
32-
private readonly Browser.BrowserModule _browserModule;
33-
private readonly Network.NetworkModule _networkModule;
34-
private readonly Input.InputModule _inputModule;
35-
private readonly Script.ScriptModule _scriptModule;
36-
private readonly Log.LogModule _logModule;
37-
private readonly Storage.StorageModule _storageModule;
30+
private Session.SessionModule? _sessionModule;
31+
private BrowsingContext.BrowsingContextModule? _browsingContextModule;
32+
private Browser.BrowserModule? _browserModule;
33+
private Network.NetworkModule? _networkModule;
34+
private Input.InputModule? _inputModule;
35+
private Script.ScriptModule? _scriptModule;
36+
private Log.LogModule? _logModule;
37+
private Storage.StorageModule? _storageModule;
38+
39+
private readonly object _moduleLock = new();
3840

3941
internal BiDi(string url)
4042
{
4143
var uri = new Uri(url);
4244

4345
_broker = new Broker(this, uri);
46+
}
47+
48+
internal Session.SessionModule SessionModule
49+
{
50+
get
51+
{
52+
if (_sessionModule is null)
53+
{
54+
lock (_moduleLock)
55+
{
56+
if (_sessionModule is null)
57+
{
58+
_sessionModule = new Session.SessionModule(_broker);
59+
}
60+
}
61+
}
62+
return _sessionModule;
63+
}
64+
}
65+
66+
public BrowsingContext.BrowsingContextModule BrowsingContext
67+
{
68+
get
69+
{
70+
if (_browsingContextModule is null)
71+
{
72+
lock (_moduleLock)
73+
{
74+
if (_browsingContextModule is null)
75+
{
76+
_browsingContextModule = new BrowsingContext.BrowsingContextModule(_broker);
77+
}
78+
}
79+
}
80+
return _browsingContextModule;
81+
}
82+
}
83+
84+
public Browser.BrowserModule Browser
85+
{
86+
get
87+
{
88+
if (_browserModule is null)
89+
{
90+
lock (_moduleLock)
91+
{
92+
if (_browserModule is null)
93+
{
94+
_browserModule = new Browser.BrowserModule(_broker);
95+
}
96+
}
97+
}
98+
return _browserModule;
99+
}
100+
}
44101

45-
_sessionModule = new Session.SessionModule(_broker);
46-
_browsingContextModule = new BrowsingContext.BrowsingContextModule(_broker);
47-
_browserModule = new Browser.BrowserModule(_broker);
48-
_networkModule = new Network.NetworkModule(_broker);
49-
_inputModule = new Input.InputModule(_broker);
50-
_scriptModule = new Script.ScriptModule(_broker);
51-
_logModule = new Log.LogModule(_broker);
52-
_storageModule = new Storage.StorageModule(_broker);
102+
public Network.NetworkModule Network
103+
{
104+
get
105+
{
106+
if (_networkModule is null)
107+
{
108+
lock (_moduleLock)
109+
{
110+
if (_networkModule is null)
111+
{
112+
_networkModule = new Network.NetworkModule(_broker);
113+
}
114+
}
115+
}
116+
return _networkModule;
117+
}
53118
}
54119

55-
internal Session.SessionModule SessionModule => _sessionModule;
56-
public BrowsingContext.BrowsingContextModule BrowsingContext => _browsingContextModule;
57-
public Browser.BrowserModule Browser => _browserModule;
58-
public Network.NetworkModule Network => _networkModule;
59-
internal Input.InputModule InputModule => _inputModule;
60-
public Script.ScriptModule Script => _scriptModule;
61-
public Log.LogModule Log => _logModule;
62-
public Storage.StorageModule Storage => _storageModule;
120+
internal Input.InputModule InputModule
121+
{
122+
get
123+
{
124+
if (_inputModule is null)
125+
{
126+
lock (_moduleLock)
127+
{
128+
if (_inputModule is null)
129+
{
130+
_inputModule = new Input.InputModule(_broker);
131+
}
132+
}
133+
}
134+
return _inputModule;
135+
}
136+
}
137+
138+
public Script.ScriptModule Script
139+
{
140+
get
141+
{
142+
if (_scriptModule is null)
143+
{
144+
lock (_moduleLock)
145+
{
146+
if (_scriptModule is null)
147+
{
148+
_scriptModule = new Script.ScriptModule(_broker);
149+
}
150+
}
151+
}
152+
return _scriptModule;
153+
}
154+
}
155+
156+
public Log.LogModule Log
157+
{
158+
get
159+
{
160+
if (_logModule is null)
161+
{
162+
lock (_moduleLock)
163+
{
164+
if (_logModule is null)
165+
{
166+
_logModule = new Log.LogModule(_broker);
167+
}
168+
}
169+
}
170+
return _logModule;
171+
}
172+
}
173+
174+
public Storage.StorageModule Storage
175+
{
176+
get
177+
{
178+
if (_storageModule is null)
179+
{
180+
lock (_moduleLock)
181+
{
182+
if (_storageModule is null)
183+
{
184+
_storageModule = new Storage.StorageModule(_broker);
185+
}
186+
}
187+
}
188+
return _storageModule;
189+
}
190+
}
63191

64192
public Task<Session.StatusResult> StatusAsync()
65193
{

0 commit comments

Comments
 (0)