-
Notifications
You must be signed in to change notification settings - Fork 6
/
background.ts
130 lines (116 loc) · 4.42 KB
/
background.ts
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
import { Idle, Runtime, Alarms } from "webextension-polyfill";
import { deleteHistory } from "./DeleteHistory";
import { Options } from "./OptionsInterface";
import { MessageInterface, MessageState, Message } from "./MessageInterface";
/**
* Message listener
*
* Listens for messages from options page
* * Deletes message when Manual delete button is pressed
* * Sets delete mode to idle (updates detection interval and adds event listener)
* * Sets delete mode to startup (removes event listener)
* @param msg The message from the options page
*/
async function onMessage(msg: MessageInterface): Promise<void> {
const message = new Message(msg);
switch (message.state) {
// manual delete button
case MessageState.DELETE:
deleteHistory();
break;
// set idle mode
case MessageState.SET_IDLE:
// remove idle listener if one exists
if (browser.idle.onStateChanged.hasListener(idleListener)) {
browser.idle.onStateChanged.removeListener(idleListener);
}
// set idle length
browser.idle.setDetectionInterval(msg.idleLength);
// add idle listener
browser.idle.onStateChanged.addListener(idleListener);
browser.alarms.clear("DeleteHistoryAlarm");
break;
// set startup mode
case MessageState.SET_STARTUP:
// remove idle listener
if (browser.idle.onStateChanged.hasListener(idleListener)) {
browser.idle.onStateChanged.removeListener(idleListener);
}
browser.alarms.clear("DeleteHistoryAlarm");
break;
case MessageState.SET_TIMER:
if (browser.idle.onStateChanged.hasListener(idleListener)) {
browser.idle.onStateChanged.removeListener(idleListener);
}
// delete old alarm
browser.alarms.clear("DeleteHistoryAlarm");
// create a new one with new period
browser.alarms.create("DeleteHistoryAlarm", { delayInMinutes: 1, periodInMinutes: message.timerInterval });
break;
}
}
async function onAlarm(alarm: Alarms.Alarm) {
if (alarm.name === "DeleteHistoryAlarm") {
deleteHistory();
}
}
/**
* Attached to idle onStateChanged listener
*
* Deletes history if new state is "idle"
* @param state New state on idle change
*/
function idleListener(state: Idle.IdleState): void {
// delete history if state is idle
if (state === "idle") {
deleteHistory();
}
}
/**
* Runs at browser startup
* * Sets event listener and detection length if delete mode set to idle
* * Deletes history if set delete mode set to startup
*/
async function startup(): Promise<void> {
const res = new Options(await browser.storage.local.get());
switch (res.deleteMode) {
// if delete mode is idle, set interval and add listener
case "idle":
browser.idle.setDetectionInterval(res.idleLength);
browser.idle.onStateChanged.addListener(idleListener);
break;
// if delete mode is startup, delete history right now
case "startup":
deleteHistory();
break;
// if delete mode is timer, set alarm to run at timer interval
case "timer":
browser.alarms.create("DeleteHistoryAlarm", { delayInMinutes: 1, periodInMinutes: res.timerInterval });
break;
}
}
/**
* Runs on extension install or update (not browser update)
* * Initializes local and sync storage
* * Opens options page on first install
* @param installed Reason for install
*/
async function setup(installed: Runtime.OnInstalledDetailsType): Promise<void> {
if (installed.reason === "install" || installed.reason === "update") {
// apply default values to storage
const res = new Options(await browser.storage.local.get());
await browser.storage.local.set(res);
// initialize sync object
const syncRes = new Options(await browser.storage.sync.get());
await browser.storage.sync.set(syncRes);
startup();
// open options page on first install
if (installed.reason === "install") {
browser.runtime.openOptionsPage();
}
}
}
browser.alarms.onAlarm.addListener(onAlarm);
browser.runtime.onMessage.addListener(onMessage);
browser.runtime.onInstalled.addListener(setup);
browser.runtime.onStartup.addListener(startup);