fetchLater() Kontingente
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.
Zurückgestellte fetchLater()
API Anforderungen werden gesammelt und gesendet, sobald der Tab geschlossen wird. An diesem Punkt gibt es keine Möglichkeit für den Benutzer, sie abzubrechen. Um Situationen zu vermeiden, in denen Dokumente diese Bandbreite missbrauchen, um unbegrenzte Datenmengen über das Netzwerk zu senden, setzt die API Kontingente dafür, wie viele Daten später gesendet werden können.
Diese Kontingente können über die deferred-fetch
und deferred-fetch-minimal
Permissions Policy Direktiven verwaltet werden.
Überblick
Das Gesamtkontingent für fetchLater()
beträgt 640KiB pro Dokument. Standardmäßig ist dieses aufgeteilt in ein 512KiB-Kontingent für die oberste Ebene und ein 128KiB-geteiltes Kontingent:
- Das 512KiB-Kontingent für die oberste Ebene ist standardmäßig für alle
fetchLater()
Anfragen, die vom Hauptdokument und direkten Subframes mit diesem Ursprung gemacht werden. - Das 128KiB-geteilte Kontingent ist standardmäßig für alle
fetchLater()
Anfragen, die in cross-origin Subframes gemacht werden (z.B.<iframe>
,<object>
,<embed>
, und<frame>
Elemente).
fetchLater()
Anfragen können zu jeder URL gemacht werden und sind nicht auf den gleichen Ursprung wie das Dokument oder das Subframe beschränkt. Daher ist es wichtig, zwischen Anfragen zu unterscheiden, die im Inhalt des Hauptdokuments gemacht werden (sei es zu Erst- oder Drittanbieter-Ursprüngen) und jenen, die in Subframes gestellt werden.
Zum Beispiel: Wenn ein oberstes Dokument a.com
ein <script>
enthält, das eine fetchLater()
-Anfrage an analytics.example.com
stellt, fällt diese Anfrage unter das 512KiB-Limit für die oberste Ebene. Alternativ, wenn das Hauptdokument ein <iframe>
mit der Quelle analytics.example.com
einbettet, das eine fetchLater()
-Anfrage stellt, fällt diese Anfrage unter das 128KiB-Limit.
Kontingentgrenzen nach Berichterstellungsursprung und Subframe
Nur 64KiB des 512KiB-Kontingents für die oberste Ebene können gleichzeitig für den gleichen Berichterstellungsursprung (den Ursprung der Anforderungs-URL) genutzt werden. Dies verhindert, dass Drittanbieter-Bibliotheken vorsorglich Kontingent reservieren, bevor sie Daten zu senden haben.
Jedes cross-origin Subframe erhält standardmäßig ein 8KiB-Kontingent aus dem 128KiB-geteilten Kontingent, das zugewiesen wird, wenn das Subframe dem DOM hinzugefügt wird (ob fetchLater()
in diesem Subframe verwendet wird oder nicht). Das bedeutet, dass im Allgemeinen nur die ersten 16 cross-origin Subframes, die zu einer Seite hinzugefügt werden, fetchLater()
verwenden können, da sie das 128KiB-Kontingent verbrauchen.
Erhöhung der Subframe-Kontingente durch Teilen des Kontingents der obersten Ebene
Der Ursprung der obersten Ebene kann ausgewählten cross-origin Subframes ein erhöhtes Kontingent von 64KiB zuweisen, das aus dem größeren 512KiB-Limit der obersten Ebene stammt. Dies geschieht, indem diese Ursprünge in der deferred-fetch
Permissions Policy Direktive aufgeführt werden. Dies wird zugewiesen, wenn das Subframe dem DOM hinzugefügt wird, wodurch weniger Kontingent für das Hauptdokument und direkte Subframes mit dem gleichen Ursprung verbleibt. Mehrere Subdomains mit dem gleichen Ursprung können jeweils ein 64KiB-Kontingent erhalten.
Einschränkung des geteilten Kontingents
Der Ursprung der obersten Ebene kann auch das 128KiB-geteilte Kontingent auf benannte cross-origin Subframes beschränken, indem er diese Ursprünge in der deferred-fetch-minimal
Permissions Policy aufführt. Er kann auch das gesamte 128KiB-Standard-Subframe-Kontingent widerrufen und stattdessen das volle 640KiB-Kontingent für sich und alle benannten deferred-fetch
Cross-Origens behalten, indem er die deferred-fetch-minimal
Permissions Policy auf ()
setzt.
Quoten an Subframes von Subframes delegieren
Standardmäßig wird Subframes von Subframes kein Kontingent zugewiesen, und sie können daher fetchLater()
nicht verwenden. Subframes, denen das erhöhte 64KiB-Kontingent zugewiesen wurde, können ihr volles 64KiB-Kontingent an weitere Subframes delegieren und ihnen erlauben, fetchLater()
zu verwenden, indem sie ihre eigene deferred-fetch
Permissions Policy setzen. Sie können ihr volles Kontingent nur an weitere Subframes delegieren, nicht Teile davon, und sie können keine neuen Kontingente festlegen. Subframes, die das minimale 8KiB-Kontingent nutzen, können keine Kontingente an Subframes delegieren. Um Kontingente zu erhalten, müssen Sub-Subframes sowohl in den deferred-fetch
Permissions-Policy
Direktiven der obersten Ebene als auch in jenen des Subframes enthalten sein.
Überschreitung der Kontingente
Wenn Kontingente überschritten werden, wird ein QuotaExceededError
ausgelöst, wenn die Methode fetchLater()
aufgerufen wird, um die zurückgestellte Anfrage zu initiieren.
Permissions Policy Prüfungen sind von Kontingentprüfungen nicht unterscheidbar. Der Aufruf von fetchLater()
wird einen QuotaExceededError
sowohl auslösen, wenn das Kontingent tatsächlich überschritten wurde als auch wenn das Kontingent für diesen Ursprung durch eine Permissions Policy eingeschränkt wurde.
Aufrufer von fetchLater()
sollten defensiv sein und QuotaExceededError
Fehler in fast allen Fällen abfangen, besonders wenn sie Drittanbieter-JavaScript einbetten.
Beispiele
Verwendung des minimalen Kontingents
Permissions-Policy: deferred-fetch=(self "https://b.com")
- Ein
<iframe src="https://b.com/page">
erhält 64KiB, sobald es dem Hauptdokument hinzugefügt wird, aus dem 512KiB-Limit der obersten Ebene. - Ein
<iframe src="https://c.com/page">
ist nicht aufgeführt und erhält daher 8KiB, sobald es dem Hauptdokument aus dem 128KiB-geteilten Limit hinzugefügt wird. - 15 weitere cross-origin iframes würden jeweils 8KiB erhalten, wenn sie dem Hauptdokument hinzugefügt werden (ähnlich
c.com
). - Das nächste cross-origin iframe würde kein Kontingent erhalten.
- Wenn eines der cross-origin iframes entfernt wird, werden seine zurückgestellten Fetches gesendet.
- Das nächste cross-origin iframe würde ein 8KiB-Kontingent erhalten, da wieder Kontingent verfügbar ist.
Widerruf der Einschränkung des minimalen Kontingents auf benannte Ursprünge
Permissions-Policy: deferred-fetch-minimal=("https://b.com")
<iframe src="https://b.com/page">
erhält 8KiB, sobald es dem Hauptdokument hinzugefügt wird.<iframe src="https://c.com/page">
erhält kein Kontingent, sobald es dem Hauptdokument hinzugefügt wird.- Das Hauptdokument und seine Nachkommen mit gleichem Ursprung können bis zu 512KiB nutzen.
Widerruf des minimalen Kontingents insgesamt mit Ausnahmen für die oberste Ebene
Permissions-Policy: deferred-fetch=(self "https://b.com")
Permissions-Policy: deferred-fetch-minimal=()
<iframe src="https://b.com/page">
erhält 64KiB, sobald es dem Hauptdokument hinzugefügt wird.<iframe src="https://c.com/page">
erhält kein Kontingent, sobald es dem Hauptdokument hinzugefügt wird.- Das Hauptdokument und seine Nachkommen mit gleichem Ursprung können bis zu 640KiB nutzen, aber dies wird auf 574KiB reduziert, wenn ein
b.com
Subframe erstellt wird (oder sogar weniger, wenn mehrereb.com
Subframes erstellt werden, von denen jedes ein 64KiB-Kontingent erhält).
Widerruf des minimalen Kontingents insgesamt ohne Ausnahmen
Permissions-Policy: deferred-fetch-minimal=()
- Das Hauptdokument und seine Nachkommen mit gleichem Ursprung können das volle 640KiB nutzen.
- Subframes wird kein Kontingent zugewiesen, und sie können
fetchLater()
nicht verwenden.
Subframes mit gleichem Ursprung teilen das Kontingent mit der obersten Ebene und können an Subframes delegieren
Angenommen: Ein Hauptdokument auf a.com
, das ein Subframe von a.com
einbettet, welches ein Subframe von b.com
einbettet, und keine expliziten Permissions Policies.
- Das Hauptdokument von
a.com
hat das Standardkontingent von 512KiB. <iframe src="https://a.com/embed">
teilt das Kontingent von 512KiB, sobald es dem Hauptdokument hinzugefügt wird.<iframe src="https://b.com/embed">
erhält ein 8KiB-Kontingent, sobald es dem Hauptdokument hinzugefügt wird.
Subframes mit gleichem Ursprung können das Kontingent nicht mit der obersten Ebene teilen, wenn sie durch ein cross-origin Subframe getrennt sind
Angenommen: Ein Hauptdokument auf a.com
, das ein <iframe src="https://b.com/">
einbettet, welches ein Subframe von <iframe src="https://a.com/embed">
einbettet, und keine expliziten Permissions Policies.
- Das Hauptdokument von
a.com
hat das Standardkontingent von 512KiB. <iframe src="https://b.com/">
teilt das 8KiB-Kontingent.<iframe src="https://a.com/embed">
erhält kein Kontingent; obwohl es den gleichen Ursprung wie der Hauptursprung hat, ist es durch ein Cross-Origin getrennt.
Sekundäre Subframes von Subframes erhalten standardmäßig kein Kontingent
Angenommen: Ein Hauptdokument auf a.com
, das ein <iframe src="https://b.com/">
einbettet, welches ein <iframe src="https://c.com/">
einbettet, und keine expliziten Permissions Policies.
- Das Hauptdokument von
a.com
hat das Standardkontingent von 512KiB. <iframe src="https://b.com/">
erhält 8KiB des Standard-geteilten Kontingents.<iframe src="https://c.com/">
erhält kein Kontingent.
Gewährung des vollen Kontingents an ein weiteres Subframe
Angenommen: Ein Hauptdokument auf a.com
, das ein <iframe src="https://b.com/">
einbettet, welches ein <iframe src="https://c.com/">
einbettet.
Angenommen, a.com
hat die folgende Permissions Policy:
Permissions-Policy: deferred-fetch=("https://c.com" "https://c.com")
Und angenommen, b.com
hat die folgende Permissions Policy:
Permissions-Policy: deferred-fetch=("https://c.com")
- Der Hauptframe von
a.com
hat das Standardkontingent von 512KiB. <iframe src="https://b.com/">
erhält 64KiB des Standardkontingents.<iframe src="https://b.com/">
delegiert sein volles Kontingent von 8KiB anc.com
.b.com
kannfetchLater()
nicht verwenden.<iframe src="https://c.com/">
erhält 8KiB Kontingent.
Weiterleitungen übertragen kein Kontingent
Angenommen: Ein Hauptdokument auf a.com
, das ein <iframe src="https://b.com/">
einbettet, welches auf c.com
umleitet, und keine expliziten top-level Permission Policies.
- Der Hauptframe von
a.com
hat das Standardkontingent von 512KiB. <iframe src="https://b.com/">
erhält 8KiB des Standard-geteilten Kontingents.- Die 8KiB werden nicht auf
c.com
übertragen, wenn<iframe src="https://b.com/">
dorthin umleitet, aber die 8KiB werden nicht freigegeben.
Sandboxed-Same-Origin-Frames sind effektiv separate Ursprünge
Als Beispiel, wenn das folgende <iframe>
auf https://www.example.com
eingebettet ist:
<iframe src="https://www.example.com/iframe" sandbox="allow-scripts"></iframe>
Dieses würde nicht als "gleicher Ursprung" betrachtet werden, obwohl es auf dem gleichen Ursprung wie das Hauptdokument gehostet wird, da das <iframe>
sich in einer sandboxed Umgebung befindet. Daher sollte es standardmäßig ein 8KiB-Kontingent aus dem gesamten 128KiB-geteilten Kontingent erhalten.
Deaktivierung von fetchLater()
aus iframes
Sie können das <iframe>
allow
Attribut verwenden, um zu verhindern, dass das fetchLater()
Kontingent dem <iframe>
zugewiesen wird:
<iframe
src="https://www.example.com/iframe"
allow="deferred-fetch;deferred-fetch-minimal;"></iframe>
Die allow="deferred-fetch"
Direktive ist erforderlich, um zu verhindern, dass iframes mit gleichem Ursprung das 512KiB-Kontingent aufbrauchen, und die allow="deferred-fetch-minimal"
Direktive ist erforderlich, um zu verhindern, dass Cross-Origin iframes das 128KiB-Kontingent aufbrauchen. Die Aufnahme beider Direktiven verhindert, dass beide Kontingente genutzt werden, unabhängig vom Wert von src
.
Beispiele, die einen QuotaExceededError
werfen
// Maximum of 64KiB per origin
fetchLater(a_72_kb_url);
// Maximum of 64KiB per origin including headers
fetchLater("https://origin.example.com", { headers: headers_exceeding_64kb });
// Maximum of 64KiB per origin including body and headers
fetchLater(a_32_kib_url, { headers: headers_exceeding_32kib });
// Maximum of 64KiB per origin including body
fetchLater("https://origin.example.com", {
method: "POST",
body: body_exceeding_64_kib,
});
// Maximum of 64KiB per origin including body and automatically added headers
fetchLater(a_62_kib_url /* with a 3kb referrer */);
Beispiele, die schließlich einen QuotaExceededError
werfen
In der folgenden Sequenz, enthalten im Hauptdokument, würden die ersten zwei Anfragen erfolgreich sein, aber die dritte würde einen Fehler verursachen. Das liegt daran, dass, obwohl das Gesamt-Kontingent von 640KiB nicht überschritten wurde, die dritte Anfrage das Berichterstellungs-Ursprungs-Kontingent für https://a.example.com
überschreitet und einen Fehler verursachen würde.
fetchLater("https://a.example.com", { method: "POST", body: a_40kb_body });
fetchLater("https://b.example.com", { method: "POST", body: a_40kb_body });
fetchLater("https://a.example.com", { method: "POST", body: a_40kb_body });
Weiterleitungen von Subframes zurück zum Hauptursprung ermöglichen die Nutzung des Hauptkontingents
Angenommen: Ein Hauptdokument bei a.com
, das <iframe src="https://b.com/">
einbettet, welches auf a.com
umleitet, und keine expliziten top-level Permission Policies:
- Der Hauptframe von
a.com
hat das Standardkontingent von 512KiB. <iframe src="https://b.com/">
erhält 8KiB des Standard-geteilten Kontingents von 128KiB.- Die 8KiB werden nicht auf
a.com
übertragen, wenn<iframe src="https://b.com/">
dorthin umleitet, aber es kann das volle top-level Kontingent erneut teilen, und das zuvor zugewiesene 8KiB-Kontingent wird freigegeben.
Spezifikationen
No specification found
No specification data found for http.headers.Permissions-Policy.deferred-fetch,http.headers.Permissions-Policy.deferred-fetch-minimal
.
Check for problems with this page or contribute a missing spec_url
to mdn/browser-compat-data. Also make sure the specification is included in w3c/browser-specs.