"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: [""] }, ["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");