Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Arbeiten mit documentId

Eine documentId ist eine UUID-Zeichenfolge, die ein einzigartiges Dokument identifiziert, das in einem Tab oder Frame geladen ist. Dieser Leitfaden erklärt, was documentId ist, warum es nützlich ist und wie es in den WebExtension-APIs verwendet wird.

Tabs, Frames und Dokumente

Ein Browser-Tab, identifiziert durch eine tabId, ist der oberste Container für Webinhalte. Innerhalb eines Tabs können Inhalte in mehrere Frames strukturiert werden: der Hauptframe (äußerster), der eine frameId von 0 hat, und alle verschachtelten <iframe>-Elemente, die jeweils eine frameId haben. Da die oberste frameId 0 ist, kann frameId nicht verwendet werden, um alle Frames über alle Tabs hinweg eindeutig zu identifizieren.

Jeder Frame enthält ein Dokument, die HTML-Seite, die unter einer URL geladen wird. Die Beziehung zwischen diesen drei Konzepten ist:

  • Ein Tab enthält ein oder mehrere Frames.
  • Ein Frame enthält ein Dokument.
  • Wenn ein Frame zu einer neuen URL navigiert, wird sein Dokument ersetzt, aber der gleiche Frame und somit die gleiche frameId bleibt bestehen.

Das bedeutet, dass die Kombination aus tabId und frameId einen Frame (einen stabilen Browsing-Kontext) identifiziert, aber nicht das darin geladene Dokument.

Dokumente und Frames sind auch in Nicht-Tab-Kontexten vorhanden, einschließlich, aber nicht beschränkt auf:

Operationen mit Tab- und Frame-IDs

Viele WebExtension-APIs verwenden tabId und frameId, um zu identifizieren, wo eine Operation ausgeführt werden soll:

Da frameId den Frame anstelle seines Inhalts identifiziert, besteht ein potenzielles Race-Condition-Risiko. Nachdem Ihre Erweiterung die tabId und frameId erhalten hat, kann sich das geladene Dokument ändern, sodass die nachfolgende Operation der Erweiterung nicht mehr das beabsichtigte Dokument anvisiert. documentId wurde eingeführt, um dieses Problem zu lösen.

Was ist eine documentId?

Eine documentId wird jedem Dokument zugewiesen, wenn es geladen wird, und bleibt über die gesamte Lebensdauer des Dokuments konstant. Wenn ein Frame zu einer neuen URL navigiert, behält er seine frameId, erhält aber eine neue documentId. Dies unterscheidet documentId von frameId: Eine frameId identifiziert den Browsing-Kontext (das Frame-Element selbst), während eine documentId das geladene Dokument innerhalb dieses Kontexts identifiziert.

Die documentId behandelt korrekt Sonderfälle, die frameId nicht unterscheiden kann:

  • Navigationen: Jeder neue Dokumenten-Ladevorgang, einschließlich Cross-Origin-Navigationen, erhält eine neue documentId, obwohl die frameId unverändert bleibt.
  • Reloads: Ein Neuladen der Seite erzeugt eine neue documentId, was auf ein frisches Dokument hinweist.
  • history.pushState() und Fragment-Updates: Diese erzeugen kein neues Dokument, sodass die documentId unverändert bleibt.

Da sich die ID bei jedem Dokumenten-Ladevorgang ändert, bleibt die von Ihrer Erweiterung für ein Dokument erhaltene ID nur für dieses Dokument gültig. Wenn der Frame navigiert ist, passt die documentId nicht mehr. Wenn Ihre Erweiterung ein Skript injiziert oder eine Nachricht mit der dokumentierten ID nach der Navigation sendet, schlägt die Operation fehl, anstatt stillschweigend das falsche Dokument zu adressieren.

Wenn ein Dokument aus dem Vorwärts-/Rückwärtscache (bfcache) wiederhergestellt wird, wird auch seine ursprüngliche documentId wiederhergestellt.

Wie erhält man eine documentId?

Es gibt mehrere Möglichkeiten, eine documentId zu erhalten:

Verwendung von documentId zur Zieladresse von Dokumenten

Wenn Sie eine documentId haben, können Sie diese verwenden, um dieses Dokument anzusteuern:

APIs, die documentId unterstützen

Diese APIs unterstützen documentId.

Abrufen einer documentId

documentId in Rückgabewerten und Ereignisdetails

documentId für Zielanwendungen

Zukünftige Entwicklungen

Die WebExtensions Community Group (WECG) diskutiert die Möglichkeit, die Anforderung zu lockern, tabId zusammen mit documentId beim Ansteuern von Dokumenten bereitzustellen. Siehe WECG issue #91 für die Diskussion.