aboutsummaryrefslogtreecommitdiffstats
path: root/src/scripts/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/scripts/common')
-rw-r--r--src/scripts/common/login/captcha.ts46
-rw-r--r--src/scripts/common/login/index.ts2
-rw-r--r--src/scripts/common/stop-blocking.ts4
3 files changed, 29 insertions, 23 deletions
diff --git a/src/scripts/common/login/captcha.ts b/src/scripts/common/login/captcha.ts
index 73e8995..a63aa24 100644
--- a/src/scripts/common/login/captcha.ts
+++ b/src/scripts/common/login/captcha.ts
@@ -1,4 +1,5 @@
import { observeDOM } from "@/shared/observe-dom";
+import { OCRRequest, OCRResponse } from "@/shared/ocr-request";
/**
* Pre-processes a CAPTCHA image on a canvas by removing grayish
@@ -9,18 +10,18 @@ import { observeDOM } from "@/shared/observe-dom";
* @param width - Canvas width in pixels.
* @param height - Canvas height in pixels.
*/
-export function prepareCaptcha(ctx: CanvasRenderingContext2D, width: number, height: number) {
+export function prepareCaptcha(ctx: CanvasRenderingContext2D, width: number, height: number): void {
const imgData = ctx.getImageData(0, 0, width, height);
const data = imgData.data;
const radius = 1;
/** Returns true when all three channels are below 50 (very dark). */
- function isBlack(r: number, g: number, b: number) {
+ function isBlack(r: number, g: number, b: number): boolean {
return r < 50 && g < 50 && b < 50;
}
/** Returns true when the colour is a mid-range grey (no strong hue). */
- function isGrayish(r: number, g: number, b: number) {
+ function isGrayish(r: number, g: number, b: number): boolean {
return Math.abs(r - g) < 15 && Math.abs(g - b) < 15 && r > 100 && r < 200;
}
@@ -28,7 +29,7 @@ export function prepareCaptcha(ctx: CanvasRenderingContext2D, width: number, hei
* Checks whether a black pixel exists within `radius` pixels of (x, y).
* Used to preserve dark structures when removing grey noise.
*/
- function hasNearbyBlack(x: number, y: number) {
+ function hasNearbyBlack(x: number, y: number): boolean {
for (let dx = -radius; dx <= radius; dx++) {
for (let dy = -radius; dy <= radius; dy++) {
const nx = x + dx;
@@ -65,14 +66,17 @@ export function prepareCaptcha(ctx: CanvasRenderingContext2D, width: number, hei
}
observeDOM(() => {
- const loginFormElement = document.querySelector("#loginform") as (HTMLFormElement | undefined);
+ const loginFormElement = document.querySelector<HTMLFormElement>("#loginform");
if (loginFormElement) {
- const captchaImg = loginFormElement.querySelector("#captchaImg") as HTMLImageElement;
- const captchaInput = loginFormElement.querySelector("#txtInput") as HTMLInputElement;
+ const captchaImg = loginFormElement.querySelector<HTMLImageElement>("#captchaImg");
+ const captchaInput = loginFormElement.querySelector<HTMLInputElement>("#txtInput");
+
+ if (!captchaImg || !captchaInput)
+ return false;
// Wait for image to load to get correct dimensions
- captchaImg.addEventListener("load", async () => {
+ captchaImg.addEventListener("load", function(): void {
const { width, height } = captchaImg;
// 1. Create canvas
@@ -86,33 +90,35 @@ observeDOM(() => {
canvas.style.display = "none";
// 3. Insert canvas before image
- captchaImg.parentNode!.querySelectorAll("canvas").forEach(c => c.remove());
- captchaImg.parentNode!.insertBefore(canvas, captchaImg);
+ captchaImg.parentNode?.querySelectorAll("canvas")
+ .forEach((c) => { c.remove(); });
+ captchaImg.parentNode?.insertBefore(canvas, captchaImg);
// 4. Hide image
captchaImg.style.display = "none";
// 5. Draw the image onto the canvas
- const ctx = canvas.getContext("2d")!;
+ const ctx = canvas.getContext("2d");
+ if (!ctx)
+ return;
ctx.drawImage(captchaImg, 0, 0);
prepareCaptcha(ctx, canvas.width, canvas.height);
canvas.style.display = "";
const dataURL = canvas.toDataURL("image/png");
// Perform OCR
- chrome.runtime.sendMessage(
+ chrome.runtime.sendMessage<OCRRequest, OCRResponse>(
{ type: "OCR", dataURL },
- ({ success, text, confidence }) => {
- if (success) {
- const textResult = text.trim();
- if (confidence < 80 || textResult.length !== 6) {
+ function(ocrResponse): void {
+ if (ocrResponse.success) {
+ const textResult = ocrResponse.text.trim();
+ if (ocrResponse.confidence < 80 || textResult.length !== 6)
// Reset the captcha if confidence is low
- captchaImg.src = "generateCaptcha?" + new Date().getTime();
- } else {
+ captchaImg.src = `generateCaptcha?${new Date().getTime().toString()}`;
+ else
captchaInput.value = textResult;
- }
}
- },
+ }
);
});
}
diff --git a/src/scripts/common/login/index.ts b/src/scripts/common/login/index.ts
index 17e2117..95b9c5b 100644
--- a/src/scripts/common/login/index.ts
+++ b/src/scripts/common/login/index.ts
@@ -1 +1 @@
-import "@/scripts/login/captcha";
+import "@/scripts/common/login/captcha";
diff --git a/src/scripts/common/stop-blocking.ts b/src/scripts/common/stop-blocking.ts
index 3fa3de6..bdebfe9 100644
--- a/src/scripts/common/stop-blocking.ts
+++ b/src/scripts/common/stop-blocking.ts
@@ -13,7 +13,7 @@ document.addEventListener("DOMContentLoaded", () => {
}
return proxiedBind.apply(this, Array.from(arguments) as any);
- }
+ };
const proxiedKeydown = $.prototype.keydown;
/** Proxies jQuery `.keydown()` so all key presses are allowed. */
@@ -21,7 +21,7 @@ document.addEventListener("DOMContentLoaded", () => {
arguments[0] = (_: any) => true;
return proxiedKeydown.apply(this, Array.from(arguments) as any);
- }
+ };
$.prototype.bind = proxiedBind;
$.prototype.keydown = proxiedKeydown;