diff --git a/manifest.json b/manifest.json index 509452b..491b180 100644 --- a/manifest.json +++ b/manifest.json @@ -13,12 +13,6 @@ "*://*.duckduckgo.com/*" ], - "page_action": { - "default_icon": "icons/virus-slash.png", - "default_title": "report slop", - "show_matches": [""] - }, - "browser_action": { "default_icon": "icons/virus-slash.png", "default_title": "Slop Farmer", diff --git a/package.json b/package.json index 9e07255..dff4433 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "dependencies": { - "@types/firefox-webext-browser": "^143.0.0" + "@types/firefox-webext-browser": "^143.0.0", + "typescript": "^5.9.3" } } diff --git a/pages/action_popup.html b/pages/action_popup.html index f54a76f..1fe0186 100644 --- a/pages/action_popup.html +++ b/pages/action_popup.html @@ -9,9 +9,9 @@
- + - +
diff --git a/src/browser-action.ts b/src/browser-action.ts new file mode 100644 index 0000000..21b416d --- /dev/null +++ b/src/browser-action.ts @@ -0,0 +1,29 @@ +import { API_URL } from "common" + +const login_form = document.getElementById("login-form") as HTMLFormElement +const login_status = document.getElementById("login-status") +if (localStorage.getItem("accessToken")) { + login_status.setAttribute("style", "visibility: visible;") +} +login_form.addEventListener("submit", (event) => { event.preventDefault(); submit_login_form() }) + +async function submit_login_form() { + + const login_url = new URL("/login", API_URL) + + const request = new Request(login_url, + { + method: "POST", + body: new FormData(login_form) + }) + + const response = await fetch(request) + + if (response.ok) { + const body = await response.json() + const token = body.access_token + localStorage.setItem("accessToken", token) + const status_el = document.getElementById("login-status") + status_el.setAttribute("style", "visibility: visible;") + } +} \ No newline at end of file diff --git a/src/common.ts b/src/common.ts new file mode 100644 index 0000000..aecc406 --- /dev/null +++ b/src/common.ts @@ -0,0 +1 @@ +export const API_URL: string = "https://api.slopfarmer.jack-case.pro" diff --git a/src/report-slop.ts b/src/report-slop.ts index c0b371b..74fdb5d 100644 --- a/src/report-slop.ts +++ b/src/report-slop.ts @@ -1,15 +1,6 @@ -const API_URL: string = "https://api.slopfarmer.jack-case.pro" +import { API_URL } from "common" let access_token: string -const login_form = document.getElementById("login-form") as HTMLFormElement -if(login_form) { - const login_status = document.getElementById("login-status") - if (localStorage.getItem("accessToken")) { - login_status.setAttribute("style", "visibility: visible;") - } - login_form.addEventListener("submit", (event) => {event.preventDefault(); submit_login_form()}) -} - function setup_storage_db() { /* create indexeddb object store to retain objects in the form of * {"domain": "domain.tld", @@ -18,7 +9,7 @@ function setup_storage_db() { * "page/2" * ] * } - */ + */ let db const db_request = window.indexedDB.open("SlopDB", 1) @@ -36,7 +27,7 @@ function setup_storage_db() { db_request.onupgradeneeded = (event) => { console.log(event) db = event.target.result - const slop_store = db.createObjectStore("slop", {keyPath: "domain"}) + const slop_store = db.createObjectStore("slop", { keyPath: "domain" }) } } @@ -60,7 +51,7 @@ async function get_slop_store(readwrite: boolean) { } }) - return await slop_store_promise + return await slop_store_promise } async function insert_slop(domain: string, path: string, report: boolean = true) { @@ -80,12 +71,12 @@ async function insert_slop(domain: string, path: string, report: boolean = true) // domain exists, add this path result.paths.add(path) } - + else { // create a new domain object const paths_set = new Set() paths_set.add(path) - result = {domain: domain, paths: paths_set} + result = { domain: domain, paths: paths_set } } // persist to indexeddb @@ -96,16 +87,16 @@ async function insert_slop(domain: string, path: string, report: boolean = true) } } - if(report) { + if (report) { const report_url = new URL("/report", API_URL) - const request = new Request(report_url, + const request = new Request(report_url, { - method: "POST", + method: "POST", headers: { - "Content-Type": "application/json", + "Content-Type": "application/json", "Bearer": get_access_token() - }, - body: JSON.stringify({slop_urls: [new URL(path, "http://"+domain).toString()]}) + }, + body: JSON.stringify({ slop_urls: [new URL(path, "http://" + domain).toString()] }) }) fetch(request) } @@ -125,7 +116,7 @@ async function check_local_slop(url: string) { }) const slop_object = await known_slop - let result = {slop_domain: false, slop_path: false} + let result = { slop_domain: false, slop_path: false } if (slop_object) { // domain was found result.slop_domain = true @@ -140,10 +131,10 @@ async function check_local_slop(url: string) { async function check_remote_slop(urls: string[]) { const check_url = new URL("/check", API_URL) - const request = new Request(check_url, {method: "POST", headers: { "Content-Type": "application/json", "Bearer": get_access_token() }, body: JSON.stringify({slop_urls: urls})}) + const request = new Request(check_url, { method: "POST", headers: { "Content-Type": "application/json", "Bearer": get_access_token() }, body: JSON.stringify({ slop_urls: urls }) }) const response = await fetch(request) let domain_objects = await response.json() - domain_objects.forEach((domain: any) => {insert_slop(domain.domain_name, "/", false)}) + domain_objects.forEach((domain: any) => { insert_slop(domain.domain_name, "/", false) }) return domain_objects } @@ -157,21 +148,21 @@ async function on_button_clicked_handler(tab: any) { await insert_slop(domain, path) // @ts-ignore - update_page_action_icon({frameId: 0, tabId: tab.id, url: tab.url}) + update_page_action_icon({ frameId: 0, tabId: tab.id, url: tab.url }) } async function update_page_action_icon(details: browser.webNavigation._OnCommittedDetails) { - if(details.frameId != 0) { + if (details.frameId != 0) { return } const is_slop = await check_local_slop(details.url) - if(is_slop.slop_path) { + if (is_slop.slop_path) { browser.pageAction.setIcon({ path: "icons/virus_red.png", tabId: details.tabId }) } - else if(is_slop.slop_domain) { + else if (is_slop.slop_domain) { browser.pageAction.setIcon({ path: "icons/virus_yellow.png", tabId: details.tabId @@ -191,7 +182,7 @@ async function message_listener(message: any, sender: any) { if (message.type === "check") { let check_promises = new Array() let not_found_local = new Array() - + message.urls.forEach((url: string) => { check_promises.push(check_local_slop(url).then(async (result) => { if (result.slop_domain) { @@ -220,32 +211,9 @@ function get_access_token() { return access_token } -async function submit_login_form() { - const login_url = new URL("/login", API_URL) - - const request = new Request(login_url, - { - method: "POST", - body: new FormData(login_form) - }) - - const response = await fetch(request) - - if(response.ok) { - const body = await response.json() - const token = body.access_token - localStorage.setItem("accessToken", token) - const status_el = document.getElementById("login-status") - status_el.setAttribute("style", "visibility: visible;") - } - -} - -if(!login_form) { - browser.runtime.onInstalled.addListener(on_install_handler) - browser.runtime.onStartup.addListener(get_access_token) - browser.pageAction.onClicked.addListener(on_button_clicked_handler) - browser.webNavigation.onCommitted.addListener(update_page_action_icon) - browser.runtime.onMessage.addListener(message_listener) -} +browser.runtime.onInstalled.addListener(on_install_handler) +browser.runtime.onStartup.addListener(get_access_token) +browser.pageAction.onClicked.addListener(on_button_clicked_handler) +browser.webNavigation.onCommitted.addListener(update_page_action_icon) +browser.runtime.onMessage.addListener(message_listener) diff --git a/tsconfig.json b/tsconfig.json index 4249e88..aae5048 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ "noImplicitAny": true, "lib": ["ES7", "DOM"], "sourceMap": true, - "target": "esnext" + "target": "esnext", + "baseUrl": "src/" } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 757d176..b0d25f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,3 +6,8 @@ version "143.0.0" resolved "https://registry.yarnpkg.com/@types/firefox-webext-browser/-/firefox-webext-browser-143.0.0.tgz#29413c9f393d4c4b5622d4a74182ff0219e98620" integrity sha512-865dYKMOP0CllFyHmgXV4IQgVL51OSQQCwSoihQ17EwugePKFSAZRc0EI+y7Ly4q7j5KyURlA7LgRpFieO4JOw== + +typescript@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==