Description
Utilisez l'API chrome.storage
pour stocker, récupérer et suivre les modifications apportées aux données utilisateur.
Autorisations
storage
Pour utiliser l'API Storage, déclarez l'autorisation "storage"
dans l'extension
fichier manifeste. Exemple :
{
"name": "My extension",
...
"permissions": [
"storage"
],
...
}
Concepts et utilisation
L'API Storage offre un moyen spécifique à l'extension de conserver les données utilisateur et l'état. Ce service est semblable aux API de stockage de la plate-forme Web (IndexedDB et Storage), mais il a été conçu pour répondre aux besoins de stockage des extensions. Voici quelques-unes des principales fonctionnalités:
- Tous les contextes d'extension, y compris le service worker d'extension et les scripts de contenu, ont accès à l'API Storage.
- Les valeurs sérialisables JSON sont stockées en tant que propriétés d'objet.
- L'API Storage est asynchrone avec les opérations de lecture et d'écriture groupées.
- Même si l'utilisateur vide le cache et vide l'historique de navigation, les données sont conservées.
- Les paramètres stockés sont conservés même lorsque vous utilisez le mode navigation privée.
- Inclut un espace de stockage géré exclusif en lecture seule pour les règles d'entreprise.
Les extensions peuvent-elles utiliser des API de stockage Web ?
Bien que les extensions puissent utiliser l'interface Storage
(accessible depuis window.localStorage
) dans certains contextes (pop-up et autres pages HTML), nous vous déconseillons de l'utiliser pour les raisons suivantes:
- Les service workers d'extensions ne peuvent pas utiliser l'API Web Storage.
- Les scripts de contenu partagent l'espace de stockage avec la page hôte.
- Les données enregistrées à l'aide de l'API Web Storage sont perdues lorsque l'utilisateur efface son historique de navigation.
Pour transférer des données d'un service worker depuis des API de stockage Web vers des API de stockage d'extensions:
- Préparez une page HTML de document hors écran et un fichier de script. Le fichier de script doit contenir une routine de conversion et un gestionnaire
onMessage
. - Dans le service worker d'extension, recherchez vos données dans
chrome.storage
. - Si vos données sont introuvables, appelez
createDocument()
. - Une fois la promesse renvoyée résolue, appelez
sendMessage()
pour lancer la routine de conversion. - Dans le gestionnaire
onMessage
du document hors écran, appelez la routine de conversion.
Il existe également des nuances quant au fonctionnement des API de stockage Web dans les extensions. Pour en savoir plus, consultez le Stockage et cookies
Zones de stockage
L'API Storage comprend les zones de stockage suivantes:
storage.local
- Les données sont stockées localement et effacées lorsque l'extension est supprimée. La limite de stockage est de 10 Mo (5 Mo dans Chrome 113 et versions antérieures), mais vous pouvez l'augmenter en demandant l'autorisation
"unlimitedStorage"
. Nous vous recommandons d'utiliserstorage.local
pour stocker de plus grandes quantités de données. storage.managed
- L'espace de stockage géré est un espace de stockage en lecture seule pour les extensions installées sous forme de règles. Il est géré par les administrateurs système à l'aide d'un schéma défini par le développeur et de règles d'entreprise. Les règles sont semblables aux options, mais sont configurées par un administrateur système et non par l'utilisateur. L'extension peut donc être préconfigurée pour tous les utilisateurs d'une organisation. Pour en savoir plus sur les règles, consultez la documentation pour les administrateurs. Pour en savoir plus sur la zone de stockage
managed
, consultez Fichier manifeste pour les zones de stockage. storage.session
- Stocke les données en mémoire pendant toute la durée d'une session de navigateur. Par défaut, il n'est pas exposé aux scripts de contenu, mais vous pouvez modifier ce comportement en définissant
chrome.storage.session.setAccessLevel()
. La limite de stockage est de 10 Mo (1 Mo dans Chrome 111 et versions antérieures). L'interfacestorage.session
est l'une des nombreuses que nous recommandons pour les service workers. storage.sync
- Si la synchronisation est activée, les données sont synchronisées avec le navigateur Chrome auquel l'utilisateur est connecté. Si cette règle est désactivée, elle se comporte comme
storage.local
. Chrome stocke les données localement lorsque le navigateur est hors connexion et reprend la synchronisation lorsqu'il est de nouveau en ligne. La limite de quota est d'environ 100 Ko ou 8 Ko par élément. Nous vous recommandons d'utiliserstorage.sync
pour conserver les paramètres utilisateur sur les navigateurs synchronisés. Si vous travaillez avec des données utilisateur sensibles, utilisez plutôtstorage.session
.
Limites de stockage et de limitation
L'API Storage présente les limites d'utilisation suivantes:
- Le stockage des données s'accompagne souvent de coûts de performances et l'API inclut des quotas de stockage. Nous vous recommandons de faire attention aux données que vous stockez afin de ne pas perdre la possibilité de les stocker.
- Le stockage peut prendre un certain temps. Veillez à structurer votre code de façon à tenir compte de ce délai.
Pour en savoir plus sur les limites de l'espace de stockage et ce qui se passe en cas de dépassement, consultez les informations sur les quotas pour sync
, local
et session
.
Cas d'utilisation
Les sections suivantes présentent des cas d'utilisation courants de l'API Storage.
Réponse synchrone aux mises à jour de l'espace de stockage
Pour suivre les modifications apportées à l'espace de stockage, ajoutez un écouteur à son événement onChanged
. Lorsqu'un changement est effectué dans l'espace de stockage, cet événement se déclenche. L'exemple de code écoute ces modifications:
background.js:
chrome.storage.onChanged.addListener((changes, namespace) => {
for (let [key, { oldValue, newValue }] of Object.entries(changes)) {
console.log(
`Storage key "${key}" in namespace "${namespace}" changed.`,
`Old value was "${oldValue}", new value is "${newValue}".`
);
}
});
Nous pouvons pousser
cette idée encore plus loin. Dans cet exemple, la page d'options
permet à l'utilisateur d'activer/de désactiver le "mode débogage" (implémentation non illustrée ici). La page d'options enregistre immédiatement les nouveaux paramètres dans storage.sync
, et le service worker utilise storage.onChanged
pour appliquer le paramètre dès que possible.
options.html:
<!-- type="module" allows you to use top level await -->
<script defer src="options.js" type="module"></script>
<form id="optionsForm">
<label for="debug">
<input type="checkbox" name="debug" id="debug">
Enable debug mode
</label>
</form>
options.js:
// In-page cache of the user's options
const options = {};
const optionsForm = document.getElementById("optionsForm");
// Immediately persist options changes
optionsForm.debug.addEventListener("change", (event) => {
options.debug = event.target.checked;
chrome.storage.sync.set({ options });
});
// Initialize the form with the user's option settings
const data = await chrome.storage.sync.get("options");
Object.assign(options, data.options);
optionsForm.debug.checked = Boolean(options.debug);
background.js:
function setDebugMode() { /* ... */ }
// Watch for changes to the user's options & apply them
chrome.storage.onChanged.addListener((changes, area) => {
if (area === 'sync' && changes.options?.newValue) {
const debugMode = Boolean(changes.options.newValue.debug);
console.log('enable debug mode?', debugMode);
setDebugMode(debugMode);
}
});
Préchargement asynchrone à partir du stockage
Comme les service workers ne s'exécutent pas tout le temps, les extensions Manifest V3 doivent parfois
de charger les données de manière asynchrone
à partir du stockage avant d'exécuter leurs gestionnaires d'événements. Pour ce faire,
L'extrait de code suivant utilise un gestionnaire d'événements asynchrones action.onClicked
qui attend l'événement storageCache
.
global à remplir avant d'exécuter sa logique.
background.js:
// Where we will expose all the data we retrieve from storage.sync.
const storageCache = { count: 0 };
// Asynchronously retrieve data from storage.sync, then cache it.
const initStorageCache = chrome.storage.sync.get().then((items) => {
// Copy the data retrieved from storage into storageCache.
Object.assign(storageCache, items);
});
chrome.action.onClicked.addListener(async (tab) => {
try {
await initStorageCache;
} catch (e) {
// Handle error that occurred during storage initialization.
}
// Normal action handler logic.
storageCache.count++;
storageCache.lastTabId = tab.id;
chrome.storage.sync.set(storageCache);
});
Exemples
Les exemples suivants illustrent les paramètres local
, sync
et
session
d'espaces de stockage:
Local
chrome.storage.local.set({ key: value }).then(() => {
console.log("Value is set");
});
chrome.storage.local.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
Synchroniser
chrome.storage.sync.set({ key: value }).then(() => {
console.log("Value is set");
});
chrome.storage.sync.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
Session
chrome.storage.session.set({ key: value }).then(() => {
console.log("Value was set");
});
chrome.storage.session.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
Pour voir d'autres démonstrations de l'API Storage, explorez l'un des exemples suivants:
Types
AccessLevel
Niveau d'accès à l'espace de stockage.
Énumération
"trusted_CONTEXTS"
Spécifie les contextes provenant de l'extension elle-même.
"TRUSTED_AND_UNTRUSTED_CONTEXTS"
Spécifie des contextes provenant de l'extérieur de l'extension.
StorageArea
Propriétés
-
onChanged
Événement<functionvoid>
Chrome 73 et versions ultérieuresDéclenché lorsqu'un ou plusieurs éléments changent.
La fonction
onChanged.addListener
se présente comme suit:(callback: function) => {...}
-
rappel
fonction
Le paramètre
callback
se présente comme suit:(changes: object) => void
-
modifications
objet
-
-
-
effacer
vide
<ph type="x-smartling-placeholder"></ph> PromesseSupprime tous les éléments de l'espace de stockage.
La fonction
clear
se présente comme suit:(callback?: function) => {...}
-
rappel
function facultatif
Le paramètre
callback
se présente comme suit:() => void
-
retours
Promesse<void>
Chrome (version 88 ou ultérieure)Les promesses sont prises en charge dans Manifest V3 et versions ultérieures, mais les rappels sont fournis pour rétrocompatibilité. Vous ne pouvez pas utiliser les deux sur le même appel de fonction. La la promesse est résolue avec le même type que celui transmis au rappel.
-
-
get
vide
<ph type="x-smartling-placeholder"></ph> PromesseRécupère un ou plusieurs éléments de l'espace de stockage.
La fonction
get
se présente comme suit:(keys?: string | string[] | object, callback?: function) => {...}
-
clés
string | string[] | objet facultatif
Une clé unique à obtenir, une liste de clés à obtenir ou un dictionnaire spécifiant les valeurs par défaut (voir la description de l'objet). Une liste ou un objet vide renvoie un objet de résultat vide. Transmettez
null
pour obtenir l'intégralité du contenu de l'espace de stockage. -
rappel
function facultatif
Le paramètre
callback
se présente comme suit:(items: object) => void
-
articles
objet
Objet avec éléments dans leurs mappages clé-valeur.
-
-
retours
Promise<object>
Chrome (version 88 ou ultérieure)Les promesses sont prises en charge dans Manifest V3 et versions ultérieures, mais les rappels sont fournis pour rétrocompatibilité. Vous ne pouvez pas utiliser les deux sur le même appel de fonction. La la promesse est résolue avec le même type que celui transmis au rappel.
-
-
getBytesInUse
vide
<ph type="x-smartling-placeholder"></ph> PromesseRécupère la quantité d'espace (en octets) utilisée par un ou plusieurs éléments.
La fonction
getBytesInUse
se présente comme suit:(keys?: string | string[], callback?: function) => {...}
-
clés
string | string[] facultatif
Une seule clé ou liste de clés dont vous souhaitez connaître l'utilisation totale. Une liste vide renvoie 0. Transmettez
null
pour obtenir l'utilisation totale de tout l'espace de stockage. -
rappel
function facultatif
Le paramètre
callback
se présente comme suit:(bytesInUse: number) => void
-
bytesInUse
Nombre
Quantité d'espace de stockage utilisée (en octets).
-
-
retours
Promise<number>
Chrome (version 88 ou ultérieure)Les promesses sont prises en charge dans Manifest V3 et versions ultérieures, mais les rappels sont fournis pour rétrocompatibilité. Vous ne pouvez pas utiliser les deux sur le même appel de fonction. La la promesse est résolue avec le même type que celui transmis au rappel.
-
-
getKeys
vide
<ph type="x-smartling-placeholder"></ph> Promesse En attenteRécupère toutes les clés de l'espace de stockage.
La fonction
getKeys
se présente comme suit:(callback?: function) => {...}
-
rappel
function facultatif
Le paramètre
callback
se présente comme suit:(keys: string[]) => void
-
clés
chaîne[]
Tableau avec des clés lues dans l'espace de stockage.
-
-
retours
Promise<string[]>
Les promesses sont prises en charge dans Manifest V3 et versions ultérieures, mais les rappels sont fournis pour rétrocompatibilité. Vous ne pouvez pas utiliser les deux sur le même appel de fonction. La la promesse est résolue avec le même type que celui transmis au rappel.
-
-
supprimer
vide
<ph type="x-smartling-placeholder"></ph> PromesseSupprime un ou plusieurs éléments de l'espace de stockage.
La fonction
remove
se présente comme suit:(keys: string | string[], callback?: function) => {...}
-
clés
string | chaîne[]
Clé unique ou liste de clés pour les éléments à supprimer.
-
rappel
function facultatif
Le paramètre
callback
se présente comme suit:() => void
-
retours
Promesse<void>
Chrome (version 88 ou ultérieure)Les promesses sont prises en charge dans Manifest V3 et versions ultérieures, mais les rappels sont fournis pour rétrocompatibilité. Vous ne pouvez pas utiliser les deux sur le même appel de fonction. La la promesse est résolue avec le même type que celui transmis au rappel.
-
-
set
vide
<ph type="x-smartling-placeholder"></ph> PromesseDéfinit plusieurs éléments.
La fonction
set
se présente comme suit:(items: object, callback?: function) => {...}
-
articles
objet
Objet qui donne à chaque paire clé/valeur pour mettre à jour l'espace de stockage. Les autres paires clé/valeur présentes dans le stockage ne seront pas affectées.
Les valeurs primitives telles que les nombres sont sérialisées comme prévu. Les valeurs avec
typeof
"object"
et"function"
sont généralement sérialisées en{}
, à l'exception deArray
(sérialisation comme prévu),Date
etRegex
(sérialisation à l'aide de leur représentationString
). -
rappel
function facultatif
Le paramètre
callback
se présente comme suit:() => void
-
retours
Promesse<void>
Chrome (version 88 ou ultérieure)Les promesses sont prises en charge dans Manifest V3 et versions ultérieures, mais les rappels sont fournis pour rétrocompatibilité. Vous ne pouvez pas utiliser les deux sur le même appel de fonction. La la promesse est résolue avec le même type que celui transmis au rappel.
-
-
setAccessLevel
vide
<ph type="x-smartling-placeholder"></ph> Promesse Chrome 102 ou version ultérieureDéfinit le niveau d'accès souhaité pour la zone de stockage. Par défaut, seuls les contextes de confiance sont sélectionnés.
La fonction
setAccessLevel
se présente comme suit:(accessOptions: object, callback?: function) => {...}
-
accessOptions
objet
-
accessLevel
Niveau d'accès à la zone de stockage.
-
-
rappel
function facultatif
Le paramètre
callback
se présente comme suit:() => void
-
retours
Promesse<void>
Les promesses sont prises en charge dans Manifest V3 et versions ultérieures, mais les rappels sont fournis pour rétrocompatibilité. Vous ne pouvez pas utiliser les deux sur le même appel de fonction. La la promesse est résolue avec le même type que celui transmis au rappel.
-
StorageChange
Propriétés
-
newValue
Tout facultatif
Nouvelle valeur de l'élément, le cas échéant.
-
oldValue
Tout facultatif
Ancienne valeur de l'article, le cas échéant.
Propriétés
local
Les éléments de la zone de stockage local
se trouvent localement sur chaque machine.
Type
StorageArea & objet
Propriétés
-
QUOTA_BYTES
10485760
Quantité maximale (en octets) de données pouvant être stockée dans le stockage local, mesurée par la concaténation JSON de chaque valeur plus la longueur de chaque clé. Cette valeur sera ignorée si l'extension dispose de l'autorisation
unlimitedStorage
. Les mises à jour qui entraîneraient le dépassement de cette limite échouent immédiatement et définissentruntime.lastError
lorsque vous utilisez un rappel ou une promesse refusée si vous utilisez async/await.
managed
Les éléments de l'espace de stockage managed
sont définis par une règle d'entreprise configurée par l'administrateur du domaine et sont en lecture seule pour l'extension. toute tentative de modification de cet espace de noms génère une erreur. Pour en savoir plus sur la configuration d'une règle, consultez Fichier manifeste pour les zones de stockage.
Type
session
Les éléments de la zone de stockage session
sont stockés en mémoire et ne sont pas conservés sur le disque.
Type
StorageArea & objet
Propriétés
-
QUOTA_BYTES
10485760
Quantité maximale (en octets) de données pouvant être stockée en mémoire, mesurée en estimant l'utilisation de la mémoire allouée de manière dynamique pour chaque valeur et clé. Les mises à jour qui entraîneraient le dépassement de cette limite échouent immédiatement et définissent
runtime.lastError
en cas de rappel ou de rejet d'une promesse.
sync
Les éléments de l'espace de stockage sync
sont synchronisés à l'aide de la synchronisation Chrome.
Type
StorageArea & objet
Propriétés
-
MAX_ITEMS
512
Nombre maximal d'éléments pouvant être stockés dans l'espace de stockage synchronisé. Les mises à jour qui entraîneraient le dépassement de cette limite échoueront immédiatement et définiront
runtime.lastError
en cas de rappel ou de rejet d'une promesse. -
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
1000000
<ph type="x-smartling-placeholder"></ph> ObsolèteL'API storage.sync n'a plus de quota d'opérations d'écriture soutenues.
-
MAX_WRITE_OPERATIONS_PER_HOUR
1800
Nombre maximal d'opérations
set
,remove
ouclear
pouvant être effectuées chaque heure. Cette valeur est de 1 toutes les deux secondes, c'est-à-dire un plafond inférieur à la limite d'écritures par minute plus élevée à court terme.Les mises à jour qui entraîneraient le dépassement de cette limite échouent immédiatement et définissent
runtime.lastError
en cas de rappel ou de rejet d'une promesse. -
MAX_WRITE_OPERATIONS_PER_MINUTE
120
Nombre maximal d'opérations
set
,remove
ouclear
pouvant être effectuées chaque minute. Cela correspond à 2 par seconde, ce qui offre un débit plus élevé que les écritures par heure sur une période plus courte.Les mises à jour qui entraîneraient le dépassement de cette limite échouent immédiatement et définissent
runtime.lastError
en cas de rappel ou de rejet d'une promesse. -
QUOTA_BYTES
102400
Quantité totale maximale (en octets) de données pouvant être stockée dans l'espace de stockage synchronisé, mesurée par la concaténation JSON de chaque valeur plus la longueur de chaque clé. Les mises à jour qui entraîneraient le dépassement de cette limite échouent immédiatement et définissent
runtime.lastError
en cas de rappel ou de rejet d'une promesse. -
QUOTA_BYTES_PER_ITEM
8192
Taille maximale (en octets) de chaque élément individuel dans le stockage synchronisé, mesurée par la concaténation de sa valeur JSON plus la longueur de sa clé. Les mises à jour contenant des éléments supérieurs à cette limite échouent immédiatement et définissent
runtime.lastError
lorsque vous utilisez un rappel ou qu'une promesse est refusée.
Événements
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
Déclenché lorsqu'un ou plusieurs éléments changent.
Paramètres
-
rappel
fonction
Le paramètre
callback
se présente comme suit:(changes: object, areaName: string) => void
-
modifications
objet
-
areaName
chaîne
-