// Content Script läuft auf der Web-App-Seite // Lauscht auf window.postMessage von der Web-App und leitet an Background weiter const MESSAGE_SOURCE = "eship-webapp"; // Markiere Extension als verfügbar - MEHRFACH versuchen, da Timing variieren kann function setExtensionFlag() { try { const hasChrome = typeof chrome !== 'undefined'; const hasRuntime = hasChrome && chrome.runtime; const runtimeId = hasRuntime ? chrome.runtime.id : null; if (typeof window !== 'undefined' && hasChrome && hasRuntime && runtimeId) { // WICHTIG: Content Scripts haben einen isolierten Context // window.__EBAY_EXTENSION__ wird im Content Script Context gesetzt, // aber die Web-App läuft im Page Context - diese sind getrennt! // Daher verlassen wir uns hauptsächlich auf postMessage window.__EBAY_EXTENSION__ = true; window.__EBAY_EXTENSION_ID__ = runtimeId; // Extension-ID für chrome.runtime.sendMessage console.log('[ESHIP-CONTENT] window.__EBAY_EXTENSION__ set to true, ID:', runtimeId); return true; } } catch (e) { console.error('[ESHIP-CONTENT] Error setting flag:', e); } return false; } // Versuche Flag sofort zu setzen console.log('[ESHIP-CONTENT] Content script loaded'); console.log('[ESHIP-CONTENT] URL:', window.location.href); console.log('[ESHIP-CONTENT] ReadyState:', document.readyState); if (!setExtensionFlag()) { // Wenn window nicht verfügbar, warte auf DOMContentLoaded oder document.readyState if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { setExtensionFlag(); }); } else { // DOM ist bereits geladen, versuche nochmal setTimeout(() => { setExtensionFlag(); }, 0); } } else { } // Sende Extension-ID an Web-App via postMessage (da Content Script Isolation verhindert, dass window-Properties geteilt werden) // Die Web-App kann dann die Extension-ID in ihrem eigenen Context speichern function sendExtensionIdToWebApp() { try { const runtimeId = chrome.runtime?.id; const hasRuntime = !!chrome.runtime; const hasId = !!runtimeId; const currentUrl = window.location.href; if (runtimeId) { const message = { source: "eship-extension", type: "EXTENSION_ID", extensionId: runtimeId }; // Sende Extension-ID an Web-App window.postMessage(message, "*"); } else { } } catch (e) { console.error('[ESHIP-CONTENT] Error sending extension ID:', e); } } // Sende Extension-ID sofort beim Laden (wichtig für Seiten-Reload) sendExtensionIdToWebApp(); // Sende auch nach kurzen Verzögerungen (falls Web-App noch nicht bereit ist) setTimeout(sendExtensionIdToWebApp, 100); setTimeout(sendExtensionIdToWebApp, 500); setTimeout(sendExtensionIdToWebApp, 1000); setTimeout(sendExtensionIdToWebApp, 2000); // Kontinuierlich postMessage senden, damit die Web-App die Extension erkennen kann // (auch wenn der User die Extension NACH dem Laden der Seite installiert) let extensionAnnounceInterval = setInterval(() => { sendExtensionIdToWebApp(); }, 2000); // Alle 2 Sekunden senden // Stoppe das Intervall nach 5 Minuten (um Ressourcen zu sparen, aber lange genug für Onboarding) setTimeout(() => { if (extensionAnnounceInterval) { clearInterval(extensionAnnounceInterval); extensionAnnounceInterval = null; } }, 300000); // 5 Minuten window.addEventListener("message", (event) => { // PING_EXTENSION Handler: Web-App fragt aktiv nach Extension // Akzeptiere sowohl "eship-webapp" als auch "eship-webapp-page-context" if ((event.data?.source === MESSAGE_SOURCE || event.data?.source === "eship-webapp-page-context") && event.data?.type === "PING_EXTENSION") { // Verwende console.log als Fallback, da fetch möglicherweise fehlschlägt console.log('[ESHIP-CONTENT] Received PING_EXTENSION, responding...', event.data); // Antworte sofort mit Extension-ID const runtimeId = chrome.runtime?.id; console.log('[ESHIP-CONTENT] Runtime ID:', runtimeId); if (runtimeId) { const response = { source: "eship-extension", type: "EXTENSION_ID", extensionId: runtimeId, requestId: event.data?.requestId }; console.log('[ESHIP-CONTENT] Sending response:', response); window.postMessage(response, "*"); // Setze user_extension_load auf true im Backend // Hole JWT aus Storage und sende an Backend chrome.storage.local.get("auth_jwt").then((data) => { const jwt = data.auth_jwt; if (jwt) { // Backend-Endpoint aufrufen fetch("http://localhost:3000/api/user/set-extension-loaded", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${jwt}` } }) .then(res => res.json()) .then(result => { console.log('[ESHIP-CONTENT] user_extension_load set to true:', result); }) .catch(err => { console.error('[ESHIP-CONTENT] Failed to set user_extension_load:', err); }); } else { console.warn('[ESHIP-CONTENT] No JWT found, cannot set user_extension_load'); } }); } else { console.error('[ESHIP-CONTENT] No runtime ID available!'); } return; } // Sicherheitscheck: Nur Nachrichten von derselben Origin akzeptieren if (event.data?.source !== MESSAGE_SOURCE && event.data?.source !== "eship-webapp-page-context") return; // Auth Messages (JWT) if (event.data.type === "AUTH_JWT" || event.data.type === "AUTH_CLEARED") { chrome.runtime.sendMessage( { type: event.data.type, jwt: event.data.jwt, }, (response) => { // Antwort zurück an Web-App senden window.postMessage( { source: "eship-extension", type: event.data.type, response: response, }, "*" ); } ); return; } // eBay Parsing Request (PARSE_URL) if (event.data.action === "PARSE_URL" && event.data.url) { chrome.runtime.sendMessage( { action: "PARSE_URL", url: event.data.url, }, (response) => { // Antwort zurück an Web-App senden window.postMessage( { source: "eship-extension", messageId: event.data.messageId, ok: response?.ok, data: response?.data, error: response?.error, }, "*" ); } ); return; } });