tgx2/ext/js/background.js

58 lines
2.3 KiB
JavaScript
Raw Permalink Normal View History

2024-08-31 03:18:16 +00:00
import initWasmModule, { post, like } from './wasm/wasm_mod.js';
(async () => {
await initWasmModule();
})();
chrome.runtime.onMessage.addListener(async (request, sender, _) => {
if (request?.action) {
const storage = await chrome.storage.local.get();
if (request.action == "like") {
const { rect, ratio, by, me, id, is_private } = request;
if (sender.tab) {
// make a screenshot
if (storage.screenshot) {
setTimeout(async function () {
const screenshot = await chrome.tabs.captureVisibleTab(null, { format: "png" });
const canvas = new OffscreenCanvas(rect.width, rect.height);
const bytes = atob(screenshot.replace("data:image/png;base64,", ""));
const array_buf = new ArrayBuffer(bytes.length);
const uint_arr = new Uint8Array(array_buf);
for (let i = 0; i < bytes.length; i++) {
uint_arr[i] = bytes.charCodeAt(i);
}
const blob = new Blob([array_buf], { type: "image/png" });
const top = Math.max(rect.top, 0);
const bitmap = await createImageBitmap(
blob,
Math.ceil(rect.left * ratio),
Math.ceil(top * ratio),
rect.width * ratio,
(rect.bottom - top) * ratio // if top of the image is outside of the viewport, subtract offset from height
);
canvas.getContext('bitmaprenderer').transferFromImageBitmap(bitmap);
const cropped_blob = await canvas.convertToBlob(); // slllloooow. kinda. 300ms.
const cropped_bytes = await cropped_blob.arrayBuffer();
const cropped_bytes_uint8 = new Uint8Array(cropped_bytes);
await like({ id, by, me, is_private }, cropped_bytes_uint8);
}, storage.delay || 1)
} else {
await like({ id, by, me, is_private });
}
}
}
}
})