206 lines
5.8 KiB
JavaScript
206 lines
5.8 KiB
JavaScript
/* globals UAParser */
|
|
'use strict';
|
|
|
|
var json = [];
|
|
|
|
function filter(list) {
|
|
return list.filter(o => {
|
|
const browser = document.getElementById('browser').value;
|
|
if (browser && browser !== 'skipped') {
|
|
try {
|
|
if (o.browser.name.toLowerCase().trim().indexOf(browser.trim()) === -1) {
|
|
return false;
|
|
}
|
|
}
|
|
catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
const os = document.getElementById('os').value;
|
|
if (os && os !== 'skipped') {
|
|
try {
|
|
if (o.os.name.toLowerCase().trim().indexOf(os.trim()) === -1) {
|
|
return false;
|
|
}
|
|
}
|
|
catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
|
|
function sort(arr) {
|
|
function sort(a = '', b = '') {
|
|
const pa = a.split('.');
|
|
const pb = b.split('.');
|
|
for (let i = 0; i < 3; i++) {
|
|
const na = Number(pa[i]);
|
|
const nb = Number(pb[i]);
|
|
if (na > nb) {
|
|
return 1;
|
|
}
|
|
if (nb > na) {
|
|
return -1;
|
|
}
|
|
if (!isNaN(na) && isNaN(nb)) {
|
|
return 1;
|
|
}
|
|
if (isNaN(na) && !isNaN(nb)) {
|
|
return -1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
const list = arr.sort((a, b) => sort(a.browser.version, b.browser.version));
|
|
if (document.getElementById('sort').value === 'true') {
|
|
return list.reverse();
|
|
}
|
|
return list;
|
|
}
|
|
|
|
function parse(j) {
|
|
json = j.map(s => UAParser(s));
|
|
}
|
|
|
|
function update() {
|
|
const list = sort(filter(json));
|
|
const t = document.querySelector('template');
|
|
const parent = document.getElementById('list');
|
|
const tbody = parent.querySelector('tbody');
|
|
tbody.textContent = '';
|
|
parent.dataset.loading = true;
|
|
window.setTimeout(() => {
|
|
const fragment = document.createDocumentFragment();
|
|
list.forEach(o => {
|
|
const clone = document.importNode(t.content, true);
|
|
const second = clone.querySelector('td:nth-child(2)');
|
|
second.title = second.textContent = o.browser.name + ' ' + (o.browser.version || ' ');
|
|
const third = clone.querySelector('td:nth-child(3)');
|
|
third.title = third.textContent = o.os.name + ' ' + (o.os.version || ' ');
|
|
const forth = clone.querySelector('td:nth-child(4)');
|
|
forth.title = forth.textContent = o.ua;
|
|
fragment.appendChild(clone);
|
|
});
|
|
tbody.appendChild(fragment);
|
|
document.getElementById('custom').placeholder = `Filter among ${list.length} "User-Agent" strings`;
|
|
parent.dataset.loading = false;
|
|
}, 1000);
|
|
}
|
|
|
|
document.addEventListener('change', ({target}) => {
|
|
if (target.closest('#filter')) {
|
|
localStorage.setItem(target.id, target.value);
|
|
update();
|
|
}
|
|
if (target.type === 'radio') {
|
|
document.getElementById('ua').value = target.closest('tr').querySelector('td:nth-child(4)').textContent;
|
|
document.getElementById('ua').dispatchEvent(new Event('input'));
|
|
}
|
|
});
|
|
|
|
document.getElementById('list').addEventListener('click', ({target}) => {
|
|
const tr = target.closest('tr');
|
|
if (tr) {
|
|
const input = tr.querySelector('input');
|
|
if (input && input !== target) {
|
|
input.checked = !input.checked;
|
|
input.dispatchEvent(new Event('change', {
|
|
bubbles: true
|
|
}));
|
|
}
|
|
}
|
|
});
|
|
|
|
document.getElementById('custom').addEventListener('keyup', ({target}) => {
|
|
const value = target.value;
|
|
[...document.querySelectorAll('#list tr')]
|
|
.forEach(tr => tr.dataset.matched = tr.textContent.toLowerCase().indexOf(value.toLowerCase()) !== -1);
|
|
});
|
|
|
|
// init
|
|
document.getElementById('os').value = localStorage.getItem('os') || 'windows';
|
|
document.getElementById('browser').value = localStorage.getItem('browser') || 'chrome';
|
|
chrome.storage.local.get({
|
|
ua: ''
|
|
}, prefs => document.getElementById('ua').value = prefs.ua || navigator.userAgent);
|
|
chrome.storage.onChanged.addListener(prefs => {
|
|
if (prefs.ua) {
|
|
document.getElementById('ua').value = prefs.ua.newValue || navigator.userAgent;
|
|
document.getElementById('ua').dispatchEvent(new Event('input'));
|
|
}
|
|
});
|
|
window.addEventListener('load', () => {
|
|
window.setTimeout(() => {
|
|
const req = new XMLHttpRequest();
|
|
req.onload = () => {
|
|
parse(req.response);
|
|
update();
|
|
};
|
|
req.open('GET', 'list.json');
|
|
req.responseType = 'json';
|
|
req.send();
|
|
}, 100);
|
|
});
|
|
|
|
function msg(msg) {
|
|
const info = document.getElementById('info');
|
|
info.textContent = msg;
|
|
window.setTimeout(() => info.textContent = 'User-Agent String:', 2000);
|
|
}
|
|
|
|
// commands
|
|
document.addEventListener('click', ({target}) => {
|
|
const cmd = target.dataset.cmd;
|
|
if (cmd) {
|
|
if (cmd === 'apply') {
|
|
const value = document.getElementById('ua').value;
|
|
if (value === navigator.userAgent) {
|
|
msg('Default UA, press the reset button instead');
|
|
}
|
|
else {
|
|
msg('user-agent is set');
|
|
}
|
|
chrome.storage.local.set({
|
|
ua: value === navigator.userAgent ? '' : value
|
|
});
|
|
}
|
|
else if (cmd === 'window') {
|
|
const value = document.getElementById('ua').value;
|
|
chrome.tabs.query({
|
|
active: true,
|
|
currentWindow: true
|
|
}, ([tab]) => chrome.runtime.getBackgroundPage(bg => bg.ua.update(value, tab.windowId)));
|
|
}
|
|
else if (cmd === 'reset') {
|
|
const input = document.querySelector('#list :checked');
|
|
if (input) {
|
|
input.checked = false;
|
|
}
|
|
chrome.storage.local.set({
|
|
ua: ''
|
|
});
|
|
msg('reset to default');
|
|
}
|
|
else if (cmd === 'refresh') {
|
|
chrome.tabs.query({
|
|
active: true,
|
|
currentWindow: true
|
|
}, ([tab]) => chrome.tabs.reload(tab.id, {
|
|
bypassCache: true
|
|
}));
|
|
}
|
|
else if (cmd === 'options') {
|
|
chrome.runtime.openOptionsPage();
|
|
}
|
|
else if (cmd === 'reload') {
|
|
chrome.runtime.reload();
|
|
}
|
|
}
|
|
});
|
|
|
|
document.getElementById('ua').addEventListener('input', e => {
|
|
document.querySelector('[data-cmd=apply]').disabled = e.target.value === '';
|
|
document.querySelector('[data-cmd=window]').disabled = e.target.value === '';
|
|
});
|