From 8777118abf5b4548b6f865ffacbd7897b714537d Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sat, 15 Feb 2025 14:16:06 +0100
Subject: [PATCH] Fusions scripts ajout automatique

---
 manifest.json                |   7 ++
 src/background/background.js | 134 +++++++++++++++++++++++++----------
 src/popup/popup.html         |   8 ++-
 src/popup/popup.js           |  20 +-----
 src/sidebar/sidebar.js       |   3 +
 src/utils/stats.js           |   1 +
 6 files changed, 118 insertions(+), 55 deletions(-)

diff --git a/manifest.json b/manifest.json
index d72ae1e..0879b3c 100644
--- a/manifest.json
+++ b/manifest.json
@@ -29,6 +29,7 @@
   },
 
   "browser_action": {
+    "default_area": "navbar",
     "default_popup": "src/popup/popup.html",
     "default_icon": {
       "16": "src/assets/icons/logo.png"
@@ -60,6 +61,11 @@
         "src/context_menu/custom_context_menu.js"],
       "css": ["src/context_menu/custom_context_menu.css"],
       "run_at": "document_idle"
+    },
+    {
+      "matches": ["<all_urls>"],
+      "js": ["src/utils/stats.js"],
+      "run_at": "document_end"
     }
   ],
 
@@ -67,6 +73,7 @@
     "src/*"
   ],
 
+  "content_security_policy": "script-src 'self' https://cdn.jsdelivr.net; object-src 'self';",
   
   "icons": {
     "16": "src/assets/icons/logo.png"
diff --git a/src/background/background.js b/src/background/background.js
index 3c0eaa5..ad1c9c3 100644
--- a/src/background/background.js
+++ b/src/background/background.js
@@ -71,6 +71,74 @@ async function refreshAllUI() {
   browser.runtime.sendMessage({ action: "refreshUI" });
 }
 
+// ─────────────────────────────────────────────────────────────────────────────
+// Initialisation du WebWorker
+// ─────────────────────────────────────────────────────────────────────────────
+let worker = null;
+
+function initWorker() {
+  if (!worker) {
+    console.log("[Background] Initialisation du WebWorker...");
+    try {
+      worker = new Worker("src/workers/pyodide_worker.js");
+      worker.onmessage = (event) => {
+        console.log("[Background] Message reçu du WebWorker :", event.data);
+      };
+      worker.onerror = (error) => {
+        console.error("[Background] Erreur dans le WebWorker :", error);
+      };
+      console.log("[Background] WebWorker initialisé avec succès.");
+    } catch (error) {
+      console.error("[Background] Échec de l'initialisation du WebWorker :", error);
+    }
+  }
+}
+// Initialisation
+initWorker();
+worker.postMessage({ command: "pyodide-simplemma" });
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Écoute des messages de la popup et transmission au WebWorker
+// ─────────────────────────────────────────────────────────────────────────────
+browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
+  console.log("[Background] Message reçu :", message);
+
+  if (!worker) {
+    initWorker();
+  }
+
+  if (message.command === "toggle-stats") {
+    console.log(`[Background] Statistiques ${message.isActive ? "activées" : "désactivées"}`);
+    await browser.storage.local.set({ isTrackingActive: message.isActive });
+    // Transmettre l'activation des statistiques au WebWorker
+    worker.postMessage({ command: "toggle-stats", isActive: message.isActive });
+  }
+  
+  if (message.command === "pyodide-simplemma") {
+    console.log("[Background] Demande d'initialisation de Pyodide et Simplemma...");
+    worker.postMessage({ command: "pyodide-simplemma" });
+  }
+
+  return true; // Permet une réponse asynchrone si nécessaire
+});
+
+// ─────────────────────────────────────────────────────────────────────────────
+// Écouter les réponses du WebWorker
+// ─────────────────────────────────────────────────────────────────────────────
+worker.onmessage = (event) => {
+  console.log("[Background] Message du WebWorker :", event.data);
+
+  // Pyodide et Simplemma prêts : notifier tous les onglets
+  if (event.data.type === "pyodide-simplemma" && event.data.status === "success") {
+    browser.tabs.query({}).then((tabs) => {
+      tabs.forEach((tab) => {
+        browser.tabs.sendMessage(tab.id, { command: "pyodide-simplemma-ready" })
+          .catch((error) => console.warn(`[Background] Impossible d'envoyer un message à l'onglet ${tab.id} : ${error}`));
+      });
+    });
+  }
+};
+
 // ─────────────────────────────────────────────────────────────────────────────
 // Fonctions d'authentification & de redirection
 // ─────────────────────────────────────────────────────────────────────────────
@@ -339,64 +407,58 @@ async function initializeExtensionState() {
   const { extensionActive } = await browser.storage.local.get("extensionActive");
 
   if (extensionActive === undefined) {
-      await browser.storage.local.set({ extensionActive: true }); // Activation par défaut
-      console.log("🔄 Initialisation : extension activée par défaut.");
-      enableExtensionFeatures();
+    await browser.storage.local.set({ extensionActive: true }); // Activation par défaut
+    console.log("🔄 Initialisation : extension activée par défaut.");
+    enableExtensionFeatures();
   } else {
-      console.log(`🔄 État actuel de l'extension : ${extensionActive ? "activée" : "désactivée"}`);
-      if (extensionActive) {
-          enableExtensionFeatures();
-      } else {
-          disableExtensionFeatures();
-      }
-}
+    console.log(`🔄 État actuel de l'extension : ${extensionActive ? "activée" : "désactivée"}`);
+    if (extensionActive) {
+      enableExtensionFeatures();
+    } else {
+      disableExtensionFeatures();
+    }
+  }
 }
 
 // === 2. Gestion de l'activation/désactivation de l'extension ===
 browser.runtime.onMessage.addListener(async (message) => {
   if (message.action === "toggleExtension") {
-      console.log(`🔄 Changement d'état de l'extension : ${message.isActive ? "activée" : "désactivée"}`);
-      await browser.storage.local.set({ extensionActive: message.isActive });
+    console.log(`🔄 Changement d'état de l'extension : ${message.isActive ? "activée" : "désactivée"}`);
+    await browser.storage.local.set({ extensionActive: message.isActive });
 
-      if (!message.isActive) {
-          disableExtensionFeatures();
-      } else {
-          enableExtensionFeatures();
-      }
-      browser.runtime.sendMessage({ action: "updateUI" });
+    if (!message.isActive) {
+      disableExtensionFeatures();
+    } else {
+      enableExtensionFeatures();
+    }
+    browser.runtime.sendMessage({ action: "updateUI" });
   }
 });
 
-
 // === 3. Fonction pour désactiver les fonctionnalités de l'extension ===
 async function disableExtensionFeatures() {
   console.log("Désactivation des fonctionnalités de l'extension.");
   browser.runtime.sendMessage({ 
-      action: "updateUI", 
-      autoAdd: false, 
-      isTrackingActive: false,
-      areStatsActive: false
+    action: "updateUI", 
+    autoAdd: false, 
+    isTrackingActive: false,
+    areStatsActive: false
   });
-  
-  // Fermeture de la barre latérale 
-  console.log("🛑 Fermeture de la barre latérale...");
-  browser.sidebarAction.close();
-
+  // Suppression d'éventuelles actions spécifiques à la sidebar
+  console.log("Les fonctionnalités de la sidebar ne sont plus utilisées.");
 }
 
 // === 4. Fonction pour activer les fonctionnalités de l'extension ===
 async function enableExtensionFeatures() {
   console.log("Réactivation des fonctionnalités de l'extension.");
   browser.runtime.sendMessage({ 
-      action: "updateUI", 
-      autoAdd: true, 
-      isTrackingActive: true,
-      areStatsActive: true
+    action: "updateUI", 
+    autoAdd: true, 
+    isTrackingActive: true,
+    areStatsActive: true
+  }).catch(err => {
+    console.warn("Aucun récepteur pour le message updateUI :", err);
   });
-
-  getOrCreateWhiteBox(); 
-  browser.sidebarAction.open();
 }
 
-
 initializeExtensionState();
diff --git a/src/popup/popup.html b/src/popup/popup.html
index d1a00b8..f8a65ca 100644
--- a/src/popup/popup.html
+++ b/src/popup/popup.html
@@ -175,7 +175,7 @@
   
   <div id="stats-options" class="option-container">
     <div class="option-row">
-      <label for="auto-add">Ajout auto</label>
+      <label for="auto-add">Ajout automatique</label>
       <input type="checkbox" id="auto-add" />
     </div>
     
@@ -196,9 +196,13 @@
           <p id="loading-languages" style="color: gray;">Chargement...</p>
         </div>
       </div>
-    
+      <!-- Message d'erreur si on ne sélectionne pas une langue à suivre-->
+      <div id="error-message" class="hidden">
+        <p>Veuillez sélectionner au moins une langue avant de sauvegarder.</p>
+      </div>      
       <button id="save-options" class="hidden">Valider</button>
     </div>
+
   </div>
 
   <div id="extension-notification" class="hidden">
diff --git a/src/popup/popup.js b/src/popup/popup.js
index 0365ca8..412056b 100644
--- a/src/popup/popup.js
+++ b/src/popup/popup.js
@@ -101,7 +101,6 @@ async function updateOptionsUI() {
   }
 
   if (statsOptions) {
-
     statsOptions.classList.toggle("hidden", !extensionActive || !isTrackingActive);
   }
 
@@ -138,7 +137,7 @@ document.getElementById("toggleStatsBtn").addEventListener("click", async () =>
     return;
   }
   const current = await browser.storage.local.get("isTrackingActive");
-  const newState = !current.isTrackingActive;
+  const newState = !(current.isTrackingActive);
 
   await browser.storage.local.set({ isTrackingActive: newState });
 
@@ -216,12 +215,7 @@ function handleToggleExtension(event) {
     if (!accessToken) {
       return;
     }
-    browser.storage.local.get("extensionActive").then(({ extensionActive }) => {
-      if (extensionActive) {
-        browser.sidebarAction.close();
-      }
-      proceedToggleExtension();
-    });
+    proceedToggleExtension();
   });
 }
 
@@ -236,15 +230,6 @@ async function proceedToggleExtension() {
   }
 
   browser.runtime.sendMessage({ action: "toggleExtension", isActive: newState });
-
-  if (newState) {
-    try {
-      browser.sidebarAction.open();
-      console.log("Sidebar ouverte directement depuis le popup.");
-    } catch (err) {
-      console.error("Erreur lors de l'ouverture de la sidebar :", err);
-    }
-  }
 }
 
 // === 6. Mise à jour de l'UI du popup en fonction d'un message ===
@@ -294,6 +279,7 @@ browser.runtime.onMessage.addListener(async (message) => {
     await updateLanguageSelection();
     updatePopupUI(message);
   } else if (message.action === "showNotification") {
+    // Logique pour afficher une notification si nécessaire
   }
 });
 
diff --git a/src/sidebar/sidebar.js b/src/sidebar/sidebar.js
index 41c7e6d..0da7a26 100644
--- a/src/sidebar/sidebar.js
+++ b/src/sidebar/sidebar.js
@@ -516,6 +516,9 @@ browser.runtime.onMessage.addListener(async (message) => {
       await refreshSidebarState();
       break;
 
+    case "pyodide-simplemma-ready":
+      return;
+
     default:
       console.warn("⚠️ Action inconnue reçue :", message.action);
   }
diff --git a/src/utils/stats.js b/src/utils/stats.js
index 49a6171..fe8f805 100644
--- a/src/utils/stats.js
+++ b/src/utils/stats.js
@@ -1,3 +1,4 @@
+console.log("Script stats.js chargé !");
 (function () {
     if (window.hasRun) {
         return;
-- 
GitLab