Description du problème

Au cours de la semaine passée, deux dysfonctionnements d’interface ont été signalés sur GitHub. Le premier concerne le compteur de pull requests (PR) affiché dans l’onglet d’un dépôt. Après la fusion d’une PR, le nombre indiqué augmente de façon anormale, même si le total réel de PR ouvertes reste inchangé. Le compteur affiché sur la page détaillée du dépôt, en revanche, montre la valeur correcte, ce qui révèle une incohérence entre les deux affichages.

Le second bug apparaît lors de la configuration de Sentry pour un projet hébergé sur GitHub. L’utilisateur, fort de 11 ans d’expérience, possède plusieurs pages d’appartenance à des organisations. La page de configuration ouvre une fenêtre pop‑up qui, selon le navigateur Chrome, bloque toute modification manuelle de l’URL dans la barre d’adresse. Cette restriction empêche de naviguer directement vers la page d’une organisation située sur la deuxième page de résultats.

Analyse technique du comptage

Le compteur de PR dans l’onglet repose probablement sur un appel API GET /repos/:owner/:repo/pulls avec un paramètre de pagination. Lorsqu’une PR est fusionnée, le serveur met à jour le statut, mais le client conserve une version en cache du nombre total. Si le rafraîchissement du cache ne se déclenche pas correctement, le compteur incrémente à chaque événement de fusion sans décrémenter, d’où l’« overcount ». Le fait que la page détaillée du dépôt affiche le bon nombre indique que le rendu serveur (ou un appel API distinct) récupère la donnée à jour, tandis que le composant de l’onglet utilise une logique de mise à jour incrémentale défectueuse.

Cette architecture client‑side, typique des applications SPA, favorise la réactivité mais introduit des risques de désynchronisation lorsqu’une opération modifie plusieurs états simultanément. Sans mécanisme de validation périodique (par exemple, un ETag ou un If-None-Match), le compteur peut rester erroné jusqu’à un rechargement complet de la page.

Limites du navigateur et contournement

Chrome empêche la modification de l’URL dans la barre d’adresse des fenêtres pop‑up pour des raisons de sécurité, afin de réduire les attaques de type phishing. Cette restriction s’applique aux fenêtres créées par window.open avec l’attribut noopener ou noreferrer. Le contournement proposé consiste à exécuter du JavaScript dans la fenêtre elle‑même, par exemple :

window.location.href = 'https://github.com/organizations/your-org';

Cette instruction force la navigation interne sans passer par la barre d’adresse, contournant ainsi la protection du navigateur. Cependant, elle dépend de la capacité du script à s’exécuter dans le contexte de la pop‑up, ce qui peut être limité par les politiques de même origine (same‑origin policy) ou par les en-têtes CSP du site.

En résumé, le premier bug révèle une faiblesse de synchronisation entre le cache client et les données serveur, tandis que le second expose une contrainte de sécurité du navigateur qui nécessite un contournement JavaScript. Les deux cas soulignent l’importance d’une gestion rigoureuse des états côté client et d’une prise en compte explicite des politiques de navigation imposées par les navigateurs modernes.