-
-
Notifications
You must be signed in to change notification settings - Fork 188
Expand file tree
/
Copy pathworker.js
More file actions
119 lines (109 loc) · 3.81 KB
/
Copy pathworker.js
File metadata and controls
119 lines (109 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* global Network, Agent */
if (typeof importScripts !== 'undefined') {
self.importScripts('context.js');
self.importScripts('external/ua-parser.min.js', 'agent.js', 'network.js');
self.importScripts('managed.js');
}
const network = new Network();
chrome.storage.onChanged.addListener((ps, type) => {
if (
ps.mode || ps.ua || ps.blacklist || ps.whitelist || ps.custom || ps.sibilings ||
ps.protected || ps.userAgentData || ps.parser ||
type === 'session'
) {
network.configure();
}
});
chrome.runtime.onStartup.addListener(() => network.configure());
chrome.runtime.onInstalled.addListener(() => network.configure());
chrome.runtime.onMessage.addListener((request, sender, response) => {
if (request.method === 'get-port-string') {
// wait for the first real web request and then resolve the UA
if (request.cached && request.top) {
const observe = d => {
if (d.requestHeaders) {
for (const o of d.requestHeaders) {
if (o.name === 'User-Agent') {
chrome.webRequest.onSendHeaders.removeListener(observe);
const ua = o.value;
const agent = new Agent();
agent.prefs().then(() => {
const o = agent.parse(ua);
o.type = 'worker';
response(encodeURIComponent(JSON.stringify(o)));
});
break;
}
}
}
};
chrome.webRequest.onSendHeaders.addListener(observe, {
urls: ['*://*/*'],
tabId: sender.tab.id
}, ['requestHeaders']);
}
else {
chrome.scripting.executeScript({
target: {
tabId: sender.tab.id
},
func: () => self.port.dataset.disabled === 'true' ? '' : (self.port.dataset.str || '')
}).then(r => response(r[0].result));
}
return true;
}
else if (request.method === 'tab-spoofing') {
let dir = 'active';
if (request.type === 'per-tab' || request.type === 'custom' || request.type === 'worker') {
dir = request.type;
}
chrome.action.setIcon({
tabId: sender.tab.id,
path: {
'16': '/data/icons/' + dir + '/16.png',
'32': '/data/icons/' + dir + '/32.png',
'48': '/data/icons/' + dir + '/48.png'
}
});
const o = JSON.parse(decodeURIComponent(request.str));
chrome.action.setTitle({
tabId: sender.tab.id,
title: '[' + request.type + '] ' + o.userAgent
});
}
else {
if (request.method !== 'update-from-remote') {
console.error('UNKOWN_COMMAND', request);
}
}
});
/* FAQs & Feedback */
{
chrome.management = chrome.management || {
getSelf(c) {
c({installType: 'normal'});
}
};
if (navigator.webdriver !== true) {
const {homepage_url: page, name, version} = chrome.runtime.getManifest();
chrome.runtime.onInstalled.addListener(({reason, previousVersion}) => {
chrome.management.getSelf(({installType}) => installType === 'normal' && chrome.storage.local.get({
'faqs': true,
'last-update': 0
}, prefs => {
if (reason === 'install' || (prefs.faqs && reason === 'update')) {
const doUpdate = (Date.now() - prefs['last-update']) / 1000 / 60 / 60 / 24 > 45;
if (doUpdate && previousVersion !== version) {
chrome.tabs.query({active: true, lastFocusedWindow: true}, tbs => chrome.tabs.create({
url: page + '?version=' + version + (previousVersion ? '&p=' + previousVersion : '') + '&type=' + reason,
active: reason === 'install',
...(tbs && tbs.length && {index: tbs[0].index + 1})
}));
chrome.storage.local.set({'last-update': Date.now()});
}
}
}));
});
chrome.runtime.setUninstallURL(page + '?rd=feedback&name=' + encodeURIComponent(name) + '&version=' + version);
}
}