-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbackground.js
142 lines (124 loc) · 5.94 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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/* 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;
}
function displayReceivedHeader(windowId, tabIndex, messageId, majorVersion) {
browser.messages.getFull(messageId).then((messagepart) => {
browser.storage.local.get(["headerNumbers", "regexp", "removeDuplicates", "singleLine", "substituteFWS"])
.then(({headerNumbers, regexp, removeDuplicates, singleLine = false, substituteFWS = true}) => {
let headers = [];
let numberFound = false;
let separator = "🡄";
const {received} = messagepart.headers;
if (typeof received !== "undefined") {
const idxDiff = [];
let prev = null;
headerNumbers.split(",").map((item) => parseInt(item, 10)).forEach((i) => {
if (!isNaN(i)) numberFound = true;
// .at() method is not supported on TB78
const header = received[(i < 0) ? received.length + i : i];
if (typeof header !== "undefined") {
headers.push(header);
if (singleLine) {
if (prev !== null) idxDiff.push(i - prev);
prev = i;
}
}
});
if (numberFound) {
if (singleLine) {
// ascending
if (idxDiff.every((n) => n > 0)) {
// descending
} else if (idxDiff.every((n) => n < 0)) {
separator = "🡆";
// out of order
} else {
separator = "🔹";
}
}
} else {
headers = received;
}
}
if (headers.length) {
if (majorVersion >= 128 && substituteFWS) {
// Substitute folding white spaces (FWS)
const foldingWhiteSpaceRegex = /[\t ]+/g;
headers.forEach((header, i) => (headers[i] = header.replace(foldingWhiteSpaceRegex, " ")));
}
const parsed = parseReceivedHeaders(headers, regexp);
let filteredParsed = [];
if (removeDuplicates) {
const alreadyAdded = [];
for (const item of parsed) {
const key = item.join("_");
if (alreadyAdded.indexOf(key) === -1) {
filteredParsed.push(item);
alreadyAdded.push(key);
}
}
} else {
filteredParsed = parsed;
}
browser.displayReceivedHeader
.setReceivedHeaderValue(windowId, tabIndex, filteredParsed, singleLine, " " + separator + " ");
browser.displayReceivedHeader.setReceivedHeaderHidden(windowId, tabIndex, !filteredParsed.length);
}
});
});
}
let lastDisplayedMessageId = null;
browser.runtime.getBrowserInfo().then((browserInfo) => {
const [majorVersion] = browserInfo.version.split(".", 1);
// Default options
browser.storage.local.get(["headerNumbers", "regexp", "substituteFWS"])
.then(({headerNumbers, regexp, substituteFWS}) => {
if (!headerNumbers) browser.storage.local.set({headerNumbers: ""});
if (!regexp) browser.storage.local.set({regexp: "(.*)"});
if (majorVersion >= 128 && !substituteFWS) browser.storage.local.set({substituteFWS: true});
});
browser.windows.getAll({populate: true, windowTypes: ["normal", "messageDisplay"]}).then((windows) => {
windows.forEach(function (window) {
window.tabs
// Prior TB 111 messages are not displayed in inactive tabs
.filter((tab) => (majorVersion >= 111 || tab.active) &&
(["mail", "messageDisplay"].some((t) => t === tab.type)))
.forEach((tab) => {
browser.messageDisplay.getDisplayedMessage(tab.id).then((message) => {
if (!message) return;
displayReceivedHeader(tab.windowId, tab.index, message.id, majorVersion);
});
});
});
});
browser.messageDisplay.onMessageDisplayed.addListener((tab, message) => {
lastDisplayedMessageId = message.id;
displayReceivedHeader(tab.windowId, tab.index, message.id, majorVersion);
});
});
browser.mailTabs.onSelectedMessagesChanged.addListener((tab, selectedMessages) => {
if (selectedMessages.messages.length !== 1) return;
// The same message was re-selected (e.g. after column sorting)
if (selectedMessages.messages[0].id === lastDisplayedMessageId) return;
// Hide header until message is loaded
browser.displayReceivedHeader.setReceivedHeaderHidden(tab.windowId, tab.index, true);
});