forked from moisseev/received
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbackground.js
95 lines (83 loc) · 3.62 KB
/
background.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
95
/* global browser */
"use strict";
function parseReceivedHeader(headerStr, regexp) {
const captured = headerStr.match(new RegExp(regexp));
if (captured === null) return null;
captured.shift();
// If the capturing group is optional ("* "or "?" quantifier) and didn’t match, its value is set to undefined.
const filtered = captured.filter(function (element) {
return typeof element !== "undefined";
});
if (!filtered.length) return null;
return filtered;
}
function parseReceivedHeaders(headers, regexp) {
const received = [];
headers.forEach(function (header) {
const parsed = parseReceivedHeader(header, regexp);
if (parsed !== null)
received.push(parsed);
});
return received;
}
browser.storage.local.get(["headerNumbers", "regexp"]).then(({headerNumbers, regexp}) => {
if (!headerNumbers) browser.storage.local.set({headerNumbers: ""});
if (!regexp) browser.storage.local.set({regexp: "(.*)"});
});
function displayReceivedHeader(tabId, messageId) {
browser.messages.getFull(messageId).then((messagepart) => {
browser.storage.local.get(["headerNumbers", "regexp", "removeDuplicates", "singleLine"]).then(({headerNumbers, regexp, removeDuplicates, singleLine}) => {
let headers = [];
let numberFound = false;
const {received} = messagepart.headers;
if (typeof received !== "undefined") {
headerNumbers.split(",").map((item) => parseInt(item, 10)).forEach((i) => {
if (!isNaN(i)) numberFound = true;
const header = received[i];
if (typeof header !== "undefined") headers.push(header);
});
if (!numberFound) headers = received;
}
if (headers.length) {
const parsed = parseReceivedHeaders(headers, regexp);
let filteredParsed = [];
if (removeDuplicates) {
let alreadyAdded = [];
for (let item of parsed) {
const key = item.join("_");
if (alreadyAdded.indexOf(key) === -1) {
filteredParsed.push(item);
alreadyAdded.push(key);
}
}
} else {
filteredParsed = parsed;
}
browser.displayReceivedHeader.setReceivedHeaderValue(tabId, filteredParsed, singleLine);
browser.displayReceivedHeader.setReceivedHeaderHidden(tabId, !filteredParsed.length);
} else {
browser.displayReceivedHeader.setReceivedHeaderHidden(tabId, true);
}
});
});
}
browser.windows.getAll({populate: true, windowTypes: ["normal", "messageDisplay"]}).then((windows) => {
windows.forEach(function (window) {
browser.displayReceivedHeader.addHeadersToWindowById(window.id);
window.tabs.filter((tab) => tab.active)
.forEach(function (tab) {
browser.messageDisplay.getDisplayedMessage(tab.id).then((message) => {
if (!message) return;
displayReceivedHeader(tab.id, message.id);
});
});
});
});
browser.windows.onCreated.addListener((window) => {
// Skip popup, devtools, etc.
if (window.type !== "normal" && window.type !== "messageDisplay") return;
browser.displayReceivedHeader.addHeadersToWindowById(window.id);
});
browser.messageDisplay.onMessageDisplayed.addListener((tab, message) => {
displayReceivedHeader(tab.id, message.id);
});