Files
ca-archive/background.js
ale 54807b9982 v3
Signed-off-by: ale <ale@manalejandro.com>
2026-02-08 22:16:18 +01:00

150 líneas
4.7 KiB
JavaScript

"use strict";
// Compatibilidad con Chrome y Firefox
const browserAPI = typeof browser !== "undefined" ? browser : chrome;
// Configuración por defecto
const DEFAULT_SETTINGS = {
url: "about",
firstRun: true
};
// Inicializar storage con valores por defecto
browserAPI.runtime.onInstalled.addListener(async (details) => {
if (details.reason === "install") {
await browserAPI.storage.local.set(DEFAULT_SETTINGS);
// Abrir la página "about" en la primera instalación
openArchivePage("about");
} else if (details.reason === "update") {
console.log("Classic Add-ons Archive updated to version", browserAPI.runtime.getManifest().version);
}
});
// Manejar clic en el botón de la barra de herramientas
browserAPI.browserAction.onClicked.addListener(() => {
openArchivePage();
});
// Función para abrir la página del archivo
async function openArchivePage(page) {
try {
// Obtener la URL guardada o usar la página especificada
const settings = await browserAPI.storage.local.get("url");
const targetPage = page || settings.url || "about";
// Construir la URL de la extensión
const extensionUrl = browserAPI.runtime.getURL("content/ca-archive.html");
const fullUrl = `${extensionUrl}#${targetPage}`;
// Verificar si ya hay una pestaña abierta con el archivo
const tabs = await browserAPI.tabs.query({});
let foundTab = null;
for (let tab of tabs) {
if (tab.url && tab.url.startsWith(extensionUrl)) {
foundTab = tab;
break;
}
}
if (foundTab) {
// Si existe, activar la pestaña
await browserAPI.tabs.update(foundTab.id, { active: true });
await browserAPI.windows.update(foundTab.windowId, { focused: true });
// Actualizar el hash si es necesario
if (page) {
await browserAPI.tabs.update(foundTab.id, { url: fullUrl });
}
} else {
// Si no existe, crear nueva pestaña
await browserAPI.tabs.create({ url: fullUrl });
}
// Si abrimos "about" en primera ejecución, cambiar a página principal para siguientes veces
if (targetPage === "about") {
await browserAPI.storage.local.set({ url: "list", firstRun: false });
}
} catch (error) {
console.error("Error opening archive page:", error);
}
}
// Interceptar peticiones para modificar headers cuando sea necesario
browserAPI.webRequest.onHeadersReceived.addListener(
(details) => {
// Modificar headers para archivos de addons.mozilla.org archivados
const headers = details.responseHeaders || [];
// Si es una descarga desde nuestro storage, manejar Content-Disposition
if (details.url.includes("origin=caa")) {
const newHeaders = headers.filter(h => h.name.toLowerCase() !== "content-disposition");
if (details.url.includes("action=install")) {
// No forzar descarga para instalación
return { responseHeaders: newHeaders };
} else if (details.url.includes("action=download")) {
// Forzar descarga
newHeaders.push({
name: "Content-Disposition",
value: "attachment"
});
return { responseHeaders: newHeaders };
}
}
return {};
},
{
urls: ["<all_urls>"]
},
["blocking", "responseHeaders"]
);
// Bloquear ciertas peticiones de web.archive.org
browserAPI.webRequest.onBeforeRequest.addListener(
(details) => {
if (details.url.includes("web.archive.org")) {
// Bloquear scripts y recursos específicos de AMO que no queremos cargar
if (/\/web\/.+?\/(addons\.mozilla\.org\/.+?\/more|addons\.cdn\.mozilla\.net\/.+?\/loading-more\.gif|addons-amo\.cdn\.mozilla\.net\/amo-.+?\.js)/.test(details.url)) {
return { cancel: true };
}
}
return {};
},
{
urls: ["*://web.archive.org/*"]
},
["blocking"]
);
// Manejar comandos de teclado (si se configuran)
if (browserAPI.commands && browserAPI.commands.onCommand) {
browserAPI.commands.onCommand.addListener((command) => {
if (command === "open-archive") {
openArchivePage();
}
});
}
// Escuchar mensajes desde content scripts
browserAPI.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.action === "openPage") {
openArchivePage(message.page);
sendResponse({ success: true });
} else if (message.action === "getSettings") {
browserAPI.storage.local.get(null).then(settings => {
sendResponse({ settings });
});
return true; // Mantener el canal abierto para respuesta asíncrona
} else if (message.action === "saveSettings") {
browserAPI.storage.local.set(message.settings).then(() => {
sendResponse({ success: true });
});
return true;
}
return false;
});
console.log("Classic Add-ons Archive background script loaded");