J’ai découvert que ce bug se manifeste également par des entrées corrompues dans l’historique de navigation, ce que je considère comme un problème plus grave. Plus précisément, un nouveau titre est attribué à une ancienne URL lorsque la navigation est gérée par du JS. Cela se produit presque toujours dans Firefox, mais c’est assez rare dans Chrome (j’ai trouvé une instance jusqu’à présent : passer de /top à un sujet).
@sam a raison de dire que cela est dû à l’ordre des opérations dans lequel l’URL et le titre sont modifiés. J’aimerais qu’il existe un guide des bonnes pratiques quelque part qui indique quel est le bon ordre : toujours mettre à jour le titre après avoir utilisé l’API history.
J’ai essayé de faire du débogage (et je tiens à dire d’avance que je suis assez réticent à construire un projet d’une taille modérée adjacente à npm). Initialement, j’ai utilisé ce code pour faire une petite reconnaissance :
Cela a effectivement montré qu’il y a presque toujours une modification du titre juste avant l’opération de l’API history. Malheureusement, cela n’a pas été plus utile que cela : relier ce qui se passe à l’exécution au code source était assez difficile – les opérations d’intérêt sont assez dispersées, la pile d’appels était trompeuse car l’exécution avait déjà cédé la place à la boucle d’événements d’Ember, et en général, l’expérience de débogage dans Firefox était assez infernale. Ayant basculé sur Chrome, j’ai eu un peu plus de succès. En bref, à ma connaissance, Ember décide lui-même quand mettre à jour l’URL. D’autre part, la modification du titre peut être initiée à partir de deux endroits : [1] et [2]
Seul ce dernier est jamais exécuté avant l’appel à l’API history. L’« ancêtre commun du code » se trouve ici :
// Run all the necessary enter/setup/exit hooks
this.setupContexts(newState, transition); // <- title change initiated here, by triggering `model.title:change` event
// Check if a redirect occurred in enter/setup
if (transition.isAborted) {
// TODO: cleaner way? distinguish b/w targetRouteInfos?
this.state!.routeInfos = this.currentRouteInfos!;
return Promise.reject(logAbort(transition));
}
this._updateURL(transition, newState); // <- url change initiated here
Fait intéressant, « router.js est la micro-librairie de routage utilisée par Ember.js. »
Maintenant, j’aimerais confier la gestion du problème à quelqu’un qui, contrairement à moi, connaît un tant soit peu la base de code de discourse.
Edit : j’ai oublié de mentionner : document.title est modifié par [1] une ou plusieurs fois après (les deux) sa modification [2] et la modification de l’URL par l’API history.