You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Onglets invisibles après « Réinitialiser les catégories » : les onglets d'une catégorie supprimée (par exemple importée) n'apparaissaient plus dans le popup ; ils sont maintenant rattachés à la première catégorie. Un onglet enregistré avec une catégorie inconnue l'est aussi.
Catégories bloquées après un import : un fichier importé pouvait contenir une catégorie sans nom ; ensuite, renommer n'importe quelle catégorie échouait (« données invalides ») jusqu'à une réinitialisation. Ces catégories sont maintenant écartées à l'import.
Onglet enregistré en double : un double-clic dans la fenêtre « Épingler dans une catégorie » enregistrait deux fois l'onglet ; le popup ignore le second clic et l'arrière-plan refuse une adresse déjà enregistrée.
Date d'ouverture importée : une valeur invalide (« il y a 20 733 jours ») n'est plus importée.
Pages confondues : deux vidéos YouTube (?v=), deux listes (list) ou deux routes d'une application web (#/a, #/b) étaient considérées comme le même onglet, et le second n'était jamais ouvert ; ces paramètres et routes sont maintenant pris en compte.
Modification perdue : une lecture lancée pendant une sauvegarde pouvait remettre en mémoire d'anciennes données, que la sauvegarde suivante réécrivait ; la lecture est maintenant ignorée dans ce cas.
Arrière-plan bloqué : une erreur de stockage au démarrage faisait échouer tous les messages jusqu'au rechargement de l'extension ; l'initialisation est maintenant retentée au message suivant.
Mémoire incohérente : si une écriture échouait (quota…), la mémoire gardait des données absentes du stockage ; elle n'est plus modifiée qu'après une écriture réussie.
Popup : le bouton « Ouvrir N onglets » et l'ouverture d'une catégorie ignorent maintenant les onglets désactivés, et la confirmation de fermeture annonce le nombre d'onglets réellement fermés (rien n'est demandé s'il n'y en a aucun).
Options : enregistrer deux fois la même adresse est refusé.
Stockage : la limitation de débit espace maintenant aussi les appels simultanés, et la clé de cache n'est plus ambiguë pour une lecture avec valeurs par défaut.
« Dernière ouverture » mal traduite : le temps écoulé était assemblé à la main (« ago 3 days », « vor 3 Stundes », « 前 3 日s »…) ; il est maintenant formaté par le navigateur dans la langue de l'utilisateur (« il y a 3 heures », « vor 3 Stunden », « 3 時間前 »).
« Onglet déjà épinglé » : le popup comparait les adresses autrement que le script d'arrière-plan, et pouvait donc annoncer un onglet comme épinglé (ou non) à tort ; une seule fonction de comparaison est partagée.
Ordre des catégories : la catégorie « Développement » était reconnue par son nom (toute catégorie contenant « dev », comme « Devis », passait en dernier, et la règle échouait dans les autres langues) ; elle l'est maintenant par son identifiant.
Données importées effacées : un import fait juste après l'installation pouvait être écrasé par l'initialisation des données par défaut, et une lecture lente pouvait remettre en mémoire d'anciennes données. Les opérations sur les données sont désormais exécutées une par une, et une lecture qui chevauche une écriture n'est plus utilisée ni mise en cache.
Onglets en cours de chargement : un onglet pas encore chargé n'était pas reconnu (adresse vide) : « Fermer » une catégorie l'ignorait et « Ouvrir » pouvait le dupliquer.
Accessibilité : contraste insuffisant corrigé (bouton « Fermer » du popup, textes secondaires) ; les fenêtres de dialogue sont annoncées comme telles, prennent le focus à l'ouverture et le rendent à la fermeture ; Échap ferme seulement la fenêtre du dessus ; cartes et badges de catégorie utilisables au clavier ; préférence « réduire les animations » respectée ; styles de contraste élevé réactivés (prefers-contrast: high n'existe pas, remplacé par more).
Traductions manquantes : Les textes de fermeture d'une catégorie (« Fermer », confirmation, messages de résultat) manquaient dans 12 langues et s'affichaient en anglais.
Message français : « Certains onglets étaient déjà ouverts » n'affichait plus les nombres d'onglets ouverts et créés.
Vérification du stockage : Le contrôle de santé vérifie maintenant que la valeur relue correspond à celle écrite.
Import sécurisé : Un fichier importé ne peut plus enregistrer d'onglets sans URL http(s) (javascript:, file:…) ni de données mal formées ; les identifiants en double sont corrigés et les onglets ignorés sont comptés.
Traduction du popup : Les textes du popup sont traduits dès l'ouverture, même si le script d'arrière-plan tarde à répondre ou échoue.
Échec d'ouverture signalé : Quand aucun onglet n'a pu être ouvert, le popup affichait « Tous les onglets sont déjà ouverts » ; il affiche maintenant une erreur.
Page d'options : Le modèle du sélecteur rapide de catégorie était placé après </html> (HTML invalide) ; ses boutons et celui du choix d'icône ont désormais un libellé traduit, aussi lu par les lecteurs d'écran.
Titres non traduits : Le titre « Modifier l'onglet » et le message d'échec d'export utilisaient des clés inexistantes et restaient en anglais dans toutes les langues ; un test vérifie désormais que chaque texte demandé existe.
Icônes exposées aux sites : Le manifeste rendait les icônes de l'extension accessibles à toutes les pages web, ce qui permettait de détecter l'extension ; cette exposition inutile est retirée.
Liens du dépôt : Les liens du manifeste, du README et du changelog pointent vers le bon dépôt.
🧹 Qualité
Versions minimales déclarées : Firefox 115 (ESR) et Chrome 104, d'après les fonctions utilisées ; Node 20.11 pour les outils (engines, .nvmrc) ; mises à jour des dépendances proposées par Dependabot.
popup.js (≈ 480 lignes) et options.js (≈ 380) allégés : liste des catégories, ordre des catégories et cartes d'onglet passent dans leurs propres modules.
Tests d'interface : Playwright charge la vraie extension dans Chromium et teste le popup et la page d'options (ouverture, fermeture, ajout, modification, suppression, flèches, glisser-déposer, changement de catégorie, icônes, export / import), avec un audit d'accessibilité axe-core (clair et sombre) et des tests au clavier ; exécutés dans la CI.
Textes de secours retirés : les 63 textes anglais en dur après getMessage(...) sont supprimés ; le test des traductions garantit que chaque texte demandé existe.
Stylelint : configuration standard, corrections (doublons, propriétés inexistantes, animations en double, notations), exécuté dans la CI.
Modules ES : tout le code (arrière-plan, popup, options, lib/) est passé en modules ES natifs avec des imports explicites. Il n'y a plus de variables globales partagées ni de dépendance à l'ordre des balises <script> : chaque page charge un seul module d'entrée, et l'arrière-plan est déclaré type: module (Firefox et Chrome).
Arrière-plan découpé : la classe unique d'environ 1000 lignes devient 7 modules (contrôleur des messages, stockage des données, actions sur les onglets, validation de l'import, utilitaires), le plus gros faisant 177 lignes ; un état jamais lu (tabUrlsById) est supprimé. Chaque module a ses propres tests.
Envoi de messages au script d'arrière-plan centralisé dans UiUtils.sendMessage (deux variantes divergentes auparavant) ; le popup ne relance plus une action que le script d'arrière-plan a refusée.
CSS : 29 règles jamais utilisées et 55 variables recopiées à l'identique de shared.css supprimées (≈ 280 lignes), sans aucun changement visuel (16 captures clair/sombre comparées pixel par pixel) ; un test empêche de réintroduire des styles morts.
Messages d'ouverture d'onglets du popup regroupés dans reportOpenResult ; carte d'onglet des options et validation de l'import découpées en petites fonctions ; ESLint limite la complexité et la longueur des fonctions, sans avertissement toléré en CI.
StorageManager simplifié : une seule boucle de reprise pour lecture et écriture, suppression d'une fausse déduplication (identifiants horodatés jamais identiques) et de méthodes inutilisées ; le cache renvoie des copies pour qu'une modification par l'appelant ne le corrompe pas.
Code mort retiré : actions updateSettings / updateTab jamais envoyées, fonctions inutilisées d'I18nHelper, 8 textes de traduction inutilisés (un test empêche d'en réintroduire).
Prise en charge des conteneurs Firefox retirée (lib/container-utils.js) : sans la permission contextualIdentities, elle n'était jamais active. Les identifiants de conteneur des anciennes sauvegardes sont ignorés à l'import.
Logique d'ouverture des onglets factorisée (openTabConfigs), journaux de débogage désactivés par défaut, helpers partagés popup/options (lib/ui-utils.js).
popup.js et options.js découpés par fonctionnalité (édition et réorganisation des onglets, catégories, sélecteur d'icônes, import/export, actions du popup, sélection de catégorie) ; une méthode getSelectedIcon définie en double supprimée.
Traduction des pages centralisée dans I18nHelper.localizePage (le module n'était utilisé que par les tests) ; textes de secours du HTML et commentaires en anglais.
Tests ajoutés : validation de l'import, localizePage, cohérence des versions package.json / manifest.json.
Build, lint et dev travaillent sur une copie dans build/<navigateur>/ : manifest.json n'est plus réécrit à chaque commande, et seuls les fichiers de l'extension sont empaquetés (eslint.config.js ne part plus dans les zips). La liste des scripts d'arrière-plan Firefox est lue depuis background.js.
README corrigé (dossier du dépôt, commandes, permissions) ; nom du paquet npm valide.
ESLint, .editorconfig et tests (ouverture des onglets, helpers, cohérence des traductions) exécutés dans la CI.