150 líneas
4.7 KiB
JavaScript
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");
|