diff --git a/background.js b/background.js
index 1fa9aa3..14acfc9 100644
--- a/background.js
+++ b/background.js
@@ -192,7 +192,7 @@ async function fetchTimelineApi(origin, phpsessid, guid, formId, formChecksum) {
`&checksum=${encodeURIComponent(formChecksum)}` +
`&type=todo§ionId=1&navigator=&nbRecord=0` +
`&PHPSESSID=${encodeURIComponent(phpsessid)}`;
- const r = await fetch(url, { credentials: "include" });
+ const r = await evFetch(url, origin);
if (!r.ok) {
const err = new Error("HTTP " + r.status);
err.kind = classifyHttpStatus(r.status);
@@ -206,9 +206,90 @@ async function fetchTimelineApi(origin, phpsessid, guid, formId, formChecksum) {
// Détection "session invalide"
// ============================================================================
+/**
+ * v5.0.9 : détecte plusieurs patterns de session invalide :
+ * 1. Page de login classique EasyVista (customer_login, my.policy)
+ * 2. Script de redirection court :
+ * (protection CSRF ou session expirée)
+ * 3. URL de logout : index.php?...&logout=1
+ * 4. Redirection vers le portail SSO : portail.etat-de-vaud.ch/sso/
+ * 5. Réponse JSON avec "isLogged": false
+ */
function looksLikeLoginPage(text) {
- // La page de login EasyVista contient cette chaîne
- return /customer_login|my\.policy/i.test((text || "").substring(0, 3000));
+ const t = (text || "").substring(0, 3000);
+ if (!t) return false;
+ // Pattern 1 : page de login EV classique
+ if (/customer_login|my\.policy/i.test(t)) return true;
+ // Pattern 2 : script de redirection (< 500 chars = probablement juste ça)
+ if (t.length < 500 && /