mirror of
https://github.com/anticensority/runet-censorship-bypass.git
synced 2024-11-24 02:13:43 +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