-
Notifications
You must be signed in to change notification settings - Fork 2
/
logaddnew.js
225 lines (221 loc) · 8.27 KB
/
logaddnew.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
/*
Copyright 2020. Jefferson "jscher2000" Scher. License: MPL-2.0.
v1.0 - added log and add/edit features for customizing content types
v1.1 - minor fixes; use template to reduce insertAdjacentHTML
*/
/**** Set up Page -- Get Data from background.js -- Build Table ****/
let arrCT = [];
function refreshLog(blnClear){
browser.runtime.sendMessage({
want: "log"
}).then((oLog) => {
var dest = document.querySelector('#logbody');
if (blnClear !== false) dest.innerHTML = '';
var arrItems = oLog.logarray;
if (arrItems && arrItems.length > 0){
var arrExtensions = []; // track file extensions so only one action button appears per extension
var newTR = document.getElementById('newTR'), clone, row, cells;
for (var j=0; j<arrItems.length; j++){
clone = document.importNode(newTR.content, true);
//console.log(clone);
// Populate the template
row = clone.querySelector('tr');
if (arrItems[j].action.indexOf('N/A - ') != -1){
row.className = 'grayed';
}
cells = row.querySelectorAll('td');
cells[0].textContent = new Date(arrItems[j].time).toLocaleString();
cells[1].textContent = arrItems[j].url;
cells[2].textContent = arrItems[j].extension;
cells[3].querySelector('span').textContent = arrItems[j].action;
if (!arrExtensions.includes(arrItems[j].extension)){
// Enable either the Add or Edit button
cells[3].querySelector('button').setAttribute('fext', arrItems[j].extension);
if (arrItems[j].action.indexOf('no association for extension') > -1){
// We're all set with the Add button
} else {
if (arrItems[j].action.indexOf('Updated CT header') > -1 || arrItems[j].action.indexOf('Created CT header') > -1 ||
arrItems[j].action.indexOf('CT already set') > -1){
// Switch to an Edit button
cells[3].querySelector('button').setAttribute('fexttype', 'edit');
cells[3].querySelector('button').setAttribute('title', 'Edit content-type association');
cells[3].querySelector('button').textContent = 'Edit';
} else {
// Remove the Add button?? Not sure how we got here
//console.log('WTF');
cells[3].querySelector('button').remove();
}
}
arrExtensions.push(arrItems[j].extension);
} else {
// Remove the Add button
cells[3].querySelector('button').remove();
}
dest.appendChild(clone);
}
} else { // No log data to show in table, display textual message
if (arrItems && arrItems.length > 0){
addErrorRow(dest, 'No requests have been logged in the past 5 minutes', 4);
} else {
addErrorRow(dest, 'No log data (listening is disabled? no downloads yet?)', 4);
}
}
}).catch((err) => { // No log retrieved, display error message from promise
addErrorRow(document.querySelector('#logbody'), 'Problem getting log: ' + err.message, 4);
});
}
function addErrorRow(tgt, msg, intSpan){
var cell = document.createElement('td');
cell.setAttribute('colspan', intSpan);
cell.textContent = msg;
var row = document.createElement('tr');
row.appendChild(cell);
tgt.appendChild(row);
}
function getCTarray(){
browser.runtime.sendMessage({
want: "CTarray"
}).then((oCTarray) => {
arrCT = oCTarray.CTarray;
}).catch((err) => {
console.log('Problem getting CTarray: ' + err.message);
});
}
getCTarray();
refreshLog(false);
document.querySelector('#btnRefresh').addEventListener('click', refreshLog, false);
document.querySelector('#logbody').addEventListener('click', doButton, false);
/**** Handle Button events that occur in the log table body (Add/Edit/Reset/etc) ****/
function doButton(evt){
var tgt = evt.target;
if (tgt.nodeName !== 'BUTTON') return;
if (tgt.hasAttribute('fexttype')){ // Add or Edit
// Insert form from template and populate
switch (evt.target.getAttribute('fexttype')){
case 'add':
var t = document.querySelector('#frmAdd');
break;
case 'edit':
var t = document.querySelector('#frmEdit');
break;
}
var clone = document.importNode(t.content, true);
var fext = tgt.getAttribute('fext');
clone.querySelector('form > div').setAttribute('fext', fext);
var els = clone.querySelectorAll('span.fext');
for (var i=0; i<els.length; i++) els[i].textContent = fext;
els = clone.querySelectorAll('a[href]');
for (i=0; i<els.length; i++) els[i].href = els[i].href.replace('%s', fext);
tgt.parentNode.appendChild(clone); // parent is <td>
tgt.style.display = 'none';
// Populate text input with current association, if applicable
var newCT = arrCT.find( objCT => objCT.ext === fext );
if (newCT) {
console.log('newCT => ' + JSON.stringify(newCT));
tgt.parentNode.querySelector('[name="customCT"]').setAttribute('value', newCT.ct);
tgt.parentNode.querySelector('[name="ctType"][value="cust"]').checked = true;
// if this is a built-in association, store that, and disable the Delete button
if (newCT.builtin == true){
tgt.parentNode.querySelector('button.delbtn').disabled = true;
} else {
tgt.parentNode.querySelector('button.delbtn').setAttribute('currCT', newCT.ct);
if (newCT.builtin !== false) {
// display built-in content-type as one of the options
tgt.parentNode.querySelector('span.builtinspan').style.display = '';
tgt.parentNode.querySelector('span.builtinspan span.string').textContent = newCT.builtin;
}
}
}
// Attach focus event to customCT input
tgt.parentNode.querySelector('[name="customCT"]').addEventListener('focus', function(){
this.previousElementSibling.checked = true;
}, false);
} else if (tgt.className == 'reset') { // Clear text input changes
tgt.previousElementSibling.value = tgt.previousElementSibling.getAttribute('value');
} else { // Non-submit form actions
// Process Add, Modify, Delete buttons
var dCtrls = tgt.closest('div.addedit');
if (dCtrls){
// Extract form details
var fext = dCtrls.getAttribute('fext');
var oldCT = dCtrls.querySelector('[name="customCT"]').getAttribute('value');
var rads = dCtrls.querySelectorAll('input[type="radio"][name="ctType"]');
var axnCT = '';
var builtin = false;
for (var i=0; i<rads.length; i++){
if (rads[i].checked){
if (rads[i].value == "fext"){
axnCT = dCtrls.querySelector('input[value="fext"] + span.string').textContent;
} else if (rads[i].value == "cust"){
axnCT = dCtrls.querySelector('[name="customCT"]').value.trim();
// Do a little light validation
if (axnCT.length === 0){
alert('Please enter a content-type and try again.')
return;
}
if (axnCT.indexOf('/') < 1){
alert('Please enter a content-type similar in format to application/whatever and try again.')
return;
}
if (axnCT.indexOf(' ') > -1){
alert('Please enter a content-type without any spaces and try again.')
return;
}
} else if (rads[i].value == "built"){
axnCT = dCtrls.querySelector('input[value="built"] + span.string').textContent;
builtin = true;
}
break;
}
}
// Send message to background script
var oChange;
switch (tgt.className){
case 'addbtn':
oChange = {
action: 'add',
ext: fext,
ctype: axnCT,
revert: builtin
}
break;
case 'modbtn':
// No need to re-add the existing content-type
if (axnCT == oldCT){
alert('This content-type is already set up!');
return;
}
oChange = {
action: 'change',
ext: fext,
ctype: axnCT,
revert: builtin
}
break;
case 'delbtn':
// Delete ignores the selected content-type (axnCT)
if (confirm('Delete current content-type '+ tgt.getAttribute('currCT') + '?')){
oChange = {
action: 'delete',
ext: fext,
ctype: axnCT,
revert: builtin
}
} else {
return;
}
break;
}
browser.runtime.sendMessage({
update: oChange
}).then(() => {
dCtrls.querySelector('.warning').style.display = '';
getCTarray(); // ISSUE: not running correctly?
}).catch((err) => {
console.log('Problem sending update: ' + err.message);
});
} else {
alert('Problem processing the form for some unknown reason. Sorry.');
}
}
}