This commit is contained in:
parent
96b13e4b7f
commit
846dc6f8a4
7 changed files with 175 additions and 10 deletions
80
common.js
80
common.js
|
@ -9,7 +9,73 @@ var ua = {
|
||||||
vendor: ''
|
vendor: ''
|
||||||
};
|
};
|
||||||
|
|
||||||
var onBeforeSendHeaders = ({requestHeaders}) => {
|
var prefs = {
|
||||||
|
ua: '',
|
||||||
|
blacklist: [],
|
||||||
|
whitelist: [],
|
||||||
|
mode: 'blacklist'
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.storage.local.get(prefs, ps => {
|
||||||
|
Object.assign(prefs, ps);
|
||||||
|
update(prefs.ua);
|
||||||
|
});
|
||||||
|
chrome.storage.onChanged.addListener(ps => {
|
||||||
|
Object.keys(ps).forEach(key => prefs[key] = ps[key].newValue);
|
||||||
|
if (ps.ua) {
|
||||||
|
update(prefs.ua);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function hostname(url) {
|
||||||
|
const s = url.indexOf('//') + 2;
|
||||||
|
if (s > 1) {
|
||||||
|
let o = url.indexOf('/', s);
|
||||||
|
if (o > 0) {
|
||||||
|
return url.substring(s, o);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
o = url.indexOf('?', s);
|
||||||
|
if (o > 0) {
|
||||||
|
return url.substring(s, o);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return url.substring(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function match(url) {
|
||||||
|
if (prefs.mode === 'blacklist') {
|
||||||
|
if (prefs.blacklist.length) {
|
||||||
|
const h = hostname(url);
|
||||||
|
return prefs.blacklist.some(s => s === h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (prefs.blacklist.length) {
|
||||||
|
const h = hostname(url);
|
||||||
|
return prefs.whitelist.some(s => s === h) === false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var cache = {};
|
||||||
|
chrome.tabs.onRemoved.addListener(id => delete cache[id]);
|
||||||
|
|
||||||
|
var onBeforeSendHeaders = ({tabId, url, requestHeaders, type}) => {
|
||||||
|
if (type === 'main_frame') {
|
||||||
|
cache[tabId] = match(url);
|
||||||
|
}
|
||||||
|
if (cache[tabId]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (let i = 0, name = requestHeaders[0].name; i < requestHeaders.length; i += 1, name = requestHeaders[i].name) {
|
for (let i = 0, name = requestHeaders[0].name; i < requestHeaders.length; i += 1, name = requestHeaders[i].name) {
|
||||||
if (name === 'User-Agent' || name === 'user-agent') {
|
if (name === 'User-Agent' || name === 'user-agent') {
|
||||||
requestHeaders[i].value = ua.userAgent;
|
requestHeaders[i].value = ua.userAgent;
|
||||||
|
@ -22,6 +88,9 @@ var onBeforeSendHeaders = ({requestHeaders}) => {
|
||||||
|
|
||||||
var onCommitted = ({frameId, url, tabId}) => {
|
var onCommitted = ({frameId, url, tabId}) => {
|
||||||
if (frameId === 0 && url && (url.startsWith('http') || url.startsWith('ftp'))) {
|
if (frameId === 0 && url && (url.startsWith('http') || url.startsWith('ftp'))) {
|
||||||
|
if (cache[tabId]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
chrome.tabs.executeScript(tabId, {
|
chrome.tabs.executeScript(tabId, {
|
||||||
runAt: 'document_start',
|
runAt: 'document_start',
|
||||||
allFrames: true,
|
allFrames: true,
|
||||||
|
@ -73,11 +142,6 @@ User-Agent String: ${str || navigator.userAgent}`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
chrome.storage.local.get({
|
|
||||||
ua: ''
|
|
||||||
}, prefs => update(prefs.ua));
|
|
||||||
chrome.storage.onChanged.addListener(prefs => prefs.ua && update(prefs.ua.newValue));
|
|
||||||
|
|
||||||
// FAQs & Feedback
|
// FAQs & Feedback
|
||||||
chrome.storage.local.get({
|
chrome.storage.local.get({
|
||||||
'version': null,
|
'version': null,
|
||||||
|
@ -86,10 +150,12 @@ chrome.storage.local.get({
|
||||||
const version = chrome.runtime.getManifest().version;
|
const version = chrome.runtime.getManifest().version;
|
||||||
|
|
||||||
if (prefs.version ? (prefs.faqs && prefs.version !== version) : true) {
|
if (prefs.version ? (prefs.faqs && prefs.version !== version) : true) {
|
||||||
|
const p = Boolean(prefs.version);
|
||||||
chrome.storage.local.set({version}, () => {
|
chrome.storage.local.set({version}, () => {
|
||||||
chrome.tabs.create({
|
chrome.tabs.create({
|
||||||
url: 'http://add0n.com/useragent-switcher.html?version=' + version +
|
url: 'http://add0n.com/useragent-switcher.html?version=' + version +
|
||||||
'&type=' + (prefs.version ? ('upgrade&p=' + prefs.version) : 'install')
|
'&type=' + (p ? ('upgrade&p=' + prefs.version) : 'install'),
|
||||||
|
active: p === false
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
37
data/options/index.html
Normal file
37
data/options/index.html
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>My Test Extension Options</title>
|
||||||
|
<style>
|
||||||
|
body { padding: 10px; }
|
||||||
|
textarea { width: 100%; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<table width=100%>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label><input type="radio" name="mode" value="blacklist" id="mode-blacklist"> Black-list mode: Apply user-agent string to all tabs except the tabs with the following top-level hostnames (comma separated list of hostnames)</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><textarea id="blacklist" rows="3" placeholder="e.g.: www.google.com, www.bing.com"></textarea></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label><input type="radio" name="mode" value="whitelist" id="mode-whitelist"> White-list mode: Only apply user-agent string to the tabs with following top-level hostnames</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><textarea id="whitelist" rows="3"></textarea></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p>
|
||||||
|
<button id="save">Save</button>
|
||||||
|
<span id="status"></span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<script src="index.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
36
data/options/index.js
Normal file
36
data/options/index.js
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
'use strict';
|
||||||
|
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() {
|
||||||
|
chrome.storage.local.set({
|
||||||
|
blacklist: prepare(document.getElementById('blacklist').value),
|
||||||
|
whitelist: prepare(document.getElementById('whitelist').value),
|
||||||
|
mode: document.getElementById('mode-blacklist').checked ? 'blacklist' : 'whitelist'
|
||||||
|
}, () => {
|
||||||
|
restore();
|
||||||
|
// Update status to let user know options were saved.
|
||||||
|
const status = document.getElementById('status');
|
||||||
|
status.textContent = 'Options saved.';
|
||||||
|
setTimeout(() => status.textContent = '', 750);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function restore() {
|
||||||
|
chrome.storage.local.get({
|
||||||
|
mode: 'blacklist',
|
||||||
|
whitelist: [],
|
||||||
|
blacklist: []
|
||||||
|
}, prefs => {
|
||||||
|
document.getElementById('mode-blacklist').checked = prefs.mode === 'blacklist';
|
||||||
|
document.getElementById('mode-whitelist').checked = prefs.mode === 'whitelist';
|
||||||
|
document.getElementById('blacklist').value = prefs.blacklist.join(', ');
|
||||||
|
document.getElementById('whitelist').value = prefs.whitelist.join(', ');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
document.addEventListener('DOMContentLoaded', restore);
|
||||||
|
document.getElementById('save').addEventListener('click', save);
|
|
@ -110,3 +110,10 @@ input[type=button]:disabled {
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#info {
|
||||||
|
padding: 0 5px;
|
||||||
|
}
|
||||||
|
#info:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
|
@ -152,6 +152,7 @@
|
||||||
<div hbox id="agent" pack="center" align="center">
|
<div hbox id="agent" pack="center" align="center">
|
||||||
User-Agent String:
|
User-Agent String:
|
||||||
<input id="ua" type="text" name="">
|
<input id="ua" type="text" name="">
|
||||||
|
<span id="info"></span>
|
||||||
<input type="button" value="Apply" title="Set this string as the browser's User-Agent string" data-cmd="apply">
|
<input type="button" value="Apply" title="Set this string as the browser's User-Agent string" data-cmd="apply">
|
||||||
<input type="button" value="Reset" title="Reset User-Agent string to the default one" style="margin-left: 2px;" data-cmd="reset">
|
<input type="button" value="Reset" title="Reset User-Agent string to the default one" style="margin-left: 2px;" data-cmd="reset">
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -142,13 +142,26 @@ window.addEventListener('load', () => {
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function msg(msg) {
|
||||||
|
const info = document.getElementById('info');
|
||||||
|
info.textContent = msg;
|
||||||
|
window.setTimeout(() => info.textContent = '', 750);
|
||||||
|
}
|
||||||
|
|
||||||
// commands
|
// commands
|
||||||
document.addEventListener('click', ({target}) => {
|
document.addEventListener('click', ({target}) => {
|
||||||
const cmd = target.dataset.cmd;
|
const cmd = target.dataset.cmd;
|
||||||
if (cmd) {
|
if (cmd) {
|
||||||
if (cmd === 'apply') {
|
if (cmd === 'apply') {
|
||||||
|
const value = document.getElementById('ua').value;
|
||||||
|
if (value === navigator.userAgent) {
|
||||||
|
msg('Default user-agent');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg('user-agent is set');
|
||||||
|
}
|
||||||
chrome.storage.local.set({
|
chrome.storage.local.set({
|
||||||
ua: document.getElementById('ua').value
|
ua: value === navigator.userAgent ? '' : value
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (cmd === 'reset') {
|
else if (cmd === 'reset') {
|
||||||
|
@ -159,6 +172,7 @@ document.addEventListener('click', ({target}) => {
|
||||||
chrome.storage.local.set({
|
chrome.storage.local.set({
|
||||||
ua: ''
|
ua: ''
|
||||||
});
|
});
|
||||||
|
msg('reset to default');
|
||||||
}
|
}
|
||||||
else if (cmd === 'refresh') {
|
else if (cmd === 'refresh') {
|
||||||
chrome.tabs.query({
|
chrome.tabs.query({
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "User-Agent Switcher",
|
"name": "User-Agent Switcher",
|
||||||
"version": "0.1.2",
|
"version": "0.1.3",
|
||||||
|
|
||||||
"description": "Spoofs User-Agent strings of your browser",
|
"description": "Spoofs User-Agent strings of your browser",
|
||||||
|
|
||||||
|
@ -38,7 +38,11 @@
|
||||||
"default_popup": "data/popup/index.html"
|
"default_popup": "data/popup/index.html"
|
||||||
},
|
},
|
||||||
"homepage_url": "http://add0n.com/useragent-switcher.html",
|
"homepage_url": "http://add0n.com/useragent-switcher.html",
|
||||||
"applications": {
|
"options_ui": {
|
||||||
|
"page": "data/options/index.html",
|
||||||
|
"chrome_style": true
|
||||||
|
},
|
||||||
|
"applications": {
|
||||||
"gecko": {
|
"gecko": {
|
||||||
"id": "{a6c4a591-f1b2-4f03-b3ff-767e5bedf4e7}",
|
"id": "{a6c4a591-f1b2-4f03-b3ff-767e5bedf4e7}",
|
||||||
"strict_min_version": "52.0"
|
"strict_min_version": "52.0"
|
||||||
|
|
Loading…
Reference in a new issue