-
Notifications
You must be signed in to change notification settings - Fork 37
/
script.js
94 lines (71 loc) · 2.59 KB
/
script.js
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
extractHostname = (url) => {
let hostname = url.indexOf("//") > -1 ? url.split('/')[2] : url.split('/')[0];
// find & remove port number
hostname = hostname.split(':')[0];
// find & remove "?"
hostname = hostname.split('?')[0];
return hostname;
};
setByteLengthPerOrigin = (origin, byteLength) => {
const stats = localStorage.getItem('stats');
const statsJson = null === stats ? {} : JSON.parse(stats);
let bytePerOrigin = undefined === statsJson[origin] ? 0 : parseInt(statsJson[origin]);
statsJson[origin] = bytePerOrigin + byteLength;
localStorage.setItem('stats', JSON.stringify(statsJson));
};
isChrome = () => {
return (typeof(browser) === 'undefined');
};
headersReceivedListener = (requestDetails) => {
if (isChrome()) {
const origin = extractHostname(!requestDetails.initiator ? requestDetails.url : requestDetails.initiator);
const responseHeadersContentLength = requestDetails.responseHeaders.find(element => element.name.toLowerCase() === "content-length");
const contentLength = undefined === responseHeadersContentLength ? {value: 0}
: responseHeadersContentLength;
const requestSize = parseInt(contentLength.value, 10);
setByteLengthPerOrigin(origin, requestSize);
return {};
}
let filter = browser.webRequest.filterResponseData(requestDetails.requestId);
filter.ondata = event => {
const origin = extractHostname(!requestDetails.originUrl ? requestDetails.url : requestDetails.originUrl);
setByteLengthPerOrigin(origin, event.data.byteLength);
filter.write(event.data);
};
filter.onstop = () => {
filter.disconnect();
};
return {};
};
setBrowserIcon = (type) => {
chrome.browserAction.setIcon({path: `icons/icon-${type}-48.png`});
};
addOneMinute = () => {
let duration = localStorage.getItem('duration');
duration = null === duration ? 1 : 1 * duration + 1;
localStorage.setItem('duration', duration);
};
let addOneMinuteInterval;
handleMessage = (request) => {
if ('start' === request.action) {
setBrowserIcon('on');
chrome.webRequest.onHeadersReceived.addListener(
headersReceivedListener,
{urls: ['<all_urls>']},
['responseHeaders']
);
if (!addOneMinuteInterval) {
addOneMinuteInterval = setInterval(addOneMinute, 60000);
}
return;
}
if ('stop' === request.action) {
setBrowserIcon('off');
chrome.webRequest.onHeadersReceived.removeListener(headersReceivedListener);
if (addOneMinuteInterval) {
clearInterval(addOneMinuteInterval);
addOneMinuteInterval = null;
}
}
};
chrome.runtime.onMessage.addListener(handleMessage);