99 lines
2.8 KiB
JavaScript
99 lines
2.8 KiB
JavaScript
"use strict";
|
|
|
|
const statusEl = document.getElementById("status");
|
|
const listEl = document.getElementById("urlList");
|
|
const openHistoryBtn = document.getElementById("openHistoryBtn");
|
|
|
|
function setStatus(message) {
|
|
statusEl.textContent = message;
|
|
}
|
|
|
|
function entryLabel(entry) {
|
|
return entry && entry.fullUrl ? "full candidate" : "preview fallback";
|
|
}
|
|
|
|
function buildRow(entry) {
|
|
const li = document.createElement("li");
|
|
li.className = "url-item";
|
|
|
|
const p = document.createElement("p");
|
|
p.className = "url-text";
|
|
p.textContent = entry.previewUrl || entry.fullUrl || "";
|
|
|
|
const status = document.createElement("p");
|
|
status.className = "status";
|
|
status.textContent = `Source: ${entry.source || "unknown"} | Mode: ${entryLabel(entry)}`;
|
|
|
|
const actions = document.createElement("div");
|
|
actions.className = "actions";
|
|
|
|
const download = document.createElement("button");
|
|
download.type = "button";
|
|
download.textContent = "Download";
|
|
download.addEventListener("click", async () => {
|
|
const result = await browser.runtime.sendMessage({ type: "DOWNLOAD_ENTRY", entry });
|
|
if (!result || !result.ok) {
|
|
window.alert((result && result.error) || "Download failed.");
|
|
return;
|
|
}
|
|
setStatus(result.mode === "full" ? "Downloaded full file URL." : "Downloaded decoded preview fallback.");
|
|
});
|
|
|
|
const copy = document.createElement("button");
|
|
copy.type = "button";
|
|
copy.className = "secondary";
|
|
copy.textContent = "Copy URL";
|
|
copy.addEventListener("click", async () => {
|
|
const url = entry.fullUrl || entry.previewUrl || "";
|
|
await navigator.clipboard.writeText(url);
|
|
});
|
|
|
|
actions.appendChild(download);
|
|
actions.appendChild(copy);
|
|
li.appendChild(p);
|
|
li.appendChild(status);
|
|
li.appendChild(actions);
|
|
return li;
|
|
}
|
|
|
|
async function loadCapturedUrls() {
|
|
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
|
const activeTab = tabs[0];
|
|
|
|
if (!activeTab || typeof activeTab.id !== "number") {
|
|
setStatus("No active tab found.");
|
|
return;
|
|
}
|
|
|
|
const response = await browser.runtime.sendMessage({
|
|
type: "GET_TAB_URLS",
|
|
tabId: activeTab.id
|
|
});
|
|
|
|
if (!response || !response.ok) {
|
|
setStatus("Unable to load captured URLs.");
|
|
return;
|
|
}
|
|
|
|
listEl.innerHTML = "";
|
|
const entries = Array.isArray(response.entries) ? response.entries : [];
|
|
if (!entries.length) {
|
|
setStatus("No captured S3 URLs for this tab yet.");
|
|
return;
|
|
}
|
|
|
|
setStatus(`Captured samples for this tab: ${entries.length}`);
|
|
for (const entry of entries) {
|
|
listEl.appendChild(buildRow(entry));
|
|
}
|
|
}
|
|
|
|
openHistoryBtn.addEventListener("click", async () => {
|
|
await browser.runtime.sendMessage({ type: "OPEN_HISTORY" });
|
|
window.close();
|
|
});
|
|
|
|
loadCapturedUrls().catch(() => {
|
|
setStatus("Unexpected error while loading URLs.");
|
|
});
|