Journal des modifications
Toutes les modifications notables de Magic Threads sont documentées dans ce fichier.
Le format est basé sur Keep a Changelog,
et ce projet adhère au Versionnage Sémantique.
[2.5.3] - 2026-07-31
Modifié
- Compatibilité Thunderbird 153+ : Relevé de
strict_max_versionde152.*à154.*dansmanifest.jsonsuite à la sortie de Thunderbird 153 (résolution du blocage d'installation sur Thunderbird 153.0.1).
[2.5.2] - 2026-06-27
Corrigé
- Sélection intra-dossier robuste (background.js) : Application systématique du délai de sécurité de 250 ms et de la boucle de retry de sélection pour les e-mails envoyés récents, y compris lorsque la navigation s'effectue au sein du même dossier (ex : clics successifs dans "Messages envoyés"), résolvant définitivement les cas de page blanche lors du premier clic.
Modifié
- Documentation : Mise à jour de
README.md(fonctionnalité de dédoublonnage intelligent) et deARCHITECTURE.md(section Résilience de la sélection, dédoublonnage Gmail, correction des diagrammes Mermaid). - Dépôt : Retrait de
JUSTIFICATION_ATN.mddu suivi Git (fichier conservé localement, ajouté au.gitignore).
[2.5.1] - 2026-06-27
Corrigé
- Robustesse & Dédoublonnage Gmail :
- Dédoublonnage robuste : normalisation de la détection du dossier virtuel Tous les messages (Gmail All Mail) indépendamment de la casse, avec support étendu de plus de 20 langues (dont l'espagnol, l'allemand, l'italien, etc.) et traitement correct des paramètres de requête et slashs terminaux dans glodaApi.js.
- Préservation du snippet : fiabilisation de la logique de fusion de messages de glodaApi.js pour conserver le snippet indexé de l'email quelle que soit la copie analysée.
- Sélection résiliente : implémentation d'une boucle de retry avec tolérance temporelle (jusqu'à 10 essais sur 500 ms) dans background.js pour garantir la sélection effective du message après changement de dossier dans la vue 3-pane.
- Accessibilité & Contraste WCAG AA :
- Rehausse du contraste de la couleur du dossier Envoyé (
--sent-text) en mode clair (de#2f855aà#276f4asur fond#f0fff4, atteignant un contraste conforme de 6,1:1). - Rehausse du contraste du texte secondaire (
--text-muted) en mode sombre (de#8a93a3à#8d98a9sur fond#282c34, atteignant un contraste conforme de 4,7:1). - Rétablissement de la continuité de navigation au clavier : le message courant est désormais focusable (
tabIndex="0") et déclaré comme un bouton inactif (role="button",aria-disabled="true"), supprimant la rupture de tabulation au sein de la liste. - Amélioration des options : ajout d'associations explicites
<label for="...">pour tous les boutons radio de la page de préférences. - Sémantique du tri : association de la description globale de tri au groupe d'options (
aria-describedbysur le<fieldset>parent). - Retour vocal sur l'en-tête du fil : ajout d'une zone
aria-live="polite"sur l'indicateur de mode et liaison viaaria-describedbysur le bouton de configuration ⚙️. - Ajout de la liaison
aria-controlsreliant le bouton de repli (▼) à la liste de discussion.
- Rehausse du contraste de la couleur du dossier Envoyé (
[2.5.0] - 2026-06-27
Ajouté
- Accessibilité & Sémantique :
- Rehausse du contraste du badge Archive en mode clair (valeur
#8f5700sur fond#fefcbfconforme WCAG AA à 5,1:1). - Ajout des rôles structurels de titre
role="heading"etaria-level="2"au titre du fil de discussion. - Ajout d'attributs
aria-labeldescriptifs sur les boutons emoji d'en-tête (Configuration et Réduction). - Intégration des attributs de séparation ARIA (
role="separator",aria-orientation,aria-valuemin,aria-valuemaxetaria-valuenowdynamique) sur la poignée de redimensionnement pour l'accessibilité au clavier. - Liaison des boutons radio de configuration à leurs descriptions textuelles respectives via
aria-describedbydans la page d'options.
- Rehausse du contraste du badge Archive en mode clair (valeur
Corrigé
- Discussions groupées (vue 3-pane) : Élargissement de l'écouteur
messageDisplay.onMessageDisplayedà tous les onglets pour résoudre l'absence d'affichage du panneau lors de l'expansion d'une discussion groupée dans la vue principale. - Robustesse & Dédoublonnage Gmail :
- Implémentation du dédoublonnage intelligent dans
glodaApi.js: normalisation des Message-IDs (chevrons et espaces) et filtrage prioritaire des dossiers Gmail (les dossiers spécifiques comme Envoyés ou Boîte de réception priment sur le dossier virtuel global Tous les messages). - Protection contre la faille d'injection de sélecteurs CSS dans
options.jspar validation des préférences par rapport à une liste blanche (ALLOWED_VALUES). - Résolution de la race condition inter-dossiers (page blanche sous Linux ESR) : le délai de sécurité de 250 ms n'est désormais appliqué qu'aux e-mails envoyés de moins de 5 minutes.
- Implémentation du dédoublonnage intelligent dans
[2.4.1] - 2026-06-22
Modifié
- Compatibilité Thunderbird 152 : Relevé de
strict_max_versionde151.*à152.*dansmanifest.jsonsuite à la sortie de Thunderbird 152.
[2.4.0] - 2026-06-13
Phase 4 du plan d'action (pérennité & publication). Aucun changement de comportement utilisateur : refactoring interne, outillage, documentation et préparation de soumission.
Ajouté
- Conception de l'après-Gloda (
CONCEPTION_POST-GLODA.md) : résolveur de fil à trois étages derrièrethreadResolver.js(Gloda → Experiment API sans Gloda viansIMsgThread/References→ filet 100 % WebExtension prêt MV3). Module de référence non câblébackground/threadResolverFallback.js. Veille Panorama : pas de retrait imminent de Gloda. - Justification ATN (
JUSTIFICATION_ATN.md) : argumentaire des deux Experiment APIs pour le relecteur Mozilla (pourquoi elles ne sont pas remplaçables par le SDK standard), avec résumé anglais prêt à coller. - Veille de compatibilité (
VEILLE_COMPATIBILITE.md) : checklist par beta/ESR (points d'appui DOM, Gloda, 3 modes), anticipation MV3. - Config ESLint « flat » (
eslint.config.js) +package.jsonde dev (outillage uniquement, exclu du XPI) : prêt pour ESLint 9, coexiste avec.eslintrc.json.
Modifié
- Refactoring de
magicThreadsWindowApi.js: feuilles de style hissées en constantes de module (SHARED_CSS/BOTTOM_CSS/SIDEBAR_CSS), construction d'un item de fil factorisée enbuildThreadItem(), magic numbers nommés (SIDEBAR_DEFAULT_WIDTH,BOTTOM_DEFAULT_HEIGHT,PANEL_Z_INDEX). Lisibilité accrue, risque de récidive du bug de portée réduit. build.sh: extraction de version robuste (parsing JSON via node, repli grep/sed ne confondant plusversionetmanifest_version).- Documentation alignée sur le code :
ARCHITECTURE.md(GlodagetMessageCollectionForHeadersau lieu deGlodaMsgSearcher, deux écouteurs réels, trois chemins de navigation, retrait de l'option « gauche » 3-pane),AGENTS.md(onMessagesDisplayOffinexistant corrigé),CHANGELOG(« beside » corrigé).
[2.3.0] - 2026-06-13
Accessibilité et i18n issus de la phase 3 du plan d'action.
Ajouté
- Navigation clavier du panneau : les messages du fil sont focusables (Tab) et activables à Entrée/Espace (
role="list"/listitem/button,aria-currentsur le message affiché), anneau de focus visible (:focus-visible) sur les items, les boutons d'en-tête et la poignée — qui se pilote désormais aussi aux flèches du clavier (role="separator", pas de 16 px). - Avertissement Gloda : si la recherche globale est désactivée dans Thunderbird, la page d'options affiche un bandeau d'alerte (
role="alert", nouvelle fonctionconvGloda.isGlodaAvailable) au lieu de laisser l'extension silencieusement inerte. - État « non lu » accessible : libellé annoncé aux lecteurs d'écran (clé i18n
unreadLabel, 7 locales) en complément du point rouge ;aria-expandedsur le bouton réduire/déplier.
Corrigé
- Contrastes WCAG AA : palette du panneau adossée aux variables de thème Thunderbird (
--layout-*,--color-accent-primary) avec fallbacks relevés à ≥ 4,5:1 (--text-muted:#5a6675clair /#8a93a3sombre). - Traductions : es/pt « anticroonológico » → « anticronológico », « Archivos »/« Arquivos » (faux-sens) → « Archivados »/« Arquivadas » ; vi : « luồng » unifié en « chuỗi », « thẻ gốc mới » reformulé ; libellés de secours (
DEFAULT_LABELS) passés en anglais. - Page d'options : groupes de radios en
<fieldset>/<legend>, confirmation d'enregistrement annoncée (role="status"), couleurs codées en dur remplacées par les couleurs système (lisible en thème sombre).
Modifié
- Manifest : déclaration
data_collection_permissions: ["none"](aucune collecte de données) requise par les linters récents.
[2.2.2] - 2026-06-13
Corrigé
- Compteur de fil dépendant du point d'entrée : les en-têtes
Referencesne pointant que vers les ancêtres, la réunification 2.2.1 pouvait rester partielle selon le message cliqué (17 vs 63 sur le même fil, typiquement depuis un transfert dans Envoyés). Le fil localnsIMsgThreadest désormais absorbé pour chaque message ramené — et non plus seulement pour le message cliqué — ce qui relie les branches dans les deux sens (ancêtres ET descendants). Passes d'expansion portées de 3 à 4.
[2.2.1] - 2026-06-13
Corrigé
- Fil incomplet (conversations Gloda fragmentées) : Gloda affecte la conversation à l'indexation et ne fusionne jamais rétroactivement — une même chaîne de réponses pouvait être éclatée en plusieurs conversations (indexation dans le désordre, reconstruction d'index), et le panneau n'affichait alors qu'un fragment variant selon le message cliqué (constaté en recette : 2/5/10/14 pour un fil de ~50). Le résolveur réunit désormais la conversation Gloda du message, le fil local du dossier (
nsIMsgThread, soit exactement ce que la liste de messages affiche) et les conversations sœurs retrouvées en suivant les en-têtesReferences(requêtes GlodaheaderMessageID), avec dédoublonnage parMessage-ID. Expansion bornée (3 passes, 100 identifiants par requête, 500 messages max) pour préserver la réactivité.
[2.2.0] - 2026-06-12
Durcissement sécurité et nettoyages issus de la phase 2 du plan d'action.
Sécurité
- Schémas Experiment strictement typés :
showBannerreçoit désormais des structures validées par le schéma WebExtension (tableau de messages à propriétés typées, objet de libellés à clés énumérées,additionalProperties: false,enumsur les modes et positions) au lieu de chaînes JSON opaques (JSON.parsesupprimé du contexte chrome). Défense en profondeur à la frontière privilégiée.
Corrigé
- Nettoyage à la désactivation :
onShutdowncouvre désormais toutes les fenêtres, y compris les fenêtres message autonomes (mail:messageWindow), et restaurepositionsur lemessagePane(style résiduel). - Changement de position du panneau en onglet message : le panneau latéral est recréé du bon côté si la préférence change pendant que l'onglet est ouvert (avant : panneau d'un côté, marge de l'autre).
- Navigation en onglet message : le nouvel onglet est ouvert avant la fermeture de l'ancien — plus de perte d'onglet si l'ouverture échoue.
- Message sans date : classé en fin de fil (epoch) au lieu de prendre la première place avec la date courante.
Modifié
- Redimensionnement en Pointer Events avec capture (
setPointerCapture) : plus de listeners orphelins sur le document si le panneau est reconstruit pendant un glisser, relâchement hors fenêtre géré, support tactile (touch-action: none). - Option « panneau à gauche » en vue principale définitivement retirée : la valeur stockée
leftest migrée versrightau démarrage (fin du remap silencieux qui rendait la page d'options mensongère), code mort et clés i18noptMainViewLeft*supprimés des 7 locales. - Logs : suppression des
console.logde routine ; leswarn/errorconservés sont en anglais. - Qualité : flag pièce jointe via
Ci.nsMsgMessageFlags.Attachment(au lieu de0x10000000en dur), bornes de redimensionnement en constantes nommées, snippet à 700 caractères pleins (off-by-one).
[2.1.2] - 2026-06-12
Correctifs issus de la phase 1 du plan d'action (audit du 12 juin 2026).
Corrigé
- Poignée de redimensionnement absente en sidebar gauche : la variable
pendingResizeHandleétait déclarée dans un blocifet hors de portée au moment de l'insertion dans le Shadow DOM — la poignée n'était jamais ajoutée. - Conditions de course à l'affichage du fil : le compteur de requêtes, global, est remplacé par un compteur par onglet ; les requêtes en vol sont invalidées lors du masquage du panneau (désélection, multi-sélection) ; plus aucun
awaitentre le contrôle de fraîcheur et l'affichage (préférences chargées en parallèle de la requête Gloda viaPromise.all). - Requête Gloda de conversation sans timeout :
getConversationMessagesbénéficie du même délai maximal (10 s) que la requête initiale ; le timer est annulé en cas d'exception synchrone de Gloda.
Sécurité
- Suppression du log de l'URI complète du message lors de la navigation (fuite de métadonnées dans la console globale).
Qualité
- Lint ESLint au vert (0 erreur, 0 avertissement) : suppression des commentaires
/* global */redondants, configuration dédiée pourexperiment-api/(contexte chrome :sourceType: script, pas desetTimeout/clearTimeoutglobaux) ; correction d'une indentation trompeuse dans le handler de redimensionnement.
Modifié
- ID de l'extension :
magicthreads-b@xulforum.org→magic-threads@mtfkarukera.net(domainexulforum.orgnon possédé ; l'ID est définitif après publication sur ATN). Thunderbird traitera cette version comme une nouvelle extension : désinstaller l'ancienne, les préférences repartent aux valeurs par défaut. strict_max_version: "151.*"ajouté au manifest : exigé par le validateur ATN pour les extensions utilisant des Experiment APIs. À relever à chaque version de Thunderbird validée (testé sur 140 ESR et 151).
Ajouté
- Icône de l'extension (16/32/48/64/128 px, dossier
icons/), déclarée dans le manifest — affichée dans le gestionnaire de modules et sur la fiche ATN. - LICENSE incluse dans le XPI (exigence de distribution MPL-2.0 relevée par l'audit).
[2.1.1] - 2026-06-12
Corrigé
- Nettoyage au déchargement de l'extension :
cleanupSidebar3PaneContainerétait inaccessible depuisonShutdown()(portée limitée àgetAPI()), empêchant la restauration des marges dumessageBrowserà la désactivation/désinstallation. La fonction est déplacée au niveau du module.
Modifié
- Logs de démarrage : la version affichée est lue dynamiquement depuis le manifest au lieu d'être codée en dur.
[2.1.0] - 2026-06-12
Ajouté
- Internationalisation (i18n) : support de 7 langues (fr, en, de, ja, es, pt, vi)
- Fichiers de structure projet : LICENSE, README, CHANGELOG, AGENTS.md, ARCHITECTURE.md, build.sh, .gitignore, .eslintrc.json
- Position configurable en 3-pane : choix entre panneau inférieur (bas) et panneau latéral (côté)
- Poignée horizontale pour redimensionner le panneau sidebar
[2.0.0] - 2026-06-11
Ajouté
- Panneau bottom dans la vue 3-pane : affichage du fil de discussion sous le message
- Sidebar en onglet message : affichage latéral du fil dans les onglets de message
- Gloda thread retrieval : récupération des fils de discussion via l'API Gloda (Experiment API XPCOM)
- Shadow DOM : isolation CSS complète du panneau injecté
- Mode sombre : adaptation automatique au thème de Thunderbird
- Poignée de redimensionnement : redimensionnement vertical du panneau bottom
- Indicateur de pièces jointes : icône 📎 pour les messages avec pièces jointes
- Navigation intra-onglet : clic sur un message du fil ouvre le message dans le même onglet
- Métadonnées affichées : expéditeur, date, snippet, dossier, pièces jointes
- Page d'options : configuration du mode de navigation et de la position du panneau