Skip to content

fix(detector): T-222/T-224 overlay M9 Google + UC-05 spam DuckDuckGo#188

Merged
antonyblain merged 1 commit intodevelopfrom
feature/p5-tache-222-224-overlay-m9-uc05-spam
Apr 28, 2026
Merged

fix(detector): T-222/T-224 overlay M9 Google + UC-05 spam DuckDuckGo#188
antonyblain merged 1 commit intodevelopfrom
feature/p5-tache-222-224-overlay-m9-uc05-spam

Conversation

@antonyblain
Copy link
Copy Markdown
Owner

Résumé des 2 bugs corrigés

TACHE-222 — Overlay M9 force-mdp Google /challenge/pwd (INC-003, P1)

Deux sous-bugs corrigés :

(a) Activation à tort sur une page de connexion

  • Cause : Google met autocomplete="new-password" sur son écran de connexion /challenge/pwd. isCreationForm() retournait true → M9 s'activait alors que l'utilisateur saisit son password existant.
  • Fix : handleFocusOnPasswordField court-circuite M9 si isSignInContext() retourne true. Réutilise le helper post-PR#187 (TACHE-221). Comportement sur github.com/login : inchangé (M9 absent, attendu).

(b) Chevauchement layout Google dense

  • Cause : insertAdjacentElement('afterend', host) insérait le host dans le flux DOM juste après le champ, chevauchant la case « Afficher le mot de passe » et le champ password.
  • Fix : Option 1 (fixed) retenuedocument.body.appendChild(host) avec position:fixed; z-index:2147483647. Fonction positionHost() recalcule top/left/width via getBoundingClientRect() à chaque show() + sur les événements scroll (capture:true) et resize.
  • Justification du choix Option 1 : plus robuste sur layouts denses et pages scrollables que l'Option 2 (margin-top calculé). Le host en fixed est insensible au flux du formulaire parent (cas Google, layouts SPA).
  • syncM9Width() supprimée (dead code remplacé par positionHost()).

TACHE-224 — UC-05 spam logs + faux positif DuckDuckGo (INC-008, P1)

(a) Spam 27 logs "from=text to=text"

  • Cause : handleTypeAttributeMutation entrait dans le bloc de traitement même si oldType === newType.
  • Fix : if (oldType === newType) continue; en early-return au début de la boucle. Élimine 100% des mutations sans changement réel.

(b) Faux positif <input name="q"> dans _snPasswordInputs

  • Cause : registerPasswordInput() était appelé pour toute mutation newType === 'text', y compris les transitions text→text, search→text, etc.
  • Fix : registerPasswordInput() conditionné à oldType === 'password' || newType === 'password'. Un input type="search" qui n'a jamais été password ne rejoint plus jamais _snPasswordInputs.

Tableau before/after UC-05 (DuckDuckGo searchbox)

Scenario Avant correctif Après correctif
Mutation text→text Log émis, input ajouté à _snPasswordInputs Early-return, 0 log, non ajouté
27 mutations identiques en 17s 27 logs spam 0 log
<input name="q"> dans _snPasswordInputs Présent (faux positif) Absent
Mutation password→text (toggle show) Log émis, ajouté Inchangé — log émis, ajouté
Mutation text→password (toggle hide) Log émis, ajouté Inchangé — log émis, ajouté

Tests ajoutés

TACHE-224 :

  • T-224-01 : mutation from=text to=text → court-circuité, 0 log, non ajouté
  • T-224-02 : mutation from=password to=text → handler exécuté, log émis, ajouté
  • T-224-03 : mutation from=text to=password → handler exécuté, log émis, ajouté
  • T-224-04 : input type="search" sans mutation password → jamais dans _snPasswordInputs

TACHE-222 :

  • T-222-01 : isSignInContext() retourne true sur /signin/v2/challenge/pwd
  • T-222-02 : isSignInContext() retourne false sur /accounts/create
  • T-222-03 : isSignInContext() retourne true sur /login
  • T-222-04 : overlay host dans document.body, pas dans le form parent (non-régression afterend)
  • T-222-05 : host en position:fixed avec z-index:2147483647
  • T-222-06 : show() repositionne le host via getBoundingClientRect()

Suite complète : 1165/1165 tests verts, 67/67 fichiers, 0 régression.


Fichiers touchés

  • src/content-scripts/detectors/password-detector.ts — 4 zones modifiées
  • tests/unit/content-scripts/password-detector-t222-t224-m9-uc05.test.ts — nouveau fichier (10 tests)

Référence : TACHE-222, TACHE-224, INC-003, INC-008, PV recette 2026-04-24

🤖 Generated with Claude Code

TACHE-222 — Overlay M9 force-mdp activé à tort sur Google /challenge/pwd (INC-003)
  (a) handleFocusOnPasswordField : désactivation M9 si isSignInContext()=true.
      Google met autocomplete="new-password" à tort sur son écran de connexion.
      L'overlay ne doit jamais apparaître quand l'utilisateur saisit son password existant.
  (b) createStrengthIndicator : positionnement fixed via getBoundingClientRect()
      (Option 1 retenue). Remplace insertAdjacentElement('afterend') qui chevauchait
      la case "Afficher le mot de passe" sur le layout Google dense.
      Le host est maintenant inséré dans document.body (hors flux DOM), reposé à
      chaque show() + scroll/resize via positionHost(). syncM9Width() supprimée
      (dead code remplacé par positionHost()).

TACHE-224 — UC-05 spam 27 logs "from=text to=text" + faux positif DuckDuckGo (INC-008)
  (a) handleTypeAttributeMutation : early-return si oldType === newType.
      Élimine 100% des mutations sans changement réel (cas searchbox text→text).
  (b) registerPasswordInput() conditionné à oldType==="password" || newType==="password".
      Un input type="search" qui n'a jamais été password ne rejoint plus _snPasswordInputs.

Tests ajoutés : T-224-01/02/03/04 (UC-05 spam + faux positif) + T-222-01/02/03/04/05/06
(isSignInContext URL patterns + positionnement fixed overlay).

Référence : TACHE-222, TACHE-224, INC-003, INC-008, PV recette 2026-04-24

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@antonyblain antonyblain merged commit 22f5830 into develop Apr 28, 2026
6 checks passed
@antonyblain antonyblain deleted the feature/p5-tache-222-224-overlay-m9-uc05-spam branch April 28, 2026 09:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant