Rename extension, add non-ascii hack, fix context menu links, lint,
refactor
|
@ -13,6 +13,7 @@ module.exports = {
|
|||
},
|
||||
"parserOptions": {
|
||||
"sourceType": "script",
|
||||
"ecmaVersion": 2017,
|
||||
"ecmaFeatures": {
|
||||
"impliedStrict": false
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
# Перемещено [сюда](https://rebrand.ly/ac-support)
|
Before Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 9.1 KiB |
|
@ -1,215 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
chrome.runtime.getBackgroundPage( (backgroundPage) =>
|
||||
backgroundPage.apis.errorHandlers.installListenersOnAsync(window, 'POPUP', () => {
|
||||
|
||||
const getStatus = () => document.querySelector('#status');
|
||||
|
||||
const setStatusTo = (msg) => {
|
||||
|
||||
getStatus().innerHTML = msg;
|
||||
|
||||
};
|
||||
|
||||
const antiCensorRu = backgroundPage.apis.antiCensorRu;
|
||||
const errorHandlers = backgroundPage.apis.errorHandlers;
|
||||
|
||||
// SET DATE
|
||||
|
||||
const setDate = () => {
|
||||
|
||||
let dateForUser = 'никогда';
|
||||
if( antiCensorRu.lastPacUpdateStamp ) {
|
||||
let diff = Date.now() - antiCensorRu.lastPacUpdateStamp;
|
||||
let units = 'мс';
|
||||
const gauges = [
|
||||
[1000, 'с'],
|
||||
[60, 'мин'],
|
||||
[60, 'ч'],
|
||||
[24, 'дн'],
|
||||
[7, ' недель'],
|
||||
[4, ' месяцев'],
|
||||
];
|
||||
for(const g of gauges) {
|
||||
const diffy = Math.floor(diff / g[0]);
|
||||
if (!diffy)
|
||||
break;
|
||||
diff = diffy;
|
||||
units = g[1];
|
||||
}
|
||||
dateForUser = diff + units + ' назад';
|
||||
}
|
||||
|
||||
const dateElement = document.querySelector('.update-date');
|
||||
dateElement.innerText = dateForUser + ' / ' + (antiCensorRu.pacUpdatePeriodInMinutes/60) + 'ч';
|
||||
dateElement.title = new Date(antiCensorRu.lastPacUpdateStamp)
|
||||
.toLocaleString('ru-RU');
|
||||
|
||||
};
|
||||
|
||||
setDate();
|
||||
chrome.storage.onChanged.addListener(
|
||||
(changes) => changes.lastPacUpdateStamp.newValue && setDate()
|
||||
);
|
||||
|
||||
// CLOSE BUTTON
|
||||
|
||||
document.querySelector('.close-button').onclick = () => window.close();
|
||||
|
||||
// RADIOS
|
||||
|
||||
const currentProviderRadio = () => {
|
||||
|
||||
const id = antiCensorRu.currentPacProviderKey || 'none';
|
||||
return document.querySelector('#'+id);
|
||||
|
||||
};
|
||||
const checkChosenProvider = () => currentProviderRadio().checked = true;
|
||||
|
||||
const showError = (err) => {
|
||||
|
||||
let clarification = err.clarification;
|
||||
const ifNotCritical = clarification && clarification.ifNotCritical;
|
||||
let message = err.message || '';
|
||||
|
||||
while( clarification ) {
|
||||
message = (clarification && (clarification.message + ' ')) + message;
|
||||
clarification = clarification.prev;
|
||||
}
|
||||
message = message.trim();
|
||||
setStatusTo(
|
||||
`<span style="color:red">
|
||||
${ifNotCritical ? 'Некритичная ошибка.' : 'Ошибка!'}
|
||||
</span>
|
||||
<br/>
|
||||
<span style="font-size: 0.9em; color: darkred">${message}</span>
|
||||
<a href class="link-button">
|
||||
[Ещё подробнее]
|
||||
</a>`
|
||||
);
|
||||
getStatus().querySelector('.link-button').onclick = function() {
|
||||
|
||||
errorHandlers.viewErrorVoid(err);
|
||||
return false;
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
const enableDisableInputs = function() {
|
||||
|
||||
const inputs = document.querySelectorAll('input');
|
||||
for ( let i = 0; i < inputs.length; i++ ) {
|
||||
inputs[i].disabled = !inputs[i].disabled;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
const conduct = (beforeStatus, operation, afterStatus, onSuccess) => {
|
||||
|
||||
setStatusTo(beforeStatus);
|
||||
enableDisableInputs();
|
||||
operation((err) => {
|
||||
if (err) {
|
||||
showError(err);
|
||||
} else {
|
||||
setStatusTo(afterStatus);
|
||||
onSuccess && onSuccess();
|
||||
}
|
||||
enableDisableInputs();
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
const ul = document.querySelector('#list-of-providers');
|
||||
const _firstChild = ul.firstChild;
|
||||
for( const providerKey of Object.keys(antiCensorRu.pacProviders).sort() ) {
|
||||
const li = document.createElement('li');
|
||||
li.innerHTML = `
|
||||
<input type="radio" name="pacProvider" id="${providerKey}">
|
||||
<label for="${providerKey}">${providerKey}</label>
|
||||
<a href class="link-button checked-radio-panel"
|
||||
id="update-${providerKey}">[обновить]</a>`;
|
||||
li.querySelector('.link-button').onclick =
|
||||
() => {
|
||||
conduct(
|
||||
'Обновляем...', (cb) => antiCensorRu.syncWithPacProviderAsync(cb),
|
||||
'Обновлено.'
|
||||
);
|
||||
return false;
|
||||
};
|
||||
ul.insertBefore( li, _firstChild );
|
||||
}
|
||||
checkChosenProvider();
|
||||
|
||||
const radios = [].slice.apply(
|
||||
document.querySelectorAll('[name=pacProvider]')
|
||||
);
|
||||
for(const radio of radios) {
|
||||
radio.onclick = function(event) {
|
||||
|
||||
if (
|
||||
event.target.id === (antiCensorRu.currentPacProviderKey || 'none')
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
const pacKey = event.target.id;
|
||||
if (pacKey === 'none') {
|
||||
conduct(
|
||||
'Отключение...',
|
||||
(cb) => antiCensorRu.clearPacAsync(cb),
|
||||
'Отключено.',
|
||||
checkChosenProvider
|
||||
);
|
||||
} else {
|
||||
conduct(
|
||||
'Установка...',
|
||||
(cb) => antiCensorRu.installPacAsync(pacKey, cb),
|
||||
'PAC-скрипт установлен.',
|
||||
checkChosenProvider
|
||||
);
|
||||
}
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
const conpanel = document.getElementById('list-of-handlers');
|
||||
errorHandlers.getEventsMap().forEach( (value, name) => {
|
||||
|
||||
const li = document.createElement('li');
|
||||
li.innerHTML = `
|
||||
<input type="checkbox" id="if-on-${name}"/>
|
||||
<label for="if-on-${name}">${value}</label>`;
|
||||
const box = li.querySelector('input');
|
||||
box.checked = backgroundPage.apis.errorHandlers.isOn(name);
|
||||
box.onclick = function() {
|
||||
|
||||
const id = this.id.replace('if-on-', '');
|
||||
return backgroundPage.apis.errorHandlers.switchVoid(
|
||||
this.checked ? 'on' : 'off',
|
||||
id
|
||||
);
|
||||
|
||||
};
|
||||
conpanel.appendChild(li);
|
||||
|
||||
});
|
||||
|
||||
if( errorHandlers.ifNotControlled ) {
|
||||
document.getElementById('which-extension').innerHTML = backgroundPage.utils.messages.whichExtensionHtml();
|
||||
document.querySelectorAll('.if-not-controlled').forEach( (node) => {
|
||||
|
||||
node.style.display = 'block';
|
||||
|
||||
});
|
||||
}
|
||||
setStatusTo('');
|
||||
|
||||
if (antiCensorRu.ifFirstInstall) {
|
||||
const id = antiCensorRu.currentPacProviderKey || 'none';
|
||||
document.querySelector('#update-' + id).click();
|
||||
}
|
||||
document.documentElement.style.display = '';
|
||||
|
||||
})
|
||||
);
|
|
@ -5,7 +5,7 @@
|
|||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"lint": "./node_modules/.bin/eslint ./extension/**/*.js --ignore-pattern vendor"
|
||||
"lint": "./node_modules/.bin/eslint ./runet-censorship-bypass/extension/**/*.js --ignore-pattern vendor"
|
||||
},
|
||||
"author": "Ilya Ig. Petrov",
|
||||
"license": "GPLv3",
|
|
@ -122,7 +122,9 @@
|
|||
|
||||
this.ifNotControlled = window.utils.areSettingsNotControlledFor(details);
|
||||
if (this.ifNotControlled) {
|
||||
chrome.browserAction.setIcon( {path: './icons/default-grayscale-128.png'} );
|
||||
chrome.browserAction.setIcon({
|
||||
path: './icons/default-grayscale-128.png',
|
||||
});
|
||||
} else {
|
||||
chrome.browserAction.setIcon( {path: './icons/default-128.png'} );
|
||||
}
|
||||
|
@ -201,7 +203,9 @@
|
|||
|
||||
chrome.notifications.clear(notId);
|
||||
if(notId === 'no-control') {
|
||||
return openAndFocus( window.utils.messages.searchSettingsForUrl('proxy') );
|
||||
return openAndFocus(
|
||||
window.utils.messages.searchSettingsForUrl('proxy')
|
||||
);
|
||||
}
|
||||
const errors = handlers.idToError;
|
||||
handlers.viewErrorVoid(errors);
|
|
@ -113,9 +113,9 @@
|
|||
/*
|
||||
Don't use in system configs! Because Win does poor caching.
|
||||
Url is encoded to counter abuse.
|
||||
Version: 0.15
|
||||
Version: 0.17
|
||||
*/
|
||||
pacUrl: '\x68\x74\x74\x70\x73\x3a\x2f\x2f\x64\x72\x69\x76\x65\x2e\x67\x6f\x6f\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x75\x63\x3f\x65\x78\x70\x6f\x72\x74\x3d\x64\x6f\x77\x6e\x6c\x6f\x61\x64\x26\x69\x64\x3d\x30\x42\x2d\x5a\x43\x56\x53\x76\x75\x4e\x57\x66\x30\x62\x7a\x4e\x55\x52\x32\x46\x34\x52\x46\x38\x77\x4f\x55\x30',
|
||||
pacUrl: '\x68\x74\x74\x70\x73\x3a\x2f\x2f\x64\x72\x69\x76\x65\x2e\x67\x6f\x6f\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x75\x63\x3f\x65\x78\x70\x6f\x72\x74\x3d\x64\x6f\x77\x6e\x6c\x6f\x61\x64\x26\x69\x64\x3d\x30\x42\x2d\x5a\x43\x56\x53\x76\x75\x4e\x57\x66\x30\x54\x44\x46\x52\x4f\x47\x35\x46\x62\x55\x39\x4f\x64\x44\x67',
|
||||
proxyHosts: ['proxy.antizapret.prostovpn.org', 'gw2.anticenz.org'],
|
||||
proxyIps: {
|
||||
'195.123.209.38': 'proxy.antizapret.prostovpn.org',
|
||||
|
@ -224,7 +224,7 @@
|
|||
const pacProvider = this.getPacProvider(key);
|
||||
|
||||
const pacSetPromise = new Promise(
|
||||
(resolve, reject) => setPacScriptFromProvider(
|
||||
(resolve, reject) => setPacScriptFromProviderAsync(
|
||||
pacProvider,
|
||||
(err, res) => {
|
||||
|
||||
|
@ -444,7 +444,10 @@
|
|||
|
||||
});
|
||||
|
||||
function setPacAsync(pacData, cb = throwIfError) {
|
||||
function setPacAsync(
|
||||
{pacData = mandatory(), pacUrl = mandatory()},
|
||||
cb = throwIfError
|
||||
) {
|
||||
|
||||
const config = {
|
||||
mode: 'pac_script',
|
||||
|
@ -454,20 +457,44 @@
|
|||
},
|
||||
};
|
||||
console.log('Setting chrome proxy settings...');
|
||||
chrome.proxy.settings.set( {value: config}, () => {
|
||||
chrome.proxy.settings.set( {value: config}, async () => {
|
||||
|
||||
const err = checkChromeError();
|
||||
let err = checkChromeError();
|
||||
let asciiErr;
|
||||
if (err) {
|
||||
return cb(err);
|
||||
if (err.message.startsWith('\'pacScript.data\' supports only ASCII')) {
|
||||
asciiErr = err;
|
||||
asciiErr.clarification = {ifNotCritical: true};
|
||||
err = await new Promise((resolve) => {
|
||||
|
||||
chrome.proxy.settings.set({
|
||||
value: {
|
||||
mode: 'pac_script',
|
||||
pacScript: {
|
||||
url: pacUrl,
|
||||
},
|
||||
},
|
||||
},
|
||||
() => resolve( checkChromeError() )
|
||||
);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
if (err) {
|
||||
return cb(err);
|
||||
}
|
||||
}
|
||||
chrome.proxy.settings.get({}, (details) => {
|
||||
|
||||
if ( window.utils.areSettingsNotControlledFor( details ) ) {
|
||||
console.warn('Failed, other extension is in control.');
|
||||
return cb({clarification: {message: window.utils.messages.whichExtensionHtml() }});
|
||||
return cb({clarification: {
|
||||
message: window.utils.messages.whichExtensionHtml(),
|
||||
}});
|
||||
}
|
||||
console.log('Successfuly set PAC in proxy settings..');
|
||||
cb();
|
||||
cb(asciiErr);
|
||||
});
|
||||
|
||||
});
|
||||
|
@ -606,15 +633,16 @@
|
|||
|
||||
}
|
||||
|
||||
function setPacScriptFromProvider(provider, cb = throwIfError) {
|
||||
function setPacScriptFromProviderAsync(provider, cb = throwIfError) {
|
||||
|
||||
cb = asyncLogGroup(
|
||||
'Getting pac script from provider...', provider.pacUrl,
|
||||
cb
|
||||
);
|
||||
|
||||
const pacUrl = provider.pacUrl;
|
||||
httpGet(
|
||||
provider.pacUrl,
|
||||
pacUrl,
|
||||
(err, pacData) => {
|
||||
|
||||
if (err) {
|
||||
|
@ -625,7 +653,7 @@
|
|||
};
|
||||
return cb(err);
|
||||
}
|
||||
setPacAsync(pacData, cb);
|
||||
setPacAsync({pacData, pacUrl}, cb);
|
||||
|
||||
}
|
||||
);
|
|
@ -12,12 +12,18 @@
|
|||
|
||||
createMenuLinkEntry(
|
||||
'Сайт доступен из-за границы? Is up?',
|
||||
(tab) => 'http://isup.me/' + new URL(tab.url).hostname
|
||||
(tab) => `data:text/html;charset=utf8,<title>Запрашиваю...</title>
|
||||
<form class='tracker-form' method='POST'
|
||||
action='https://www.host-tracker.com/ru/InstantCheck/Create'>
|
||||
<input name='InstantCheckUrl' value='${new URL(tab.url).hostname}'
|
||||
type='hidden'>
|
||||
</form>
|
||||
<script>document.querySelector('.tracker-form').submit()<\/script>`
|
||||
);
|
||||
|
||||
createMenuLinkEntry(
|
||||
'Сайт в реестре блокировок?',
|
||||
(tab) => 'https://antizapret.info/index.php?search=' + tab.url
|
||||
(tab) => 'https://antizapret.info/index.php?search=' + new URL(tab.url).hostname
|
||||
);
|
||||
|
||||
createMenuLinkEntry(
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.8 KiB |
After Width: | Height: | Size: 9.3 KiB |
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 9.6 KiB |
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"manifest_version": 2,
|
||||
|
||||
"name": "__MSG_extName__",
|
||||
"name": "__MSG_extName__ 0.17",
|
||||
"default_locale": "ru",
|
||||
"description": "__MSG_extDesc__",
|
||||
"version": "0.0.0.16",
|
||||
"version": "0.0.0.17",
|
||||
"icons": {
|
||||
"128": "/icons/default-128.png"
|
||||
},
|
||||
|
@ -33,7 +33,7 @@
|
|||
]
|
||||
},
|
||||
"browser_action": {
|
||||
"default_title": "Этот сайт благословлён",
|
||||
"default_title": "Этот сайт благословлён 0.17",
|
||||
"default_popup": "/pages/choose-pac-provider/index.html"
|
||||
},
|
||||
"options_ui": {
|
|
@ -56,6 +56,7 @@
|
|||
}
|
||||
.if-not-controlled {
|
||||
display: none;
|
||||
color: red;
|
||||
}
|
||||
</style>
|
||||
</head>
|
|
@ -0,0 +1,220 @@
|
|||
'use strict';
|
||||
|
||||
chrome.runtime.getBackgroundPage( (backgroundPage) =>
|
||||
backgroundPage.apis.errorHandlers.installListenersOnAsync(
|
||||
window, 'POPUP', () => {
|
||||
|
||||
const getStatus = () => document.querySelector('#status');
|
||||
|
||||
const setStatusTo = (msg) => {
|
||||
|
||||
getStatus().innerHTML = msg;
|
||||
|
||||
};
|
||||
|
||||
const antiCensorRu = backgroundPage.apis.antiCensorRu;
|
||||
const errorHandlers = backgroundPage.apis.errorHandlers;
|
||||
|
||||
// SET DATE
|
||||
|
||||
const setDate = () => {
|
||||
|
||||
let dateForUser = 'никогда';
|
||||
if( antiCensorRu.lastPacUpdateStamp ) {
|
||||
let diff = Date.now() - antiCensorRu.lastPacUpdateStamp;
|
||||
let units = 'мс';
|
||||
const gauges = [
|
||||
[1000, 'с'],
|
||||
[60, 'мин'],
|
||||
[60, 'ч'],
|
||||
[24, 'дн'],
|
||||
[7, ' недель'],
|
||||
[4, ' месяцев'],
|
||||
];
|
||||
for(const g of gauges) {
|
||||
const diffy = Math.floor(diff / g[0]);
|
||||
if (!diffy)
|
||||
break;
|
||||
diff = diffy;
|
||||
units = g[1];
|
||||
}
|
||||
dateForUser = diff + units + ' назад';
|
||||
}
|
||||
|
||||
const dateElement = document.querySelector('.update-date');
|
||||
dateElement.innerText = dateForUser + ' / ' +
|
||||
(antiCensorRu.pacUpdatePeriodInMinutes/60) + 'ч';
|
||||
dateElement.title = new Date(antiCensorRu.lastPacUpdateStamp)
|
||||
.toLocaleString('ru-RU');
|
||||
|
||||
};
|
||||
|
||||
setDate();
|
||||
chrome.storage.onChanged.addListener(
|
||||
(changes) => changes.lastPacUpdateStamp.newValue && setDate()
|
||||
);
|
||||
|
||||
// CLOSE BUTTON
|
||||
|
||||
document.querySelector('.close-button').onclick = () => window.close();
|
||||
|
||||
// RADIOS
|
||||
|
||||
const currentProviderRadio = () => {
|
||||
|
||||
const id = antiCensorRu.currentPacProviderKey || 'none';
|
||||
return document.querySelector('#'+id);
|
||||
|
||||
};
|
||||
const checkChosenProvider = () => currentProviderRadio().checked = true;
|
||||
|
||||
const showError = (err) => {
|
||||
|
||||
let clarification = err.clarification;
|
||||
const ifNotCritical = clarification && clarification.ifNotCritical;
|
||||
let message = err.message || '';
|
||||
|
||||
while( clarification ) {
|
||||
message = (clarification && (clarification.message + ' ')) + message;
|
||||
clarification = clarification.prev;
|
||||
}
|
||||
message = message.trim();
|
||||
setStatusTo(
|
||||
`<span style="color:red">
|
||||
${ifNotCritical ? 'Некритичная ошибка.' : 'Ошибка!'}
|
||||
</span>
|
||||
<br/>
|
||||
<span style="font-size: 0.9em; color: darkred">${message}</span>
|
||||
<a href class="link-button">
|
||||
[Ещё подробнее]
|
||||
</a>`
|
||||
);
|
||||
getStatus().querySelector('.link-button').onclick = function() {
|
||||
|
||||
errorHandlers.viewErrorVoid(err);
|
||||
return false;
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
const enableDisableInputs = function() {
|
||||
|
||||
const inputs = document.querySelectorAll('input');
|
||||
for ( let i = 0; i < inputs.length; i++ ) {
|
||||
inputs[i].disabled = !inputs[i].disabled;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
const conduct = (beforeStatus, operation, afterStatus, onSuccess) => {
|
||||
|
||||
setStatusTo(beforeStatus);
|
||||
enableDisableInputs();
|
||||
operation((err) => {
|
||||
if (err) {
|
||||
showError(err);
|
||||
} else {
|
||||
setStatusTo(afterStatus);
|
||||
onSuccess && onSuccess();
|
||||
}
|
||||
enableDisableInputs();
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
const ul = document.querySelector('#list-of-providers');
|
||||
const _firstChild = ul.firstChild;
|
||||
for(
|
||||
const providerKey of Object.keys(antiCensorRu.pacProviders).sort()
|
||||
) {
|
||||
const li = document.createElement('li');
|
||||
li.innerHTML = `
|
||||
<input type="radio" name="pacProvider" id="${providerKey}">
|
||||
<label for="${providerKey}">${providerKey}</label>
|
||||
<a href class="link-button checked-radio-panel"
|
||||
id="update-${providerKey}">[обновить]</a>`;
|
||||
li.querySelector('.link-button').onclick =
|
||||
() => {
|
||||
conduct(
|
||||
'Обновляем...', (cb) => antiCensorRu.syncWithPacProviderAsync(cb),
|
||||
'Обновлено.'
|
||||
);
|
||||
return false;
|
||||
};
|
||||
ul.insertBefore( li, _firstChild );
|
||||
}
|
||||
checkChosenProvider();
|
||||
|
||||
const radios = [].slice.apply(
|
||||
document.querySelectorAll('[name=pacProvider]')
|
||||
);
|
||||
for(const radio of radios) {
|
||||
radio.onclick = function(event) {
|
||||
|
||||
if (
|
||||
event.target.id === (antiCensorRu.currentPacProviderKey || 'none')
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
const pacKey = event.target.id;
|
||||
if (pacKey === 'none') {
|
||||
conduct(
|
||||
'Отключение...',
|
||||
(cb) => antiCensorRu.clearPacAsync(cb),
|
||||
'Отключено.',
|
||||
checkChosenProvider
|
||||
);
|
||||
} else {
|
||||
conduct(
|
||||
'Установка...',
|
||||
(cb) => antiCensorRu.installPacAsync(pacKey, cb),
|
||||
'PAC-скрипт установлен.',
|
||||
checkChosenProvider
|
||||
);
|
||||
}
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
const conpanel = document.getElementById('list-of-handlers');
|
||||
errorHandlers.getEventsMap().forEach( (value, name) => {
|
||||
|
||||
const li = document.createElement('li');
|
||||
li.innerHTML = `
|
||||
<input type="checkbox" id="if-on-${name}"/>
|
||||
<label for="if-on-${name}">${value}</label>`;
|
||||
const box = li.querySelector('input');
|
||||
box.checked = backgroundPage.apis.errorHandlers.isOn(name);
|
||||
box.onclick = function() {
|
||||
|
||||
const id = this.id.replace('if-on-', '');
|
||||
return backgroundPage.apis.errorHandlers.switchVoid(
|
||||
this.checked ? 'on' : 'off',
|
||||
id
|
||||
);
|
||||
|
||||
};
|
||||
conpanel.appendChild(li);
|
||||
|
||||
});
|
||||
|
||||
if( errorHandlers.ifNotControlled ) {
|
||||
document.getElementById('which-extension').innerHTML
|
||||
= backgroundPage.utils.messages.whichExtensionHtml();
|
||||
document.querySelectorAll('.if-not-controlled').forEach( (node) => {
|
||||
|
||||
node.style.display = 'block';
|
||||
|
||||
});
|
||||
}
|
||||
setStatusTo('');
|
||||
|
||||
if (antiCensorRu.ifFirstInstall) {
|
||||
const id = antiCensorRu.currentPacProviderKey || 'none';
|
||||
document.querySelector('#update-' + id).click();
|
||||
}
|
||||
document.documentElement.style.display = '';
|
||||
|
||||
})
|
||||
);
|
|
@ -29,6 +29,7 @@
|
|||
<nav>
|
||||
<button id="read-button">READ</button>
|
||||
<button id="save-button">SAVE</button>
|
||||
<button id="clear-button">CLEAR</button>
|
||||
<span id="status">Press READ button to read PAC from settings</span>
|
||||
</nav>
|
||||
<div id="editor"></div>
|
|
@ -14,7 +14,7 @@ chrome.proxy.settings.onChange.addListener(
|
|||
(details) => setStatusTo(red( details.levelOfControl + '!') )
|
||||
);
|
||||
|
||||
document.querySelector('#read-button').onclick = () => {
|
||||
function _read() {
|
||||
|
||||
chrome.proxy.settings.get({}, (details) => {
|
||||
|
||||
|
@ -30,7 +30,9 @@ document.querySelector('#read-button').onclick = () => {
|
|||
|
||||
});
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
document.querySelector('#read-button').onclick = _read;
|
||||
|
||||
document.querySelector('#save-button').onclick = () => {
|
||||
|
||||
|
@ -45,3 +47,14 @@ document.querySelector('#save-button').onclick = () => {
|
|||
|
||||
};
|
||||
|
||||
document.querySelector('#clear-button').onclick = () => {
|
||||
|
||||
chrome.proxy.settings.clear({}, () => {
|
||||
|
||||
alert('Cleared! Reading...');
|
||||
_read();
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 306 KiB After Width: | Height: | Size: 306 KiB |
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB |