🧹 Vider cookies, stockage & recharger V2
✨
🧹 Vider cookies, stockage & recharger
👌
🧪
Journal de test
:
🧹 Vider cookies, stockage & recharger V1
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>Vider cookies, stockage & recharger V1</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- 🎁 Bouton combiné (vider cookies + recharger) --> <!-- 🎁 Style adapté --> <style type="text/css"> .buttonCookies { background-color: #99cc66; color: black; padding: 10px 15px; font-size: 12px; border-radius: 8px; cursor: pointer; max-width: 90vw; width: 220px; margin-top: 2px; /* ✅ Marge au-dessus du bouton */ overflow: hidden; text-align: center; user-select: none; } #logZone { font-family: monospace; background: #f0f0f0; color: #222; border: 1px solid #ccc; padding: 8px; width: 90%; max-width: 350px; margin: 10px auto; text-align: left; white-space: pre-wrap; border-radius: 6px; box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1); } </style> <div style="text-align: center;">👌✨ <button class="buttonCookies" onclick="clearEverything()">🧹 Vider cookies, stockage & recharger</button> <!-- ✅ Log au-dessus, bouton en dessous --> <div id="logZone">🧪 <strong>Journal de test</strong> :</div> </div> <p style="margin: 5;"> <footer style="position:relative; margin:0 auto; width:50%; text-align:center; border-radius:20px; overflow:hidden; box-shadow:0 0 12px rgba(0,0,0,0.3); padding:10px 0; font-family:sans-serif; font-size:12px;"><p style="margin: 0;"><a href="https://feuille-heures-angelique.neocities.org/" style="text-decoration: none; color: inherit;">Calculatrice d’heures - Feuille d'heures Angélique (fr)</a></p></footer></p> <script type="text/javascript" language="javascript"> function logMessage(message) { console.log(message); const log = document.getElementById("logZone"); log.innerText += "\n" + message; } function detectDeviceInfo() { const ua = navigator.userAgent; let device = "Inconnu"; if (/android/i.test(ua)) device = "Android"; else if (/iPad|iPhone|iPod/.test(ua)) device = "iOS"; else if (/Windows NT/.test(ua)) device = "Windows"; else if (/Mac OS X/.test(ua)) device = "macOS"; else if (/Linux/.test(ua)) device = "Linux"; let browser = "Navigateur inconnu"; if (/Chrome/.test(ua)) browser = "Chrome"; else if (/Safari/.test(ua) && !/Chrome/.test(ua)) browser = "Safari"; else if (/Firefox/.test(ua)) browser = "Firefox"; else if (/Edg/.test(ua)) browser = "Edge"; else if (/Opera|OPR/.test(ua)) browser = "Opera"; logMessage("🧾 Appareil détecté : " + device); logMessage("🌐 Navigateur : " + browser); } function clearEverything() { const log = document.getElementById("logZone"); log.innerText = "🧪 Journal de test :"; // reset zone detectDeviceInfo(); // Afficher les cookies const rawCookies = document.cookie; if (rawCookies) { const cookieList = rawCookies.split("; "); logMessage("🍪 Cookies accessibles : (" + cookieList.length + ")"); cookieList.forEach(c => { const [name, value] = c.split("="); logMessage(`• ${name.trim()} = ${value}`); }); } else { logMessage("❌ Aucun cookie visible via JavaScript."); } // Fonction utilitaire pour supprimer un cookie sur un path donné function deleteCookie(name, path) { document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=" + path + ";"; } // Supprimer les cookies (avec path '/' et sans path) const cookies = document.cookie.split(";"); cookies.forEach(cookie => { const eqPos = cookie.indexOf("="); const name = eqPos > -1 ? cookie.substring(0, eqPos).trim() : cookie.trim(); deleteCookie(name, "/"); deleteCookie(name, ""); }); logMessage("🧹 Cookies supprimés."); // Vider localStorage et sessionStorage avec try/catch try { const localLength = localStorage.length; localStorage.clear(); logMessage(`🗑️ Stockage local vidé (${localLength} éléments supprimés).`); } catch(e) { logMessage("⚠️ Erreur lors du nettoyage de localStorage : " + e.message); } try { const sessionLength = sessionStorage.length; sessionStorage.clear(); logMessage(`🗑️ Stockage session vidé (${sessionLength} éléments supprimés).`); } catch(e) { logMessage("⚠️ Erreur lors du nettoyage de sessionStorage : " + e.message); } // Rechargement différé logMessage("🔄 Rechargement en cours..."); setTimeout(() => { window.location.href = window.location.pathname + '?refresh=' + Date.now(); }, 4500); // Temp d'affichage } </script> <!-- 💻 Ordinateurs 📱 Smartphones Android / iOS 🧪 Tous navigateurs modernes //--> <!-- 🧠 Aide Mémo : ✅ Ce bouton : – Affiche les cookies actuels – Détecte le navigateur et l'appareil – Vide les cookies accessibles par JS – Vide localStorage + sessionStorage – Recharge la page avec ?refresh=... ⚠️ Ce script ne peut PAS : – Supprimer les cookies HttpOnly (protégés par le navigateur) – Vider le cache complet du navigateur (images, fichiers...) Pour cela, il faut le faire manuellement dans les paramètres du navigateur. --> <!-- ❗ Important à savoir : Les cookies supprimés sont uniquement ceux accessibles via JavaScript (donc pas HttpOnly). Le cache complet du navigateur (images, JS, etc.) ne peut pas être vidé par script. L'utilisateur doit le faire via les paramètres du navigateur. //-->
🧹 Vider cookies, stockage & recharger V2
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>Vider cookies, stockage & recharger V1</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- 🎁🩹 Bouton combiné (vider cookies + recharger) --> <!-- 🎁💊 Style adapté --> <style type="text/css"> .buttonCookies { background-color: #99cc66; color: black; padding: 10px 15px; font-size: 12px; border-radius: 8px; cursor: pointer; max-width: 90vw; width: 220px; margin-top: 2px; /* ✅ Marge au-dessus du bouton */ overflow: hidden; text-align: center; user-select: none; } #logZone { font-family: monospace; background: #f0f0f0; color: #222; border: 1px solid #ccc; padding: 8px; width: 90%; max-width: 350px; margin: 10px auto; text-align: left; white-space: pre-wrap; border-radius: 6px; box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1); } </style> <div style="text-align: center;">👌✨ <button class="buttonCookies" onclick="clearEverything()">🧹 Vider cookies, stockage & recharger</button> <!-- ✅ Log au-dessus, bouton en dessous --> <div id="logZone">🧪 <strong>Journal de test</strong> :</div> </div> <p style="margin: 5;"> <footer style="position:relative; margin:0 auto; width:50%; text-align:center; border-radius:20px; overflow:hidden; box-shadow:0 0 12px rgba(0,0,0,0.3); padding:10px 0; font-family:sans-serif; font-size:12px;"><p style="margin: 0;"><a href="https://feuille-heures-angelique.neocities.org/" style="text-decoration: none; color: inherit;">Calculatrice d’heures - Feuille d'heures Angélique (fr)</a></p></footer></p> <script type="text/javascript" language="javascript"> function logMessage(message) { console.log(message); const log = document.getElementById("logZone"); log.innerText += "\n" + message; } function detectDeviceInfo() { const ua = navigator.userAgent; let device = "Inconnu"; if (/android/i.test(ua)) device = "Android"; else if (/iPad|iPhone|iPod/.test(ua)) device = "iOS"; else if (/Windows NT/.test(ua)) device = "Windows"; else if (/Mac OS X/.test(ua)) device = "macOS"; else if (/Linux/.test(ua)) device = "Linux"; let browser = "Navigateur inconnu"; if (/Chrome/.test(ua)) browser = "Chrome"; else if (/Safari/.test(ua) && !/Chrome/.test(ua)) browser = "Safari"; else if (/Firefox/.test(ua)) browser = "Firefox"; else if (/Edg/.test(ua)) browser = "Edge"; else if (/Opera|OPR/.test(ua)) browser = "Opera"; logMessage("🧾 Appareil détecté : " + device); logMessage("🌐 Navigateur : " + browser); } // Nouvelle fonction pour nettoyer IndexedDB async function clearIndexedDB() { if (!window.indexedDB) { logMessage("❌ IndexedDB non supporté."); return; } try { const dbNames = await indexedDB.databases(); let count = 0; if (dbNames && dbNames.length > 0) { for (const dbInfo of dbNames) { const dbName = dbInfo.name; await new Promise((resolve, reject) => { const request = indexedDB.deleteDatabase(dbName); request.onsuccess = () => { logMessage(`🗑️ IndexedDB : '${dbName}' supprimée.`); count++; resolve(); }; request.onerror = (event) => { logMessage(`⚠️ Erreur IndexedDB lors de la suppression de '${dbName}' : ${event.target.error}`); resolve(); // Continuer même en cas d'erreur }; request.onblocked = () => { logMessage(`⚠️ IndexedDB : Suppression de '${dbName}' bloquée. Fermez les autres onglets.`); resolve(); // Continuer même si bloqué }; }); } logMessage(`🗑️ Nettoyage IndexedDB terminé (${count} bases de données supprimées).`); } else { logMessage("❌ Aucune base de données IndexedDB trouvée."); } } catch (e) { logMessage("⚠️ Erreur lors de l'accès à IndexedDB : " + e.message); } } // Nouvelle fonction pour nettoyer l'API Cache (inclut les caches des Service Workers) async function clearCaches() { if (!window.caches) { logMessage("❌ API Cache non supportée."); return; } try { const keys = await caches.keys(); let count = 0; if (keys.length > 0) { for (const key of keys) { await caches.delete(key); logMessage(`🗑️ Cache d'API : '${key}' supprimé.`); count++; } logMessage(`🗑️ Nettoyage API Cache terminé (${count} caches supprimés).`); } else { logMessage("❌ Aucun cache d'API/Service Worker trouvé."); } } catch (e) { logMessage("⚠️ Erreur lors du nettoyage de l'API Cache : " + e.message); } } // Fonction principale de nettoyage async function clearEverything() { const log = document.getElementById("logZone"); log.innerText = "🧪 Journal de test :"; // reset zone detectDeviceInfo(); // --- 1. Afficher et supprimer les Cookies --- const rawCookies = document.cookie; if (rawCookies) { const cookieList = rawCookies.split("; "); logMessage("🍪 Cookies accessibles : (" + cookieList.length + ")"); cookieList.forEach(c => { const [name, value] = c.split("="); logMessage(`• ${name.trim()} = ${value}`); }); } else { logMessage("❌ Aucun cookie visible via JavaScript."); } // Fonction utilitaire pour supprimer un cookie sur des paths/domains courants function deleteCookie(name, path, domain) { let cookieString = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC;"; if (path) cookieString += " path=" + path + ";"; if (domain) cookieString += " domain=" + domain + ";"; document.cookie = cookieString; } // Supprimer les cookies (en essayant les paths courants : '/', '' et le domaine courant) const cookies = document.cookie.split(";"); cookies.forEach(cookie => { const eqPos = cookie.indexOf("="); const name = eqPos > -1 ? cookie.substring(0, eqPos).trim() : cookie.trim(); // Essayer de supprimer sur différents paths deleteCookie(name, "/"); // Chemin racine deleteCookie(name, ""); // Chemin par défaut // Optionnel : essayer le domaine racine (pour les sous-domaines) const hostname = window.location.hostname; const domainParts = hostname.split('.'); if (domainParts.length > 1) { const rootDomain = domainParts.slice(-2).join('.'); deleteCookie(name, "/", "." + rootDomain); // Tenter suppression sur le domaine racine } }); logMessage("🧹 Cookies supprimés (chemins /, '', et domaine racine tentés)."); // --- 2. Vider Stockage Web (localStorage et sessionStorage) --- try { const localLength = localStorage.length; localStorage.clear(); logMessage(`🗑️ Stockage local vidé (${localLength} éléments supprimés).`); } catch(e) { logMessage("⚠️ Erreur lors du nettoyage de localStorage : " + e.message); } try { const sessionLength = sessionStorage.length; sessionStorage.clear(); logMessage(`🗑️ Stockage session vidé (${sessionLength} éléments supprimés).`); } catch(e) { logMessage("⚠️ Erreur lors du nettoyage de sessionStorage : " + e.message); } // --- 3. Vider IndexedDB --- logMessage("⏳ Nettoyage IndexedDB..."); await clearIndexedDB(); // Attendre que le nettoyage IDB soit terminé // --- 4. Vider Caches API/Service Worker --- logMessage("⏳ Nettoyage des caches..."); await clearCaches(); // Attendre que le nettoyage des caches soit terminé // --- 5. Rechargement différé --- logMessage("🔄 Rechargement en cours... (dans 4,5s)"); setTimeout(() => { // Ajout d'un paramètre unique pour s'assurer que le navigateur ne sert pas une page en cache window.location.href = window.location.pathname + '?refresh=' + Date.now(); }, 5500); // Temps d'affichage } </script> <!-- 💻 Ordinateurs 📱 Smartphones Android / iOS 🧪 Tous navigateurs modernes //--> <!-- 🧠 Aide Mémo : ✅ Ce bouton : – Affiche les cookies actuels – Détecte le navigateur et l'appareil – Vide les cookies accessibles par JS – Vide localStorage + sessionStorage – Recharge la page avec ?refresh=... ⚠️ Ce script ne peut PAS : – Supprimer les cookies HttpOnly (protégés par le navigateur) – Vider le cache complet du navigateur (images, fichiers...) Pour cela, il faut le faire manuellement dans les paramètres du navigateur. --> <!-- ❗ Important à savoir : Les cookies supprimés sont uniquement ceux accessibles via JavaScript (donc pas HttpOnly). Le cache complet du navigateur (images, JS, etc.) ne peut pas être vidé par script. L'utilisateur doit le faire via les paramètres du navigateur. Cookie Deletion Robustesse : La suppression des cookies tente désormais de couvrir les chemins par défaut (/ et "") et essaie même le domaine racine (ex. my-domain.com au lieu de sub.my-domain.com) pour une couverture maximale. • IndexedDB (IDB) Nettoyage : La fonction clearIndexedDB() énumère et supprime toutes les bases de données IndexedDB associées à l'origine actuelle. C'est essentiel, car IDB est souvent utilisé pour les données importantes d'applications web. • Cache API Nettoyage : La fonction clearCaches() supprime tous les caches gérés par l'API Cache, ce qui inclut les caches utilisés par les Service Workers. Ceci est crucial pour les applications PWA ou hors ligne. • Utilisation d'await : Les fonctions de nettoyage IndexedDB et Caches sont async (asynchrones) et sont appelées avec await dans clearEverything(). Cela garantit que le journal affiche l'état de ces nettoyages complexes avant le rechargement de la page. Ce script offre une suppression beaucoup plus complète de l'ensemble des mécanismes de stockage côté client modernes. //-->