58 lines
2.3 KiB
JavaScript
58 lines
2.3 KiB
JavaScript
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 });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|