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

Hello,
in Firefox, the previous page title that appears with a right clic on the “previous page” arrow is overwritten with the current page title.

For instance, if the first page displayed is:
https://meta.discourse.org/
see what the right click on arrow looks like (it is correct):

then going on any topic, such as:

the title of the previous page has been overwritten with the current page title:

Nevertheless, the link is still valid.

any idea about this bug?

It does indeed look like a bug possibly in the way / sequence that we replace history or a firefox quirk.

I am able to reproduce.

Since it is fairly minor I am going to put a pr-welcome in case the community would like to pitch in and propose a fix.

alright, thanks for your answer

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 »