Titre incorrect dans la fenêtre contextuelle de l'historique (firefox)

Bonjour,

Dans Firefox, le titre de la page précédente qui s’affiche lors d’un clic droit sur la flèche « page précédente » est remplacé par le titre de la page actuelle.

Par exemple, si la première page affichée est :
https://meta.discourse.org/
remarquez à quoi ressemble le clic droit sur la flèche (c’est correct) :

Ensuite, en accédant à n’importe quel sujet, tel que :

le titre de la page précédente a été remplacé par le titre de la page actuelle :

Néanmoins, le lien reste valide.

Une idée concernant ce bug ?

Il semble en effet s’agir d’un bug, peut-être lié à la manière ou à l’ordre dans lequel nous remplaçons l’historique, ou d’une particularité de Firefox.

Je parviens à reproduire le problème.

Comme il est assez mineur, j’ajoute le tag pr-welcome au cas où la communauté souhaiterait proposer une correction.

d’accord, merci pour ta réponse

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 :

Object.defineProperty(document, "title", {
  get() {
    return document.head.querySelector('title').innerText;
  },
  set(t) {
    console.debug('title', t, new Error("title!").stack)
    debugger;
    document.head.querySelector('title').innerText = t;
  },
  enumerable: true,
  configurable: true,
});
let ___push___ = window.history.pushState;
window.history.pushState = function(...args) {
  console.debug('push', args[0], new Error().stack);
  debugger;
  ___push___.apply(this, args);
};

let ___replace___ = window.history.replaceState;
window.history.replaceState = function(...args) {
  console.debug('replace', args[0], new Error().stack);
  debugger;
  ___replace___.apply(this, args);
};

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.

1 « J'aime »

(en tant que nouvel utilisateur, je ne peux pas mettre plus de 2 liens par publication :frowning: )

[1] (discourse/app/assets/javascripts/discourse/app/lib/page-tracker.js at 245e9f30a4825beb86fcbfcf718208752748e5b4 · discourse/discourse · GitHub)

[2] (discourse/app/assets/javascripts/discourse/app/controllers/topic.js at 542f77181a47df8aa0f909f69814406491d08c5e · discourse/discourse · GitHub)

1 « J'aime »