260 lines
8.4 KiB
JavaScript
260 lines
8.4 KiB
JavaScript
'use strict';
|
|
|
|
function notify(msg, period = 750) {
|
|
// Update status to let user know options were saved.
|
|
const status = document.getElementById('status');
|
|
status.textContent = msg;
|
|
clearTimeout(notify.id);
|
|
notify.id = setTimeout(() => status.textContent = '', period);
|
|
}
|
|
|
|
function prepare(str) {
|
|
return str.split(/\s*,\s*/)
|
|
.map(s => s.replace('http://', '')
|
|
.replace('https://', '').split('/')[0].trim())
|
|
.filter((h, i, l) => h && l.indexOf(h) === i);
|
|
}
|
|
|
|
function save() {
|
|
let custom = {};
|
|
const c = document.getElementById('custom').value;
|
|
try {
|
|
custom = JSON.parse(c);
|
|
}
|
|
catch (e) {
|
|
window.setTimeout(() => {
|
|
notify('Custom JSON error: ' + e.message, 5000);
|
|
alert('Custom JSON error: ' + e.message);
|
|
document.getElementById('custom').value = c;
|
|
}, 1000);
|
|
}
|
|
|
|
let parser = {};
|
|
const p = document.getElementById('parser').value;
|
|
try {
|
|
parser = JSON.parse(p);
|
|
}
|
|
catch (e) {
|
|
window.setTimeout(() => {
|
|
notify('Parser JSON error: ' + e.message, 5000);
|
|
alert('Parser JSON error: ' + e.message);
|
|
document.getElementById('parser').value = p;
|
|
}, 1000);
|
|
}
|
|
|
|
let siblings = {};
|
|
const s = document.getElementById('siblings').value;
|
|
try {
|
|
siblings = JSON.parse(s);
|
|
siblings = siblings.reduce((p, c, i) => {
|
|
c.forEach(hostname => p[hostname] = i);
|
|
return p;
|
|
}, {});
|
|
}
|
|
catch (e) {
|
|
window.setTimeout(() => {
|
|
notify('Sibling JSON error: ' + e.message, 5000);
|
|
alert('Sibling JSON error: ' + e.message);
|
|
document.getElementById('siblings').value = s;
|
|
}, 1000);
|
|
}
|
|
|
|
chrome.storage.local.set({
|
|
exactMatch: document.getElementById('exactMatch').checked,
|
|
faqs: document.getElementById('faqs').checked,
|
|
log: document.getElementById('log').checked,
|
|
cache: document.getElementById('cache').checked,
|
|
blacklist: prepare(document.getElementById('blacklist').value),
|
|
whitelist: prepare(document.getElementById('whitelist').value),
|
|
custom,
|
|
parser,
|
|
siblings,
|
|
mode: document.querySelector('[name="mode"]:checked').value,
|
|
protected: document.getElementById('protected').value.split(/\s*,\s*/).filter(s => s.length > 4)
|
|
}, () => {
|
|
restore();
|
|
notify('Options saved.');
|
|
chrome.contextMenus.update(document.querySelector('[name="mode"]:checked').value, {
|
|
checked: true
|
|
});
|
|
});
|
|
}
|
|
|
|
function restore() {
|
|
chrome.storage.local.get({
|
|
exactMatch: false,
|
|
faqs: true,
|
|
log: false,
|
|
cache: true,
|
|
mode: 'blacklist',
|
|
whitelist: [],
|
|
blacklist: [],
|
|
custom: {},
|
|
parser: {},
|
|
siblings: {},
|
|
protected: ['google.com/recaptcha', 'gstatic.com/recaptcha']
|
|
}, prefs => {
|
|
document.getElementById('exactMatch').checked = prefs.exactMatch;
|
|
document.getElementById('faqs').checked = prefs.faqs;
|
|
document.getElementById('log').checked = prefs.log;
|
|
document.getElementById('cache').checked = prefs.cache;
|
|
document.querySelector(`[name="mode"][value="${prefs.mode}"`).checked = true;
|
|
document.getElementById('blacklist').value = prefs.blacklist.join(', ');
|
|
document.getElementById('whitelist').value = prefs.whitelist.join(', ');
|
|
document.getElementById('custom').value = JSON.stringify(prefs.custom, null, 2);
|
|
document.getElementById('parser').value = JSON.stringify(prefs.parser, null, 2);
|
|
document.getElementById('siblings').value = JSON.stringify(Object.entries(prefs.siblings).reduce((p, [hostname, index]) => {
|
|
p[index] = p[index] || [];
|
|
p[index].push(hostname);
|
|
return p;
|
|
}, []), null, 2);
|
|
document.getElementById('protected').value = prefs.protected.join(', ');
|
|
});
|
|
}
|
|
document.addEventListener('DOMContentLoaded', restore);
|
|
document.getElementById('save').addEventListener('click', save);
|
|
|
|
document.getElementById('sample').addEventListener('click', e => {
|
|
e.preventDefault();
|
|
|
|
document.getElementById('custom').value = JSON.stringify({
|
|
'www.google.com': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
|
|
'www.bing.com, www.yahoo.com, www.wikipedia.org': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0',
|
|
'www.example.com': ['random-useragent-1', 'random-user-agent-2'],
|
|
'*': 'useragent-for-all-hostnames'
|
|
}, null, 2);
|
|
});
|
|
|
|
document.getElementById('sample-2').addEventListener('click', e => {
|
|
e.preventDefault();
|
|
|
|
document.getElementById('parser').value = JSON.stringify({
|
|
'my-custom-useragent': {
|
|
'appVersion': 'custom app version',
|
|
'platform': 'custom platform',
|
|
'vendor': '[delete]',
|
|
'product': 'custom product',
|
|
'oscpu': 'custom oscpu',
|
|
'custom-variable': 'this is a custom variable'
|
|
}
|
|
}, null, 2);
|
|
});
|
|
|
|
document.getElementById('sample-3').addEventListener('click', e => {
|
|
e.preventDefault();
|
|
|
|
document.getElementById('siblings').value = JSON.stringify([[
|
|
'www.google.com', 'www.youtube.com', 'www.youtube.be'
|
|
], [
|
|
'www.gmx.com', 'www.mail.com'
|
|
]], null, 2);
|
|
});
|
|
|
|
document.getElementById('donate').addEventListener('click', () => {
|
|
chrome.tabs.create({
|
|
url: chrome.runtime.getManifest().homepage_url + '?rd=donate'
|
|
});
|
|
});
|
|
|
|
document.getElementById('reset').addEventListener('click', e => {
|
|
if (e.detail === 1) {
|
|
notify('Double-click to reset!');
|
|
}
|
|
else {
|
|
localStorage.clear();
|
|
chrome.storage.local.clear(() => {
|
|
chrome.runtime.reload();
|
|
window.close();
|
|
});
|
|
}
|
|
});
|
|
|
|
document.getElementById('help').addEventListener('click', () => {
|
|
chrome.tabs.create({
|
|
url: chrome.runtime.getManifest().homepage_url
|
|
});
|
|
});
|
|
|
|
// export
|
|
document.getElementById('export').addEventListener('click', e => {
|
|
const guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
|
|
const r = Math.random() * 16 | 0;
|
|
const v = c == 'x' ? r : (r & 0x3 | 0x8);
|
|
return v.toString(16);
|
|
});
|
|
|
|
chrome.storage.local.get(null, prefs => {
|
|
for (const key of Object.keys(prefs)) {
|
|
if (key && key.startsWith('cache.')) {
|
|
delete prefs[key];
|
|
}
|
|
}
|
|
const text = JSON.stringify(Object.assign({}, prefs, {
|
|
'json-guid': guid,
|
|
'json-forced': false
|
|
}), null, e.shiftKey ? '' : ' ');
|
|
const blob = new Blob([text], {type: 'application/json'});
|
|
const objectURL = URL.createObjectURL(blob);
|
|
Object.assign(document.createElement('a'), {
|
|
href: objectURL,
|
|
type: 'application/json',
|
|
download: 'useragent-switcher-preferences.json'
|
|
}).dispatchEvent(new MouseEvent('click'));
|
|
setTimeout(() => URL.revokeObjectURL(objectURL));
|
|
});
|
|
});
|
|
// import
|
|
document.getElementById('import').addEventListener('click', () => {
|
|
const input = document.createElement('input');
|
|
input.style.display = 'none';
|
|
input.type = 'file';
|
|
input.accept = '.json';
|
|
input.acceptCharset = 'utf-8';
|
|
|
|
document.body.appendChild(input);
|
|
input.initialValue = input.value;
|
|
input.onchange = readFile;
|
|
input.click();
|
|
|
|
function readFile() {
|
|
if (input.value !== input.initialValue) {
|
|
const file = input.files[0];
|
|
if (file.size > 100e6) {
|
|
console.warn('100MB backup? I don\'t believe you.');
|
|
return;
|
|
}
|
|
const reader = new FileReader();
|
|
reader.onloadend = event => {
|
|
input.remove();
|
|
const json = JSON.parse(event.target.result);
|
|
chrome.storage.local.clear(() => {
|
|
chrome.storage.local.set(json, () => {
|
|
window.close();
|
|
chrome.runtime.reload();
|
|
});
|
|
});
|
|
};
|
|
reader.readAsText(file, 'utf-8');
|
|
}
|
|
}
|
|
});
|
|
|
|
/* toggle */
|
|
document.getElementById('toggle-blacklist-desc').addEventListener('click', () => {
|
|
document.querySelector('[for="toggle-blacklist-desc"]').classList.toggle('hidden');
|
|
});
|
|
document.getElementById('toggle-whitelist-desc').addEventListener('click', () => {
|
|
document.querySelector('[for="toggle-whitelist-desc"]').classList.toggle('hidden');
|
|
});
|
|
document.getElementById('toggle-custom-desc').addEventListener('click', () => {
|
|
document.querySelector('[for="toggle-custom-desc"]').classList.toggle('hidden');
|
|
});
|
|
document.getElementById('toggle-protected-desc').addEventListener('click', () => {
|
|
document.querySelector('[for="toggle-protected-desc"]').classList.toggle('hidden');
|
|
});
|
|
document.getElementById('toggle-parser-desc').addEventListener('click', () => {
|
|
document.querySelector('[for="toggle-parser-desc"]').classList.toggle('hidden');
|
|
});
|
|
document.getElementById('toggle-sibling-desc').addEventListener('click', () => {
|
|
document.querySelector('[for="toggle-sibling-desc"]').classList.toggle('hidden');
|
|
});
|