Falscher Titel im History-Popup (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

Ich habe festgestellt, dass dieser Fehler auch als leicht beschädigte Einträge in der Browserhistorie auftritt, was ich für ein schwerwiegenderes Problem halte. Genauer gesagt wird einer alten URL ein neuer Titel zugewiesen, wenn die Navigation von JS gehandhabt wird. Dies geschieht so ziemlich immer in Firefox, ist aber in Chrome ziemlich selten (ich habe bisher einen Fall gefunden: Wechsel von /top zu einem Thema).

@sam hat Recht, dass dies durch die Reihenfolge der Operationen verursacht wird, in der URL und Titel geändert werden. Ich wünschte, es gäbe irgendwo eine Art Leitfaden mit Best Practices, der die richtige Reihenfolge angibt: Aktualisieren Sie den Titel immer nachdem Sie die history-API verwendet haben.

Ich habe versucht, einige Debugging-Arbeiten durchzuführen (und ich möchte im Voraus sagen, dass ich ziemlich abgeneigt bin, ein mittelgroßes, npm-nahes Projekt zu erstellen). Anfangs habe ich diesen Code für eine kleine Erkundung verwendet:

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);
};

Es hat sich tatsächlich gezeigt, dass es fast immer eine Titeländerung unmittelbar vor der history-API-Operation gibt. Leider war das nicht hilfreicher: Die Zuordnung dessen, was zur Laufzeit geschieht, zum Quellcode war ziemlich schwierig – die interessierenden Operationen sind ziemlich verstreut, der Aufrufstapel war irreführend, da die Ausführung bereits an die Ember-Ereignisschleife übergeben wurde, und im Allgemeinen war die Debugging-Erfahrung in Firefox ziemlich höllisch. Nachdem ich zu Chrome gewechselt war, war ich etwas erfolgreicher. Lange Rede, kurzer Sinn, soweit ich weiß, entscheidet Ember selbst, wann die URL aktualisiert wird. Auf der anderen Seite kann die Änderung des Titels von zwei Stellen aus initiiert werden: [1] und [2]

Nur letzteres wird jemals vor dem history-API-Aufruf ausgeführt. Der “gemeinsame Code-Vorfahre” von ihnen befindet sich hier:

// 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

Interessanterweise ist „router.js die Routing-Microlib, die von Ember.js verwendet wird.“

Nun möchte ich die Handhabung des Problems an jemanden übergeben, der, im Gegensatz zu mir, entfernt mit dem discourse-Code vertraut ist.

Bearbeiten: Habe vergessen zu erwähnen: document.title wird von [1] ein- oder mehrmals nach (beiden) Änderungen [2] und der Änderung der URL durch die history-API geändert.

1 „Gefällt mir“

(Als neuer Benutzer kann ich nicht mehr als 2 Links pro Beitrag einfügen :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 „Gefällt mir“