mirror of
				https://github.com/anticensority/runet-censorship-bypass.git
				synced 2025-10-31 16:07:31 +03:00 
			
		
		
		
	Fix exceptions UI (final), fix block-informer async bugs
This commit is contained in:
		
							parent
							
								
									400771eff4
								
							
						
					
					
						commit
						c5c1ac559e
					
				|  | @ -188,7 +188,7 @@ | |||
| 
 | ||||
|   const self = window.apis.ipToHost = { | ||||
| 
 | ||||
|     persistVoid() { | ||||
|     persist() { | ||||
| 
 | ||||
|       console.log('Persisting ipToHost...', privates); | ||||
|       const ipToHost = {}; | ||||
|  | @ -199,15 +199,16 @@ | |||
| 
 | ||||
|     }, | ||||
| 
 | ||||
|     resetToDefaultsVoid() { | ||||
|     resetToDefaults() { | ||||
| 
 | ||||
|       _state(ip2host, null); | ||||
|       reinit(); | ||||
| 
 | ||||
|     }, | ||||
| 
 | ||||
|     _purgeIpsForVoid(hostStr) { | ||||
|     _purgeOldIpsForSync(hostStr) { | ||||
| 
 | ||||
|       console.log('Purging old IPs...'); | ||||
|       for(const ip of Object.keys(privates._ipToHostObj)) { | ||||
|         delete privates._ipToHostObj[ip]; | ||||
|       } | ||||
|  | @ -218,22 +219,25 @@ | |||
| 
 | ||||
|       getIpsFor(hostStr, (err, ips, ...warns) => { | ||||
| 
 | ||||
|         console.log('IPS', ips); | ||||
|         console.log('IPS', ips, err); | ||||
|         if (!err) { | ||||
|           this._purgeIpsForVoid(hostStr); | ||||
|           this._purgeOldIpsForSync(hostStr); | ||||
|           // Object may be shared, string can't.
 | ||||
|           const hostObj = _getHostObj(hostStr); | ||||
|           for(const ip of ips) { | ||||
|             console.log('IP', ip); | ||||
|             privates._ipToHostObj[ip] = hostObj; | ||||
|             console.log(privates._ipToHostObj[ip], privates); | ||||
|           } | ||||
|         } | ||||
|         console.log('PP', privates); | ||||
|         return cb(err, null, ...warns); | ||||
| 
 | ||||
|       }); | ||||
| 
 | ||||
|     }, | ||||
| 
 | ||||
|     updateAllAsync(cb = mandatory()) { | ||||
|     _updateAllAsync(cb = mandatory()) { | ||||
| 
 | ||||
|       const hostArr = Object.keys(privates._strToHostObj); | ||||
| 
 | ||||
|  | @ -267,6 +271,20 @@ | |||
| 
 | ||||
|     }, | ||||
| 
 | ||||
| 
 | ||||
|     updateAllAsync(cb = mandatory()) { | ||||
| 
 | ||||
|       this._updateAllAsync((err, ...args) => { | ||||
| 
 | ||||
|         if (!err) { | ||||
|           this.persist(); | ||||
|         } | ||||
|         cb(err, ...args); | ||||
| 
 | ||||
|       }); | ||||
| 
 | ||||
|     }, | ||||
| 
 | ||||
|     _replaceAllAsync(hostArr = mandatory(), cb) { | ||||
| 
 | ||||
|       if (typeof(hostArr) === 'function') { | ||||
|  | @ -274,12 +292,12 @@ | |||
|         hostArr = Object.keys(privates._strToHostObj); | ||||
|       } | ||||
| 
 | ||||
|       this.resetToDefaultsVoid(); | ||||
|       this.resetToDefaults(); | ||||
|       for(const hostStr of hostArr) { | ||||
|         _createHostObj(hostStr); | ||||
|       } | ||||
| 
 | ||||
|       this.updateAllAsync(cb); | ||||
|       this._updateAllAsync(cb); | ||||
| 
 | ||||
|     }, | ||||
| 
 | ||||
|  | @ -296,7 +314,7 @@ | |||
|       this._replaceAllAsync(hostArr, (allErr, ...args) => { | ||||
| 
 | ||||
|         if (!allErr) { | ||||
|           this.persistVoid(); | ||||
|           this.persist(); | ||||
|         } | ||||
|         cb(allErr, ...args); | ||||
| 
 | ||||
|  |  | |||
|  | @ -332,7 +332,7 @@ | |||
| 
 | ||||
|     }, | ||||
| 
 | ||||
|     resetToDefaultsVoid() { | ||||
|     resetToDefaults() { | ||||
| 
 | ||||
|       // Pruge all but exceptions.
 | ||||
|       const exceptions = kitchenState(modsKey).exceptions; | ||||
|  |  | |||
|  | @ -351,7 +351,7 @@ | |||
| 
 | ||||
|         <div style="display: flex; justify-content: space-around;"> | ||||
|           <span>Проксировать</span> | ||||
|           <input placeholder="*.example.com" list="exc-list" name="browser" id="exc-editor"/>? | ||||
|           <input placeholder="navalny.com" list="exc-list" name="browser" id="exc-editor"/>? | ||||
|           <datalist id="exc-list"></datalist> | ||||
|         </div> | ||||
|         <ol class="acc-padded horizontal-list" id="exc-radio"> | ||||
|  |  | |||
|  | @ -244,11 +244,6 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => | |||
|       } | ||||
| 
 | ||||
|       // EXCEPTIONS PANEL
 | ||||
|       /* | ||||
|         Iterating and modifying select.selectedOptions | ||||
|         at the same time is buggy, iterate this way instead: | ||||
|         [...select.selectedOptions] | ||||
|       */ | ||||
| 
 | ||||
|       { | ||||
| 
 | ||||
|  | @ -273,14 +268,12 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => | |||
| 
 | ||||
|           }; | ||||
| 
 | ||||
|           const excPrefix = '*.'; | ||||
|           const prefRe = new RegExp('^(\\s*\\*\\.?)?'); | ||||
|           const ifProxyHtml = '✔'; | ||||
| 
 | ||||
|           const addOption = function addOption(host, ifProxy) { | ||||
| 
 | ||||
|             const opt = document.createElement('option'); | ||||
|             opt.value = excPrefix + host; | ||||
|             opt.value = host; | ||||
|             opt.dataset.host = host; | ||||
|             opt.innerHTML = ifProxy ? ifProxyHtml : '✘'; | ||||
|             const editorHost = excEditor.value.trim(); | ||||
|  | @ -292,17 +285,6 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => | |||
| 
 | ||||
|           }; | ||||
| 
 | ||||
|           const excList = document.getElementById('exc-list'); | ||||
|           const getExactOpts = (_host) => { | ||||
| 
 | ||||
|             const _nakedHost = _host.replace(prefRe, ''); | ||||
|             return [].filter.call( | ||||
|               excList.childNodes, | ||||
|               (opt) => opt.dataset.host === _nakedHost | ||||
|             ); | ||||
| 
 | ||||
|           }; | ||||
| 
 | ||||
|           const thisYes = document.getElementById('this-yes'); | ||||
|           const thisNo = document.getElementById('this-no'); | ||||
|           const thisAuto = document.getElementById('this-auto'); | ||||
|  | @ -319,88 +301,65 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => | |||
| 
 | ||||
|           } | ||||
| 
 | ||||
|           const hideOpt = (opt) => opt.value = '\n'; | ||||
|           const unhideOpt = (opt) => opt.value = opt.dataset.host + ' '; | ||||
| 
 | ||||
|           const excList = document.getElementById('exc-list');           | ||||
| 
 | ||||
|           excEditor.onkeydown = function(event) { | ||||
| 
 | ||||
|             console.log('DOWN', event); | ||||
|             moveCursorIfNeeded(); | ||||
|             const start = this.selectionStart; | ||||
|             const end = this.selectionEnd; | ||||
|             if (start < 2 && event.key.length === 1) { | ||||
|               this.setSelectionRange(2, end < 2 ? 2 : end); | ||||
|             } | ||||
|             if(event.key === 'Enter') { | ||||
|               // Hide all non-exact matches.
 | ||||
|               alert(12); | ||||
|               // Hide all.
 | ||||
|               excList.childNodes.forEach( hideOpt ); | ||||
|             } | ||||
|             return true; | ||||
| 
 | ||||
|           }; | ||||
| 
 | ||||
|           excEditor.oninput = function(event) { | ||||
|           excEditor.onclick = excEditor.oninput = function(event) { | ||||
| 
 | ||||
|             console.log('INPUT') | ||||
|             const _host = this.value; | ||||
|             const prefixedHost = this.value.replace(prefRe, excPrefix); | ||||
|             const setInputValue = (newValue) => { | ||||
| 
 | ||||
|               if (event && event.type === 'click') { | ||||
|                 return; | ||||
|               }  | ||||
|               // See bug in my comment to http://stackoverflow.com/a/32394157/521957
 | ||||
|               // The only shortcoming: first click on empty input may be still ignored.
 | ||||
|               const nu = this.selectionStart + newValue.length - this.value.length; | ||||
|               this.value = newValue; | ||||
|               excEditor.dataset.moveCursorTo = nu; | ||||
|               window.setTimeout(moveCursorIfNeeded, 0); | ||||
| 
 | ||||
|             } | ||||
|             setInputValue(prefixedHost); | ||||
|             const _nakedHost = _host.trim().replace(prefRe, ''); | ||||
|             const host = this.value.trim() || ' '; | ||||
| 
 | ||||
|             setInputValue(host); | ||||
| 
 | ||||
|             thisAuto.checked = true; | ||||
| 
 | ||||
|             const toDefault = (opt) => opt.value = excPrefix + opt.dataset.host;; | ||||
| 
 | ||||
|             const delim = ' | '; | ||||
|             let exactOpt = false; | ||||
|             const ifLineSelected = _host.includes(delim); | ||||
|             this.classList.remove(noClass, yesClass); | ||||
|             excList.childNodes.forEach( | ||||
|               (opt) => { | ||||
| 
 | ||||
|                 const ifExactMatch = opt.dataset.host === _nakedHost || opt.value === _host; | ||||
|                 if (ifExactMatch) { | ||||
|                   exactOpt = opt; | ||||
|                   return; | ||||
|                 const ifExactMatch = opt.dataset.host === host; | ||||
|                 if (!ifExactMatch) { | ||||
|                   return unhideOpt(opt); | ||||
|                 } | ||||
|                 toDefault(opt); | ||||
|                 const ifCommonPrefix = opt.dataset.host.startsWith(_nakedHost); | ||||
|                 if (ifCommonPrefix) { | ||||
|                   opt.value = prefixedHost + delim + '^' + opt.dataset.host; | ||||
|                   return; | ||||
|                 } | ||||
|                 const ifCommonSuffix = opt.dataset.host.endsWith(_nakedHost); | ||||
|                 if (ifCommonSuffix) { | ||||
|                   opt.value = this.value + delim + opt.dataset.host + '$'; | ||||
| 
 | ||||
|                 const exactOpt = opt; | ||||
| 
 | ||||
|                 hideOpt(exactOpt); | ||||
|                 if(exactOpt.innerHTML === ifProxyHtml) { | ||||
|                   thisYes.checked = true; | ||||
|                   this.classList.add(yesClass); | ||||
|                 } else { | ||||
|                   thisNo.checked = true; | ||||
|                   this.classList.add(noClass); | ||||
|                 } | ||||
| 
 | ||||
|               } | ||||
|             ); | ||||
|             this.classList.remove(noClass, yesClass); | ||||
|             if (exactOpt) { | ||||
|               console.log('EXACT', exactOpt); | ||||
|               //excList.childNodes.forEach( (opt) => opt.value = false );
 | ||||
|               setInputValue(toDefault(exactOpt)); | ||||
|               if (ifLineSelected) { | ||||
|                 // Hide all.
 | ||||
|                 excList.childNodes.forEach( (opt) => opt.value = false ); | ||||
|               } else { | ||||
|                 // Hide exact.
 | ||||
|                 exactOpt.value = false; | ||||
|               } | ||||
| 
 | ||||
|               if(exactOpt.innerHTML === ifProxyHtml) { | ||||
|                 thisYes.checked = true; | ||||
|                 this.classList.add(yesClass); | ||||
|               } else { | ||||
|                 thisNo.checked = true; | ||||
|                 this.classList.add(noClass); | ||||
|               } | ||||
|             } | ||||
|             return true; | ||||
| 
 | ||||
|           }; | ||||
|  | @ -422,7 +381,7 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => | |||
|               return true; | ||||
|             } | ||||
| 
 | ||||
|             const _host = excEditor.value.trim().replace(prefRe, ''); | ||||
|             const host = excEditor.value.trim(); | ||||
| 
 | ||||
|             const pacMods = pacKitchen.getPacMods(); | ||||
|             pacMods.exceptions = pacMods.exceptions || {}; | ||||
|  | @ -430,11 +389,11 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => | |||
|             let fixUi = () => {}; | ||||
| 
 | ||||
|             if (thisAuto.checked) { | ||||
|               delete pacMods.exceptions[_host]; | ||||
|               delete pacMods.exceptions[host]; | ||||
|               fixUi = () => excEditor.value = ''; | ||||
|             } else { | ||||
|               // YES or NO.
 | ||||
|               if (!validateHost(_host)) { | ||||
|               if (!validateHost(host)) { | ||||
|                 return false; | ||||
|               } | ||||
|               if (thisYes.checked && !pacMods.filteredCustomsString) { | ||||
|  | @ -443,8 +402,8 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => | |||
|                 )); | ||||
|                 return false; | ||||
|               } | ||||
|               pacMods.exceptions[_host] = thisYes.checked; | ||||
|               fixUi = () => addOption(_host, thisYes.checked); | ||||
|               pacMods.exceptions[host] = thisYes.checked; | ||||
|               fixUi = () => addOption(host, thisYes.checked); | ||||
|             } | ||||
| 
 | ||||
|             conduct( | ||||
|  | @ -453,7 +412,9 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => | |||
|               'Исключения применены.', | ||||
|               () => { | ||||
| 
 | ||||
|                 getExactOpts(_host).forEach( (opt) => opt.remove() ); | ||||
|                 excList.childNodes.forEach( | ||||
|                   (opt) => opt.dataset.host === host && opt.remove() | ||||
|                 ); | ||||
|                 fixUi(); | ||||
|                 excEditor.oninput(); | ||||
| 
 | ||||
|  | @ -557,8 +518,8 @@ HTTPS 11.22.33.44:8080;">${conf.value || localStorage.getItem(uiRaw) || ''}</tex | |||
|           if (!ifSure) { | ||||
|             return false; | ||||
|           } | ||||
|           pacKitchen.resetToDefaultsVoid(); | ||||
|           backgroundPage.apis.ipToHost.resetToDefaultsVoid(); | ||||
|           pacKitchen.resetToDefaults(); | ||||
|           backgroundPage.apis.ipToHost.resetToDefaults(); | ||||
|           window.close(); | ||||
| 
 | ||||
|         }; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user