@@ -80,12 +80,18 @@ const storageId = 'hu-lts-storage',
8080 } ,
8181 offStateKeywords = [ 'off' , 'disabled' , 'false' , '0' ] ,
8282 onStateKeywords = [ 'on' , 'enabled' , 'true' , '1' ] ,
83- checkBooleanState = ( element ) =>
84- onStateKeywords . includes (
85- `${ ( element . querySelector ( 'input:checked,option:checked' ) || [ ] ) . value || element . checked } ` . toLowerCase ( )
86- ) ,
83+ checkBooleanState = ( element ) => {
84+ const state =
85+ `${ ( element . querySelector ( 'input:checked,option:checked' ) || [ ] ) . value || element . checked } ` . toLowerCase ( ) ;
86+ return (
87+ onStateKeywords . includes ( state ) ||
88+ ( ! offStateKeywords . includes ( state ) && state )
89+ ) ;
90+ } ,
91+ classEvent = ( targetElementList , eventTrigger , eventConstructor = Event ) =>
92+ new eventConstructor ( eventTrigger , { target : targetElementList [ 0 ] } ) ,
8793 classUpdateHandler =
88- ( targetElementList , stateFunction , ...params ) =>
94+ ( targetElementList , stateFunction , manualEvent = false , ...params ) =>
8995 ( ) => {
9096 const state =
9197 'function' === typeof stateFunction
@@ -108,9 +114,10 @@ const storageId = 'hu-lts-storage',
108114 if ( 'number' === typeof updateTarget . selectedIndex )
109115 updateTarget . selectedIndex = mappedIndex ;
110116 else children [ mappedIndex ] . checked = true ;
111- } else
112- updateTarget . checked = onStateKeywords . includes ( state ) ;
117+ } else updateTarget . checked = onStateKeywords . includes ( state ) ;
113118 } ) ;
119+ if ( manualEvent instanceof Event && targetElementList . length > 0 )
120+ targetElementList [ 0 ] . dispatchEvent ( manualEvent ) ;
114121 } ,
115122 // These titles and icons are used as autofill templates by settings.html.
116123 // The icon URLs and tab titles may need to be updated over time.
@@ -130,46 +137,10 @@ const storageId = 'hu-lts-storage',
130137 : 'libcurl' ,
131138 defaultSearch = 'Google' ;
132139
133- // Load a custom page title and favicon if it was previously stored.
134- useStorageArgs ( 'Title' , ( s ) => {
135- s != undefined && pageTitle ( s ) ;
136- } ) ;
137- useStorageArgs ( 'Icon' , ( s ) => {
138- s != undefined && pageIcon ( s ) ;
139- } ) ;
140+ // All code in this block is used by menu items that adjust website settings.
140141
141- useStorageArgs ( 'SearchEngine' , ( s ) => {
142- classUpdateHandler (
143- document . getElementsByClassName ( 'search-engine-list' ) ,
144- s || defaultSearch
145- ) ( ) ;
146- } ) ;
142+ /* BEGIN WEBSITE SETTINGS */
147143
148- // Load the Wisp transport mode that was last used, or use the default.
149- useStorageArgs ( 'Transport' , ( s ) => {
150- classUpdateHandler (
151- document . getElementsByClassName ( 'wisp-transport-list' ) ,
152- s || defaultMode
153- ) ( ) ;
154- } ) ;
155-
156- // Ads are disabled by default. Load ads if ads were enabled previously.
157- // Change !== to === here if ads should be enabled by default.
158- useStorageArgs ( 'HideAds' , ( s ) => {
159- if ( s !== false ) pageHideAds ( ) ;
160- else {
161- pageShowAds ( ) ;
162- classUpdateHandler ( document . getElementsByClassName ( 'hideads' ) , 'off' ) ( ) ;
163- }
164- } ) ;
165-
166- // Tor is disabled by default. Enable Tor if it was enabled previously.
167- useStorageArgs ( 'UseOnion' , ( s ) => {
168- if ( s === true )
169- classUpdateHandler ( document . getElementsByClassName ( 'useonion' ) , 'on' ) ( ) ;
170- } ) ;
171-
172- // All code below is used by menu items that adjust website settings.
173144if ( document . getElementById ( 'csel' ) ) {
174145 const attachEventListener = ( selector , ...args ) =>
175146 (
@@ -281,13 +252,17 @@ if (document.getElementById('csel')) {
281252 : setStorage ( 'Transport' , e . target . value ) ;
282253
283254 // Only the libcurl transport mode supports Tor at the moment.
284- let torCheck = document . getElementsByClassName ( 'useonion' ) [ 0 ] ;
285- if ( e . target . value !== 'libcurl' && torCheck . checked ) torCheck . click ( ) ;
255+ let torCheck = document . getElementsByClassName ( 'useonion' ) ;
256+ if (
257+ e . target . value !== 'libcurl' &&
258+ checkBooleanState ( torCheck [ 0 ] ) === false
259+ )
260+ classUpdateHandler ( torCheck , 'off' ) ( ) ;
286261 } ) ;
287262
288263 // Allow users to toggle ads with the UI.
289264 attachClassEventListener ( 'hideads' , 'change' , ( e ) => {
290- if ( checkBooleanState ( e . target ) ) {
265+ if ( checkBooleanState ( e . target ) === true ) {
291266 pageHideAds ( ) ;
292267 setStorage ( 'HideAds' , true ) ;
293268 } else {
@@ -302,26 +277,89 @@ if (document.getElementById('csel')) {
302277 */
303278 attachClassEventListener ( 'useonion' , 'change' , ( e ) => {
304279 let unselectedModes = document . querySelectorAll (
305- '.wisp-transport-list input:not([value=libcurl])'
280+ '.wisp-transport-list input:not([value=libcurl]),.region-list '
306281 ) ;
307- if ( checkBooleanState ( e . target ) ) {
308- let selectedMode = document . querySelector (
309- '.wisp-transport-list input[value=libcurl]'
310- ) ;
282+ const wispTransportList = document . getElementsByClassName (
283+ 'wisp-transport-list'
284+ ) ,
285+ regionList = document . getElementsByClassName ( 'region-list' ) ;
286+ if ( checkBooleanState ( e . target ) === true ) {
287+ classUpdateHandler (
288+ wispTransportList ,
289+ 'libcurl' ,
290+ classEvent ( wispTransportList , 'change' )
291+ ) ( ) ;
292+ classUpdateHandler ( regionList , 'off' , classEvent ( regionList , 'change' ) ) ( ) ;
311293 unselectedModes . forEach ( ( e ) => {
312294 e . setAttribute ( 'disabled' , 'true' ) ;
313295 } ) ;
314- selectedMode . click ( ) ;
315- setStorage ( 'UseOnion' , true ) ;
296+ setStorage ( 'UseSocks5' , 'tor' ) ;
316297 } else {
317298 unselectedModes . forEach ( ( e ) => {
318299 e . removeAttribute ( 'disabled' ) ;
319300 } ) ;
320301
321302 // Tor will likely never be enabled by default, so removing the cookie
322303 // here may be better than setting it to false.
323- removeStorage ( 'UseOnion ' ) ;
304+ removeStorage ( 'UseSocks5 ' ) ;
324305 }
325306 } ) ;
307+
308+ attachClassEventListener ( 'region-list' , 'change' , ( e ) => {
309+ const isOff = checkBooleanState ( e . target ) === false ;
310+ isOff
311+ ? removeStorage ( 'UseSocks5' )
312+ : setStorage ( 'UseSocks5' , e . target . value ) ;
313+
314+ // Only the libcurl transport mode supports Tor at the moment.
315+ let torCheck = document . getElementsByClassName ( 'useonion' ) ;
316+ if ( isOff && checkBooleanState ( torCheck [ 0 ] ) === false )
317+ classUpdateHandler ( torCheck , 'off' , classEvent ( torCheck , 'change' ) ) ( ) ;
318+ } ) ;
326319}
320+
321+ /* END WEBSITE SETTINGS */
322+
323+ /* LOAD USER-SAVED SETTINGS */
324+
325+ // Load a custom page title and favicon if it was previously stored.
326+ useStorageArgs ( 'Title' , ( s ) => {
327+ s != undefined && pageTitle ( s ) ;
328+ } ) ;
329+ useStorageArgs ( 'Icon' , ( s ) => {
330+ s != undefined && pageIcon ( s ) ;
331+ } ) ;
332+
333+ useStorageArgs ( 'SearchEngine' , ( s ) => {
334+ classUpdateHandler (
335+ document . getElementsByClassName ( 'search-engine-list' ) ,
336+ s || defaultSearch
337+ ) ( ) ;
338+ } ) ;
339+
340+ // Load the Wisp transport mode that was last used, or use the default.
341+ useStorageArgs ( 'Transport' , ( s ) => {
342+ classUpdateHandler (
343+ document . getElementsByClassName ( 'wisp-transport-list' ) ,
344+ s || defaultMode
345+ ) ( ) ;
346+ } ) ;
347+
348+ // Ads are disabled by default. Load ads if ads were enabled previously.
349+ // Change !== to === here if ads should be enabled by default.
350+ useStorageArgs ( 'HideAds' , ( s ) => {
351+ if ( s !== false ) pageHideAds ( ) ;
352+ else {
353+ pageShowAds ( ) ;
354+ classUpdateHandler ( document . getElementsByClassName ( 'hideads' ) , 'off' ) ( ) ;
355+ }
356+ } ) ;
357+
358+ // Tor is disabled by default. Enable Tor if it was enabled previously.
359+ useStorageArgs ( 'UseSocks5' , ( s ) => {
360+ const tor = document . getElementsByClassName ( 'useonion' ) ,
361+ regionList = document . getElementsByClassName ( 'region-list' ) ;
362+ if ( s === 'tor' ) classUpdateHandler ( tor , 'on' , classEvent ( tor , 'change' ) ) ( ) ;
363+ else if ( 'string' === typeof s ) classUpdateHandler ( regionList , s ) ( ) ;
364+ } ) ;
327365} ) ( ) ;
0 commit comments