-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdevnull.js
95 lines (88 loc) · 3.03 KB
/
devnull.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
document.addEventListener('DOMContentLoaded', () => {
getGroups();
document.querySelector('#options').onclick = () => { browser.runtime.openOptionsPage() };
});
browser.runtime.onMessage.addListener((group) => {
createGroup(group)
});
function open(name, callback) {
indexedDB.open(name).onsuccess = (e) => {
const db = e.target.result;
const store = db.transaction('groups', 'readwrite').objectStore('groups');
callback(store);
};
}
function restoreGroup(group) {
open('devnull', (store) => {
store.get(group).onsuccess = (e) => {
const tabs = e.target.result.tabs;
tabs.forEach((tab) => browser.tabs.create({ url: tab.url, cookieStoreId: tab.cookieStoreId }));
}
});
deleteGroup(group);
}
function deleteGroup(group) {
open('devnull', (store) => {
store.delete(group);
});
}
function removeTabFromGroup(index, group) {
open('devnull', (store) => {
store.get(group).onsuccess = (e) => {
const item = e.target.result;
item.tabs.splice(index, 1);
store.put(item);
}
});
}
function createGroup(group) {
const groups = document.getElementById('groups');
const fragment = document.createDocumentFragment();
fragment.appendChild(function() {
const header = document.getElementById('group-template').content.cloneNode(true);
header.querySelector('.group').id = group.timestamp;
header.querySelector('.group-tab-count').textContent = `${group.tabs.length} tabs`;
header.querySelector('.group-date').textContent = `created ${new Date(group.timestamp).toLocaleString('en-US', { hour12: false })}`;
const list = header.querySelector('.tab-list');
group.tabs.map((tab) => {
const item = header.getElementById('tab-template').content.cloneNode(true);
item.querySelector('a').href = tab.url;
item.querySelector('a').textContent = tab.title;
list.appendChild(item);
});
return header;
}());
groups.prepend(fragment);
const item = document.getElementById(group.timestamp);
item.addEventListener('click', (e) => {
if (e.target.className == 'restore-button' || e.target.className == 'delete-button') {
groups.removeChild(item);
(e.target.className == 'restore-button') ? restoreGroup(group.timestamp) : deleteGroup(group.timestamp);
}
if (e.target.className == 'tab' || e.target.className == 'tab-remove-button') {
const list = e.target.closest('.tab-list');
console.log(list);
const nodes = Array.from(list.children);
if (nodes.length == 2) {
groups.removeChild(list.parentElement);
deleteGroup(group.timestamp);
} else {
list.removeChild(e.target.parentElement);
const index = nodes.indexOf(e.target.parentElement) - 1;
removeTabFromGroup(index, group.timestamp);
}
}
});
}
function getGroups() {
open('devnull', (store) => {
store.openCursor().onsuccess = (e) => {
const cursor = e.target.result;
if (cursor) {
const group = cursor.value;
createGroup(group);
cursor.continue();
}
};
});
}