-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoptions.js
More file actions
91 lines (76 loc) · 3.1 KB
/
options.js
File metadata and controls
91 lines (76 loc) · 3.1 KB
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
const ip_rx = /^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/;
const timeout = 3000;
function $(q) {
return document.querySelector(q);
}
function setStatus(message) {
$("#status").textContent = message;
}
let abort;
async function resetStatus(roku_ip) {
if (abort) abort.abort();
let status = false;
$("#status").style.outlineColor = "orange";
if (!roku_ip) {
setStatus("This extension needs your Roku's IP address");
} else if (!ip_rx.test(roku_ip)) {
setStatus("That's not a valid IP address");
} else if (!await browser.permissions.contains({ origins: [`*://${roku_ip}/*`] })) {
setStatus(`Please grant permission to access ${roku_ip}`);
} else {
setStatus("Testing connection...");
try {
abort = new AbortController();
const id = setTimeout(() => abort.abort(), timeout);
let resp = await fetch(`http://${roku_ip}:8060/`, { signal: abort.signal });
clearTimeout(id);
if (resp.ok) {
setStatus("Looks good!");
status = true;
} else {
setStatus(`Got error status ${resp.status} from ${roku_ip}`);
}
} catch (error) {
if (error instanceof TypeError) setStatus(`Error when attempting to contact ${roku_ip}`);
else if (error instanceof DOMException && error.name === "AbortError") setStatus(`Timed out when attempting to contact ${roku_ip}`);
else setStatus(`Unknown error: ${error}`);
}
}
if (status) {
$("#status").style.outlineColor = "green";
} else {
$("#status").style.outlineColor = "red";
}
return status;
}
async function saveOptions(e) {
e.preventDefault();
const roku_ip = $("#roku_ip").value;
const context_menus = $("#context_menus").checked;
const bookmark_menus = $("#bookmark_menus").checked;
let perms = { origins: [`*://${roku_ip}/*`], permissions: [] };
let success = await browser.permissions.request(perms);
let status = await resetStatus(roku_ip);
let storage = {context_menus, bookmark_menus};
if (success && status) storage.roku_ip = roku_ip;
await browser.storage.local.set(storage);
browser.runtime.sendMessage("redo_menus");
}
async function restoreOptions() {
const options = await browser.storage.local.get(["roku_ip", "context_menus", "bookmark_menus"]);
$("#roku_ip").value = options.roku_ip || "";
$("#context_menus").checked = options.context_menus || false;
$("#bookmark_menus").checked = options.bookmark_menus || false;
await resetStatus(options.roku_ip);
}
$("#roku_ip").addEventListener("invalid", (event) => {
if (event.target.validity.patternMismatch) {
setStatus("Please enter a valid IP address");
$("#status").style.outlineColor = "red";
} else if (event.target.validity.valueMissing) {
setStatus("Please enter the IP address of your Roku");
$("#status").style.outlineColor = "red";
}
});
document.addEventListener("DOMContentLoaded", restoreOptions);
$("form").addEventListener("submit", saveOptions);