Skip to content

Instantly share code, notes, and snippets.

@pascalchevrel
Last active July 17, 2017 10:32
Show Gist options
  • Save pascalchevrel/42c9925d744044bcc73f74bbc3249d9d to your computer and use it in GitHub Desktop.
Save pascalchevrel/42c9925d744044bcc73f74bbc3249d9d to your computer and use it in GitHub Desktop.
We are happy to announce that the Storage API feature is ready for testing in Firefox Nightly Desktop!
Storage API
The Storage API allows Web sites to find out how much space users can use (quota), how much they are already using (usage) and can also tell Firefox to store this data persistently and per origin. This feature is available only in secure contexts (HTTPS). You can also use Storage APIs via Web Workers.
There are plenty of APIs that can be used for storage, e.g., localStorage, IndexedDB. The data stored for a Web site managed by Storage API — which is defined by the Storage Standard specification — includes:
IndexedDB databases
Cache API data
Service Worker registrations
Web Storage API data
History state information saved using pushState()
Notification data
Storage limits
The maximum browser storage space is dynamic — it is based on your hard drive size when Firefox is launching. The global limit is calculated as 50% of free disk space. There's also another limit called group limit — basically this is defined as 20% of the global limit, to prevent individual sites from using exorbitant amounts of storage where there is a free space, the group limit is set to 2GB (maximum). Each origin is part of a group (group of origins).
Site Storage
Basically, each origin has an associated site storage unit. Site storage consists of zero or more site storage units. A site storage unit contains a single box. A box has a mode which is either "best-effort" or "persistent".
Traditionally, when users run out of storage space on their device, data stored with these APIs gets lost without the user being able to intervene, because modern browsers automatically manage storage space, it stores data until quota is reached and do housekeeping work automatically, it's called "best-effort" mode.
But this doesn't fit web games, or music streaming sites which might have offline storage use cases for commute-friendly purpose, since storage space will be evicted when available storage space is low, it will be an awful experience to re-download data again. And web games or music sites may need more space, "best-effort" mode is also bound by group limit, upper bound is just 2GB.
With Storage API, if the site has "persistent-storage" permission, it can call navigator.storage.persist(), let user decide to keep site data manually, and that is "persistent" mode.
if (navigator.storage && navigator.storage.persist) {
navigator.storage.persist().then(persisted => {
if (persisted)
console.log(“Persistent mode. Quota is bound by global limit (50% of disk space).”);
else
console.log(“Best-effort mode. Storage may be evicted under storage pressure.");
});
}
Site Storage Units
Each example is independent here.
If a user allows the site to store persistently, the user can store more data into disk, and the site storage quota for origin is not limited by group limit but global limit.
Site Storage Unit of Origin A consists three different types of storage, IndexedDB Databases, Local Storage, Cache API Data; Site Storage Unit of Origin B consists Cache API Data only. Site Storage Unit of Origin A and Bs' quota is limited to global limit.
Site Storage Unit of Origin C is full, it is reached to quota (global limit) and can't store any data without removing existed site storage data. UA will start to evict "best-effort" site storage units under a least recently used (LRU policy), if all best-effort site storage units are freed but still not enough, the user agent will send storage pressure notification to clear storage explicitly. See below thex storage pressure notification screenshot. Firefox may notify users when data usage is more than 90% of global limit to clear storage.
Site Storage Unit of Origin D is also full, the box mode is "best-effort", so quota is storage limit per origin (Firefox 56 is still bound by group limit), and best-effort mode is smaller than persistent storage. User agent will try to retain the data contained in the box for as long as it can, but will not warn users if storage space runs low and it becomes necessary to clear the box to relieve the storage pressure.
Indicate user to clear persistent storage
Persistent Storage Permission
Preferences - Site Data
If user "persist" the site, that site data of that origin won't be evicted until the user manually delete them in Preferences. With the new 'Site Data Manager', the user now can manage site data easily and delete persistent site data manually in the same place. Although cookies are not part of Site Storage, Site Storage should be cleared along with cookies to prevent user tracking or data inconsistency.
Storage API is now available for testing in Firefox Nightly 56.
What's currently supported
navigator.storage.estimate()
navigator.storage.persist()
navigator.storage.persisted()
new Site Data Manager in Preferences
IndexedDB, asm.js caching, Cache API data are managed by Storage API
Storage API V1.5
Local Storage/History state information/Notification data are managed by Storage API
Storage API V2
Multiple Boxes
Try it Out
To use the new Site Data Manager, open "Privacy Preferences" (you can type about:preferences#privacy in the address bar). Click the "Settings…" button besides "Site Data".
Take a look at the Storage api wiki page for much more information and to get involved.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment