@@ -27,39 +27,167 @@ public class BiDi : IAsyncDisposable
2727{
2828 private readonly Broker _broker ;
2929
30- private readonly Lazy < Session . SessionModule > _sessionModule ;
31- private readonly Lazy < BrowsingContext . BrowsingContextModule > _browsingContextModule ;
32- private readonly Lazy < Browser . BrowserModule > _browserModule ;
33- private readonly Lazy < Network . NetworkModule > _networkModule ;
34- private readonly Lazy < Input . InputModule > _inputModule ;
35- private readonly Lazy < Script . ScriptModule > _scriptModule ;
36- private readonly Lazy < Log . LogModule > _logModule ;
37- private readonly Lazy < 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 Lazy < Session . SessionModule > ( ( ) => new Session . SessionModule ( _broker ) ) ;
46- _browsingContextModule = new Lazy < BrowsingContext . BrowsingContextModule > ( ( ) => new BrowsingContext . BrowsingContextModule ( _broker ) ) ;
47- _browserModule = new Lazy < Browser . BrowserModule > ( ( ) => new Browser . BrowserModule ( _broker ) ) ;
48- _networkModule = new Lazy < Network . NetworkModule > ( ( ) => new Network . NetworkModule ( _broker ) ) ;
49- _inputModule = new Lazy < Input . InputModule > ( ( ) => new Input . InputModule ( _broker ) ) ;
50- _scriptModule = new Lazy < Script . ScriptModule > ( ( ) => new Script . ScriptModule ( _broker ) ) ;
51- _logModule = new Lazy < Log . LogModule > ( ( ) => new Log . LogModule ( _broker ) ) ;
52- _storageModule = new Lazy < Storage . 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 . Value ;
56- public BrowsingContext . BrowsingContextModule BrowsingContext => _browsingContextModule . Value ;
57- public Browser . BrowserModule Browser => _browserModule . Value ;
58- public Network . NetworkModule Network => _networkModule . Value ;
59- internal Input . InputModule InputModule => _inputModule . Value ;
60- public Script . ScriptModule Script => _scriptModule . Value ;
61- public Log . LogModule Log => _logModule . Value ;
62- public Storage . StorageModule Storage => _storageModule . Value ;
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