Merge branch 'firefox-port' into development

This commit is contained in:
Ilya Ig. Petrov 2017-11-29 14:31:05 +05:00
commit b96e12d803
15 changed files with 305 additions and 139 deletions

View File

@ -1,30 +1,20 @@
# Dev # Install
Linting JS: `npm run lint` ```
npm instll
cd src/extension-common/pages/options/
npm install
cd -
npm start
use your build/extension-beta
```
# О расширении # Release
Обход интернет-цензуры в России пока что не является преступлением. 1. `vim src/extension-common/pages/options/src/components/App.js`
2. Change github link there.
Расширение позволяет обходить блокировки РосКомНадзора, давая вам доступ 3. `npm run release`
к библиотекам, энциклопедиям, сайтам оппозиционеров, а также к неповинным 4. Change back: `vim src/extension-common/pages/options/src/components/App.js`
сайтам, случайно заблокированным в силу разных причин. 5. `vim src/templates-data.js` and bump version.
6. Commit bumped version.
Проксирует только заблокированные сайты, оставляя нетронутыми все остальные. 7. Merge development to production (usually after deployment and testing and many patches).
Устанавливает PAC-скрипт, работающий через сервера anticenz.org и antizapret.prostovpn.org.
Обновляет PAC-скрипт каждые 4 часа, что составляет примерно 7MB трафика в сутки.
Также расширение постоянно потребляет ~15MB памяти для информирования о блокировках через иконку.
Синяя лента кампания фонда EFF в защиту свобод слова, прессы и союзов.
Если расширение не работает: https://git.io/vgDDj
Антицензура на Реддите: https://www.reddit.com/r/anticensorship_russia
Группа в G+: https://goo.gl/Lh0Cjh
История изменений: https://github.com/ilyaigpetrov/anti-censorship-russia/releases
# Дополнительно
Иконка синей ленты: http://www.iconsdb.com/icon-sets/cardboard-blue-icons/ribbon-12-icon.html

View File

@ -0,0 +1,26 @@
# О расширении
Обход интернет-цензуры в России пока что не является преступлением.
Расширение позволяет обходить блокировки РосКомНадзора, давая вам доступ
к библиотекам, энциклопедиям, сайтам оппозиционеров, а также к неповинным
сайтам, случайно заблокированным в силу разных причин.
Проксирует только заблокированные сайты, оставляя нетронутыми все остальные.
Устанавливает PAC-скрипт, работающий через сервера anticenz.org и antizapret.prostovpn.org.
Обновляет PAC-скрипт каждые 4 часа, что составляет примерно 7MB трафика в сутки.
Также расширение постоянно потребляет ~15MB памяти для информирования о блокировках через иконку.
Синяя лента кампания фонда EFF в защиту свобод слова, прессы и союзов.
Если расширение не работает: https://git.io/vgDDj
Антицензура на Реддите: https://www.reddit.com/r/anticensorship_russia
Группа в G+: https://goo.gl/Lh0Cjh
История изменений: https://github.com/ilyaigpetrov/anti-censorship-russia/releases
# Дополнительно
Иконка синей ленты: http://www.iconsdb.com/icon-sets/cardboard-blue-icons/ribbon-12-icon.html

View File

@ -56,52 +56,31 @@ const contexts = require('./src/templates-data').contexts;
const excFolder = (name) => [`!./src/**/${name}`, `!./src/**/${name}/**/*`]; const excFolder = (name) => [`!./src/**/${name}`, `!./src/**/${name}/**/*`];
const excluded = [ ...excFolder('test') , ...excFolder('node_modules'), ...excFolder('src') ]; const excluded = [ ...excFolder('test') , ...excFolder('node_modules'), ...excFolder('src') ];
const commonWoTests = ['./src/extension-common/**/*', ...excluded];
const miniDst = './build/extension-mini'; const miniDst = './build/extension-mini';
const fullDst = './build/extension-full'; const fullDst = './build/extension-full';
const betaDst = './build/extension-beta'; const betaDst = './build/extension-beta';
const firefoxDst = './build/extension-firefox';
gulp.task('_cp-common', ['clean'], function(cb) { const commonSrc = './src/extension-common/**/*';;
const miniSrc = './src/extension-mini/**/*';
const fullSrc = './src/extension-full/**/*';
const firefoxSrc = './src/extension-firefox/**/*';
let fins = 0; const joinSrc = (...args) => [...args, ...excluded];
const intheend = () => {
if (++fins === 2) {
cb();
}
};
gulp.src(commonWoTests) gulp.task('_cp-mini', function(cb) {
//.pipe(changed(miniDst))
.pipe(templatePlugin(contexts.mini))
.pipe(gulp.dest(miniDst))
.on('end', intheend);
gulp.src(commonWoTests) gulp.src(joinSrc(commonSrc, miniSrc))
//.pipe(changed(fullDst))
.pipe(templatePlugin(contexts.full))
.pipe(gulp.dest(fullDst))
.on('end', intheend);
gulp.src(commonWoTests)
//.pipe(changed(fullDst))
.pipe(templatePlugin(contexts.beta))
.pipe(gulp.dest(betaDst))
.on('end', intheend);
});
gulp.task('_cp-mini', ['_cp-common'], function(cb) {
gulp.src(['./src/extension-mini/**/*', ...excluded])
//.pipe(changed(miniDst)) //.pipe(changed(miniDst))
.pipe(templatePlugin(contexts.mini)) .pipe(templatePlugin(contexts.mini))
.pipe(gulp.dest(miniDst)) .pipe(gulp.dest(miniDst))
.on('end', cb); .on('end', cb);
}); });
gulp.task('_cp-full', ['_cp-common'], function(cb) { gulp.task('_cp-full', function(cb) {
gulp.src(['./src/extension-full/**/*', ...excluded]) gulp.src(joinSrc(commonSrc, fullSrc))
//.pipe(changed(fullDst)) //.pipe(changed(fullDst))
.pipe(templatePlugin(contexts.full)) .pipe(templatePlugin(contexts.full))
.pipe(gulp.dest(fullDst)) .pipe(gulp.dest(fullDst))
@ -109,9 +88,19 @@ gulp.task('_cp-full', ['_cp-common'], function(cb) {
}); });
gulp.task('_cp-beta', ['_cp-common'], function(cb) { gulp.task('_cp-firefox', function(cb) {
gulp.src(['./src/extension-full/**/*', ...excluded]) gulp.src(joinSrc(commonSrc, fullSrc, firefoxSrc))
//.pipe(changed(fullDst))
.pipe(templatePlugin(contexts.firefox))
.pipe(gulp.dest(firefoxDst))
.on('end', cb);
});
gulp.task('_cp-beta', function(cb) {
gulp.src(joinSrc(commonSrc, fullSrc))
//.pipe(changed(fullDst)) //.pipe(changed(fullDst))
.pipe(templatePlugin(contexts.beta)) .pipe(templatePlugin(contexts.beta))
.pipe(gulp.dest(betaDst)) .pipe(gulp.dest(betaDst))
@ -119,5 +108,6 @@ gulp.task('_cp-beta', ['_cp-common'], function(cb) {
}); });
gulp.task('build:all', ['_cp-mini', '_cp-full', '_cp-beta']); gulp.task('build:all', ['_cp-mini', '_cp-full', '_cp-beta', '_cp-firefox']);
gulp.task('build:beta', ['_cp-beta']); gulp.task('build:beta', ['_cp-beta']);
gulp.task('build:firefox', ['_cp-firefox']);

View File

@ -8,7 +8,8 @@
"gulp": "gulp", "gulp": "gulp",
"test": "mocha --recursive ./src/**/test/*", "test": "mocha --recursive ./src/**/test/*",
"subpages": "cd ./src/extension-common/pages/options/ && npm run build && cd -", "subpages": "cd ./src/extension-common/pages/options/ && npm run build && cd -",
"start": "npm run subpages && npm run gulp build:beta", "subpages:dev": "cd ./src/extension-common/pages/options/ && npm run build:dev:nocomp && cd -",
"start": "npm run subpages:dev && npm run gulp build:beta",
"release": "npm run subpages && npm run gulp build:all" "release": "npm run subpages && npm run gulp build:all"
}, },
"author": "Ilya Ig. Petrov", "author": "Ilya Ig. Petrov",

View File

@ -241,6 +241,9 @@
const compareVersions = (a, b) => versionToInt(a) - versionToInt(b); const compareVersions = (a, b) => versionToInt(a) - versionToInt(b);
window.apis = { window.apis = {
platform: {
ifFirefox: navigator.userAgent.toLowerCase().includes('firefox'),
},
version: { version: {
ifMini: false, ifMini: false,
build: chrome.runtime.getManifest().version.replace(/\d+\.\d+\./g, ''), build: chrome.runtime.getManifest().version.replace(/\d+\.\d+\./g, ''),
@ -249,4 +252,43 @@
}, },
}; };
// Shims for FireFox
if (!chrome.proxy.settings) {
const ffxStore = window.utils.createStorage('firefox-only');
chrome.proxy.settings = {
get: (_, cb) => {
let currentSettings = ffxStore('proxySettings') || {};
currentSettings.levelOfControl = 'controlled_by_this_extension'; // May be lie, but this field is required.
cb && cb(currentSettings);
},
onChange: {
addListener: () => {},
},
set: (details, cb) => {
browser.proxy.unregister();
browser.proxy.register('./default.pac.js');
// browser.proxy.onProxyError.addListener((...err) => { console.log('ERROR IN PAC:', ...err) });
browser.runtime.sendMessage(details, {toProxyScript: true});
ffxStore('proxySettings', details);
cb && cb();
},
};
const proxySettings = ffxStore('proxySettings');
if (proxySettings) {
chrome.proxy.settings.set(proxySettings);
}
}
} }

View File

@ -8,6 +8,9 @@
const errorJsonReplacer = function errorJsonReplacer(key, value) { const errorJsonReplacer = function errorJsonReplacer(key, value) {
// fooWindow.ErrorEvent !== barWindow.ErrorEvent // fooWindow.ErrorEvent !== barWindow.ErrorEvent
if (value === window) {
return; // STUPID, because other window object may be passed.
}
if (!( value && value.constructor if (!( value && value.constructor
&& ['Error', 'Event'].some( && ['Error', 'Event'].some(
(suff) => value.constructor.name.endsWith(suff) (suff) => value.constructor.name.endsWith(suff)
@ -114,20 +117,22 @@
isControllable(details) { isControllable(details) {
this.ifControllable = window.utils.areSettingsControllableFor(details); if (details) {
this.ifControllable = window.utils.areSettingsControllableFor(details);
if (this.ifControllable) { if (this.ifControllable) {
this.ifControlled = window.utils.areSettingsControlledFor(details); this.ifControlled = window.utils.areSettingsControlledFor(details);
} else { } else {
this.ifControlled = false; this.ifControlled = false;
} }
if (this.ifControlled) { if (this.ifControlled) {
chrome.browserAction.setIcon( {path: './icons/default-128.png'} ); chrome.browserAction.setIcon( {path: './icons/default-128.png'} );
} else { } else {
chrome.browserAction.setIcon({ chrome.browserAction.setIcon({
path: './icons/default-grayscale-128.png', path: './icons/default-grayscale-128.png',
}); });
}
} }
return this.ifControllable; return this.ifControllable;
@ -136,7 +141,9 @@
isControlled(details) { isControlled(details) {
this.isControllable(details); if (details) {
this.isControllable(details);
}
return this.ifControlled; return this.ifControlled;
}, },
@ -175,16 +182,15 @@
const message = errOrMessage.message || errOrMessage.toString(); const message = errOrMessage.message || errOrMessage.toString();
chrome.notifications.create( chrome.notifications.create(
id, id,
{ Object.assign({
title: title, title: title,
message: message, message: message,
contextMessage: context, contextMessage: context,
requireInteraction: ifSticky,
type: 'basic', type: 'basic',
iconUrl: './icons/' + icon, iconUrl: './icons/' + icon,
appIconMaskUrl: './icons/default-mask-128.png', appIconMaskUrl: './icons/default-mask-128.png',
isClickable: true, isClickable: true,
} }, window.apis.platform.ifFirefox ? {} : { requireInteraction: ifSticky }),
); );
}, },
@ -253,7 +259,11 @@
error: "net::ERR_PAC_SCRIPT_FAILED", error: "net::ERR_PAC_SCRIPT_FAILED",
fatal: false, fatal: false,
*/ */
const ifConFail = details.error === 'net::ERR_PROXY_CONNECTION_FAILED'; const ifConFail = [
'net::ERR_TUNNEL_CONNECTION_FAILED',
'net::ERR_PROXY_CONNECTION_FAILED',
].includes(details.error);
if (ifConFail) { if (ifConFail) {
// Happens if you return neither prixies nor "DIRECT". // Happens if you return neither prixies nor "DIRECT".
// Ignore it. // Ignore it.
@ -262,7 +272,7 @@
console.warn('PAC ERROR', details); console.warn('PAC ERROR', details);
// TOOD: add "view pac script at this line" button. // TOOD: add "view pac script at this line" button.
handlers.mayNotify('pac-error', 'Ошибка PAC!', handlers.mayNotify('pac-error', 'Ошибка PAC!',
details.error + '\n' + details.details, (details.error || details.message /* Firefox */) + '\n' + details.details,
{icon: 'pac-error-128.png'} {icon: 'pac-error-128.png'}
); );

View File

@ -317,11 +317,11 @@
return pacMods.ifNoMods ? pacData : pacData + `${ kitchenStartsMark } return pacMods.ifNoMods ? pacData : pacData + `${ kitchenStartsMark }
/******/ /******/
/******/;+function(global) { /******/;(function(global) {
/******/ "use strict"; /******/ "use strict";
/******/ /******/
/******/ const originalFindProxyForURL = FindProxyForURL; /******/ const originalFindProxyForURL = FindProxyForURL;
/******/ global.FindProxyForURL = function(url, host) { /******/ const tmp = function(url, host) {
/******/ /******/
${ ${
function() { function() {
@ -423,7 +423,7 @@ ${ pacMods.filteredCustomsString
pacMods.ifUsePacScriptProxies pacMods.ifUsePacScriptProxies
) { ) {
return res + ` return res + `
/******/ return pacScriptProxies + directIfAllowed;`; /******/ return (pacScriptProxies + directIfAllowed) || "DIRECT";`;
} }
return res + ` return res + `
@ -451,9 +451,15 @@ ${ pacMods.filteredCustomsString
}() }()
} }
}; /******/ };
}(this);`; /******/ if (global) {
/******/ global.FindProxyForURL = tmp;
/******/ } else {
/******/ FindProxyForURL = tmp;
/******/ }
/*****/})(this);`;
}, },

View File

@ -0,0 +1,17 @@
var coolFind = () => {};
this.FindProxyForURL = function (...args) {
return coolFind(...args);
};
const dnsResolve = this.dnsResolve || (() => null); // Welcome to hell! Someone forgot dns.
browser.runtime.onMessage.addListener((details) => {
const pacData =
details && details.value && details.value.pacScript && details.value.pacScript.data;
if (!pacData) {
throw new Error('Never install empty PAC scripts!');
}
coolFind = (function() { eval(pacData); return FindProxyForURL; })();
});

View File

@ -27,6 +27,7 @@
${persistent} ${persistent}
"scripts": [ "scripts": [
"00-init-apis.js" "00-init-apis.js"
${scripts_0x}
, "11-error-handlers-api.js" , "11-error-handlers-api.js"
, "12-errors-lib.js" , "12-errors-lib.js"
, "13-http-lib.js" , "13-http-lib.js"
@ -45,5 +46,7 @@
"options_ui": { "options_ui": {
"page": "/pages/options/index.html", "page": "/pages/options/index.html",
"chrome_style": false "chrome_style": false
} },
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"
} }

View File

@ -1,60 +1,63 @@
'use strict'; 'use strict';
const setStatusTo = (msg) => document.getElementById('status').innerHTML = msg; chrome.runtime.getBackgroundPage((bgWin) => {
const red = (text) => '<span style="color: red">' + text + '</span>'; const setStatusTo = (msg) => document.getElementById('status').innerHTML = msg;
const editor = window.ace.edit('editor'); const red = (text) => '<span style="color: red">' + text + '</span>';
editor.getSession().setOptions({
mode: 'ace/mode/javascript',
useSoftTabs: true,
});
chrome.proxy.settings.onChange.addListener(
(details) => setStatusTo(red( details.levelOfControl + '!') )
);
function _read() {
chrome.proxy.settings.get({}, (details) => {
let control = details.levelOfControl;
if (control.startsWith('controlled_by_other')) {
control = red(control);
}
setStatusTo(control);
console.log(details);
const pac = details.value.pacScript;
const data = pac && pac.data || 'PAC скрипт не установлен.';
editor.setValue( data );
const editor = window.ace.edit('editor');
editor.getSession().setOptions({
mode: 'ace/mode/javascript',
useSoftTabs: true,
}); });
} bgWin.chrome.proxy.settings.onChange.addListener(
(details) => setStatusTo(red( details.levelOfControl + '!') )
);
document.querySelector('#read-button').onclick = _read; function _read() {
document.querySelector('#save-button').onclick = () => { bgWin.chrome.proxy.settings.get({}, (details) => {
let control = details.levelOfControl;
if (control.startsWith('controlled_by_other')) {
control = red(control);
}
setStatusTo(control);
console.log(details);
const pac = details.value.pacScript;
const data = pac && pac.data || 'PAC скрипт не установлен.';
editor.setValue( data );
});
}
document.querySelector('#read-button').onclick = _read;
document.querySelector('#save-button').onclick = () => {
const config = {
mode: 'pac_script',
pacScript: {
mandatory: false,
data: editor.getValue(),
},
};
bgWin.chrome.proxy.settings.set( {value: config}, () => alert('Saved!') );
const config = {
mode: 'pac_script',
pacScript: {
mandatory: false,
data: editor.getValue(),
},
}; };
chrome.proxy.settings.set( {value: config}, () => alert('Saved!') );
}; document.querySelector('#clear-button').onclick = () => {
document.querySelector('#clear-button').onclick = () => { bgWin.chrome.proxy.settings.clear({}, () => {
chrome.proxy.settings.clear({}, () => { alert('Cleared! Reading...');
_read();
alert('Cleared! Reading...'); });
_read();
}); };
};
})

View File

@ -1205,10 +1205,21 @@
"integrity": "sha512-H1b0LNa197L/y2eBcVSQxpldkgzK15HU3xG1hCn0xJ4rxRSo6n78/fabBqyuUYMA1CtVa1Z7WnAVa9FKvlFecQ==", "integrity": "sha512-H1b0LNa197L/y2eBcVSQxpldkgzK15HU3xG1hCn0xJ4rxRSo6n78/fabBqyuUYMA1CtVa1Z7WnAVa9FKvlFecQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"inferno": "3.8.0",
"inferno-shared": "3.8.0", "inferno-shared": "3.8.0",
"inferno-vnode-flags": "3.8.0" "inferno-vnode-flags": "3.8.0"
}, },
"dependencies": { "dependencies": {
"inferno": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/inferno/-/inferno-3.8.0.tgz",
"integrity": "sha512-6s/hAYOrKNB0a8FDNHTJlz13d9uup7fVpvfd+2XPzxE69h8WgtMl+CSTIxHkW8RuEcc+hFAqi0ScsXVkMor5pw==",
"dev": true,
"requires": {
"inferno-shared": "3.8.0",
"inferno-vnode-flags": "3.8.0"
}
},
"inferno-vnode-flags": { "inferno-vnode-flags": {
"version": "3.8.0", "version": "3.8.0",
"resolved": "https://registry.npmjs.org/inferno-vnode-flags/-/inferno-vnode-flags-3.8.0.tgz", "resolved": "https://registry.npmjs.org/inferno-vnode-flags/-/inferno-vnode-flags-3.8.0.tgz",
@ -1223,11 +1234,22 @@
"integrity": "sha512-OOCSFxgnQUYvT8bhkE7OearfQi4NXevHVE49rExHhbf6m7U/AW5uQ/Ji8+BmX//sQY4YjQIvZnD/t1O+UEEBgA==", "integrity": "sha512-OOCSFxgnQUYvT8bhkE7OearfQi4NXevHVE49rExHhbf6m7U/AW5uQ/Ji8+BmX//sQY4YjQIvZnD/t1O+UEEBgA==",
"dev": true, "dev": true,
"requires": { "requires": {
"inferno": "3.8.0",
"inferno-component": "3.8.0", "inferno-component": "3.8.0",
"inferno-shared": "3.8.0", "inferno-shared": "3.8.0",
"inferno-vnode-flags": "3.8.0" "inferno-vnode-flags": "3.8.0"
}, },
"dependencies": { "dependencies": {
"inferno": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/inferno/-/inferno-3.8.0.tgz",
"integrity": "sha512-6s/hAYOrKNB0a8FDNHTJlz13d9uup7fVpvfd+2XPzxE69h8WgtMl+CSTIxHkW8RuEcc+hFAqi0ScsXVkMor5pw==",
"dev": true,
"requires": {
"inferno-shared": "3.8.0",
"inferno-vnode-flags": "3.8.0"
}
},
"inferno-vnode-flags": { "inferno-vnode-flags": {
"version": "3.8.0", "version": "3.8.0",
"resolved": "https://registry.npmjs.org/inferno-vnode-flags/-/inferno-vnode-flags-3.8.0.tgz", "resolved": "https://registry.npmjs.org/inferno-vnode-flags/-/inferno-vnode-flags-3.8.0.tgz",

View File

@ -63,7 +63,7 @@ export default function getPacChooser(theState) {
this.updatePac = function updatePac(onSuccess) { this.updatePac = function updatePac(onSuccess) {
props.funs.conduct( props.funs.conduct(
'Обновляем...', 'Обновляем...',
(cb) => props.apis.antiCensorRu.syncWithPacProviderAsync(cb), (cb) => theState.apis.antiCensorRu.syncWithPacProviderAsync(cb),
'Обновлено.', 'Обновлено.',
onSuccess onSuccess
); );
@ -75,7 +75,7 @@ export default function getPacChooser(theState) {
getCurrentProviderId() { getCurrentProviderId() {
return this.props.apis.antiCensorRu.getCurrentPacProviderKey() || 'none'; return theState.apis.antiCensorRu.getCurrentPacProviderKey() || 'none';
} }
@ -94,7 +94,7 @@ export default function getPacChooser(theState) {
const pacKey = event.target.id; const pacKey = event.target.id;
if ( if (
pacKey === ( pacKey === (
this.props.apis.antiCensorRu.getCurrentPacProviderKey() || 'none' theState.apis.antiCensorRu.getCurrentPacProviderKey() || 'none'
) )
) { ) {
return false; return false;
@ -102,7 +102,7 @@ export default function getPacChooser(theState) {
if (pacKey === 'none') { if (pacKey === 'none') {
this.props.funs.conduct( this.props.funs.conduct(
'Отключение...', 'Отключение...',
(cb) => this.props.apis.antiCensorRu.clearPacAsync(cb), (cb) => theState.apis.antiCensorRu.clearPacAsync(cb),
'Отключено.', 'Отключено.',
() => this.setState({ chosenPacName: 'none' }), () => this.setState({ chosenPacName: 'none' }),
checkChosenProvider checkChosenProvider
@ -110,7 +110,7 @@ export default function getPacChooser(theState) {
} else { } else {
this.props.funs.conduct( this.props.funs.conduct(
'Установка...', 'Установка...',
(cb) => this.props.apis.antiCensorRu.installPacAsync(pacKey, cb), (cb) => theState.apis.antiCensorRu.installPacAsync(pacKey, cb),
'PAC-скрипт установлен.', 'PAC-скрипт установлен.',
checkChosenProvider checkChosenProvider
); );
@ -127,7 +127,7 @@ export default function getPacChooser(theState) {
{props.flags.ifInsideOptionsPage && (<header>PAC-скрипт:</header>)} {props.flags.ifInsideOptionsPage && (<header>PAC-скрипт:</header>)}
<ul> <ul>
{ {
[...props.apis.antiCensorRu.getSortedEntriesForProviders(), {key: 'none', label: 'Отключить'}].map((provConf) => [...theState.apis.antiCensorRu.getSortedEntriesForProviders(), {key: 'none', label: 'Отключить'}].map((provConf) =>
(<InfoLi (<InfoLi
onClick={this.radioClickHandler} onClick={this.radioClickHandler}
conf={provConf} conf={provConf}
@ -159,7 +159,7 @@ export default function getPacChooser(theState) {
componentDidMount() { componentDidMount() {
if (this.props.apis.antiCensorRu.ifFirstInstall) { if (theState.apis.antiCensorRu.ifFirstInstall) {
this.updatePac(); this.updatePac();
} }

View File

@ -35,7 +35,7 @@ chrome.runtime.getBackgroundPage( (bgWindow) =>
) )
); );
theState.flags.ifInsideOptionsPage = !currentTab || currentTab.url.startsWith('chrome://extensions/?options='); theState.flags.ifInsideOptionsPage = !currentTab || currentTab.url.startsWith('chrome://extensions/?options=') || currentTab.url.startsWith('about:addons');
theState.currentTab = currentTab; theState.currentTab = currentTab;
// STATE DEFINED, COMPOSE. // STATE DEFINED, COMPOSE.

View File

@ -0,0 +1,42 @@
'use strict';
{
if (!chrome.proxy.settings) {
const ffxStore = window.utils.createStorage('firefox-only');
chrome.proxy.settings = {
get: (_, cb) => {
let currentSettings = ffxStore('proxySettings') || {};
currentSettings.levelOfControl = 'controlled_by_this_extension'; // May be lie, but this field is required.
cb && cb(currentSettings);
},
onChange: {
addListener: () => {},
},
set: (details, cb) => {
browser.proxy.unregister();
browser.proxy.register('./default.pac.js');
// browser.proxy.onProxyError.addListener((...err) => { console.log('ERROR IN PAC:', ...err) });
browser.runtime.sendMessage(details, {toProxyScript: true});
ffxStore('proxySettings', details);
cb && cb();
},
};
const proxySettings = ffxStore('proxySettings');
if (proxySettings) {
chrome.proxy.settings.set(proxySettings);
}
}
}

View File

@ -12,7 +12,7 @@ const pacUrls = [
]; ];
const commonContext = { const commonContext = {
version: '1.11', version: '1.16',
anticensorityPacUrls: [ anticensorityPacUrls: [
...pacUrls, ...pacUrls,
], ],
@ -28,6 +28,7 @@ exports.contexts.full = Object.assign({}, commonContext, {
nameSuffixRu: '', nameSuffixRu: '',
extra_permissions, extra_permissions,
persistent: '', persistent: '',
scripts_0x: '',
scripts_2x: ', "20-ip-to-host-api.js"', scripts_2x: ', "20-ip-to-host-api.js"',
scripts_8x: ', "80-error-menu.js", "83-last-errors.js", "85-block-informer.js"', scripts_8x: ', "80-error-menu.js", "83-last-errors.js", "85-block-informer.js"',
}); });
@ -38,21 +39,34 @@ exports.contexts.mini = Object.assign({}, commonContext, {
nameSuffixRu: ' МИНИ', nameSuffixRu: ' МИНИ',
extra_permissions: '', extra_permissions: '',
persistent: '"persistent": false,', persistent: '"persistent": false,',
scripts_0x: '',
scripts_2x: ', "20-for-mini-only.js"', scripts_2x: ', "20-for-mini-only.js"',
scripts_8x: '', scripts_8x: '',
}); });
exports.contexts.firefox = Object.assign({}, commonContext, {
versionSuffix: '',
nameSuffixEn: '',
nameSuffixRu: '',
extra_permissions,
persistent: '',
scripts_0x: ', "01-chrome-proxy-settings.js"',
scripts_2x: ', "20-ip-to-host-api.js"',
scripts_8x: ', "80-error-menu.js", "83-last-errors.js", "85-block-informer.js"',
});
exports.contexts.beta = Object.assign({}, commonContext, { exports.contexts.beta = Object.assign({}, commonContext, {
anticensorityPacUrls: [ anticensorityPacUrls: [
// 'https://rebrand.ly/ac-beta-pac', // 'https://rebrand.ly/ac-beta-pac',
...pacUrls, ...pacUrls,
], ],
version: '1.6', version: '1.14',
versionSuffix: '', versionSuffix: '',
nameSuffixEn: ' FOR TESTING', nameSuffixEn: ' FOR TESTING',
nameSuffixRu: ' ДЛЯ ТЕСТОВ', nameSuffixRu: ' ДЛЯ ТЕСТОВ',
extra_permissions, extra_permissions,
persistent: '', persistent: '',
scripts_0x: '',
scripts_2x: ', "20-ip-to-host-api.js"', scripts_2x: ', "20-ip-to-host-api.js"',
scripts_8x: ', "80-error-menu.js", "83-last-errors.js", "85-block-informer.js"', scripts_8x: ', "80-error-menu.js", "83-last-errors.js", "85-block-informer.js"',
}); });