Description
Utilisez l'API chrome.storage pour stocker, récupérer et suivre les modifications apportées aux données utilisateur.
Autorisations
storagePrésentation
L'API Storage fournit un moyen spécifique aux extensions de rendre persistantes les données et l'état des utilisateurs. Elle est semblable aux API de stockage de la plate-forme Web (IndexedDB et Storage), mais a été conçue 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 et les scripts de contenu de l'extension, 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 et permet d'effectuer des opérations de lecture et d'écriture groupées.
- Même si l'utilisateur vide le cache et efface l'historique de navigation, les données persistent.
- Les paramètres stockés sont conservés même lorsque vous utilisez la navigation privée fractionnée.
- Inclut un espace de stockage géré exclusif en lecture seule pour les règles d'entreprise.
Même si les extensions peuvent utiliser l'interface [Storage][mdn-storage] (accessible depuis window.localStorage) dans certains contextes (pop-up et autres pages HTML), cela n'est pas recommandé pour les raisons suivantes :
- Le service worker de l'extension ne peut pas accéder à Storage.
- Les scripts de contenu partagent l'espace de stockage avec la page hôte.
- Les données enregistrées à l'aide de l'interface Storagesont perdues lorsque l'utilisateur efface son historique de navigation.
Pour déplacer des données des API de stockage Web vers les API de stockage d'extension à partir d'un service worker :
- Créez un document hors écran avec une routine de conversion et un gestionnaire [onMessage][on-message].
- Ajoutez une routine de conversion à un document hors écran.
- Dans le service worker de l'extension, vérifiez chrome.storagepour vos données.
- Si vos données ne sont pas trouvées, [créez][create-offscreen] un document hors écran et appelez [sendMessage()][send-message] pour démarrer la routine de conversion.
- Dans le gestionnaire onMessagedu document hors écran, appelez la routine de conversion.
Il existe également certaines nuances concernant le fonctionnement des API de stockage Web dans les extensions. Pour en savoir plus, consultez l'article [Stockage et cookies][storage-and-cookies].
Zones de stockage
L'API Storage est divisée en quatre buckets ("zones de stockage") :
- storage.local
-  Les données sont stockées localement et sont effacées lorsque l'extension est supprimée. La limite de quota est d'environ 10 Mo, mais vous pouvez l'augmenter en demandant l'autorisation "unlimitedStorage". Envisagez de l'utiliser pour stocker de plus grandes quantités de données.
- storage.sync
-  Si la synchronisation est activée, les données sont synchronisées avec tous les navigateurs Chrome auxquels l'utilisateur est connecté. Si elle 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, soit 8 Ko par élément. Envisagez de l'utiliser pour conserver les paramètres utilisateur dans les navigateurs synchronisés.
- storage.session
- Conserve les données en mémoire pendant la durée d'une session de navigateur. Par défaut, il n'est pas exposé aux scripts de contenu, mais ce comportement peut être modifié en définissant chrome.storage.session.setAccessLevel(). La limite de quota est d'environ 10 Mo. Pensez à l'utiliser pour stocker des variables globales lors des exécutions du service worker.
- storage.managed
- Les administrateurs peuvent utiliser un schéma et des règles d'entreprise pour configurer les paramètres d'une extension compatible dans un environnement géré. Cette zone de stockage est en lecture seule.
Fichier manifeste
Pour utiliser l'API Storage, déclarez l'autorisation "storage" dans le fichier manifeste de l'extension. Exemple :
{
  "name": "My extension",
  ...
  "permissions": [
    "storage"
  ],
  ...
}
Utilisation
Les exemples suivants illustrent les zones de stockage local, sync et session :
storage.local
chrome.storage.local.set({ key: value }).then(() => {
  console.log("Value is set");
});
chrome.storage.local.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});
storage.sync
chrome.storage.sync.set({ key: value }).then(() => {
  console.log("Value is set");
});
chrome.storage.sync.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});
storage.session
chrome.storage.session.set({ key: value }).then(() => {
  console.log("Value was set");
});
chrome.storage.session.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});
Pour en savoir plus sur la zone de stockage managed, consultez Manifeste pour les zones de stockage.
Limites de stockage et de limitation du débit
Ne pensez pas que l'ajout à l'API Storage consiste à mettre des éléments dans un grand camion. Imaginez que vous ajoutez des éléments à l'espace de stockage comme si vous les mettiez dans un tuyau. Il est possible que le tuyau contienne déjà de la matière, voire qu'il soit plein. Prévoyez toujours un délai entre le moment où vous ajoutez un élément au stockage et celui où il est réellement enregistré.
Pour en savoir plus sur les limites de stockage et sur ce qui se passe lorsqu'elles sont dépassées, 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 modifications apportées au stockage
Pour suivre les modifications apportées au stockage, vous pouvez ajouter un écouteur à son événement onChanged. Cet événement se déclenche lorsque quelque chose change dans le stockage. L'exemple de code écoute les modifications suivantes :
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 aller encore plus loin. Dans cet exemple, nous avons une page d'options qui permet à l'utilisateur d'activer ou de désactiver un "mode débogage" (l'implémentation n'est pas montré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 depuis le stockage
Étant donné que les service workers ne sont pas toujours en cours d'exécution, les extensions Manifest V3 doivent parfois charger de manière asynchrone les données 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 action.onClicked asynchrone qui attend que la variable globale storageCache soit renseignée 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 d'extensions
Pour découvrir d'autres démonstrations de l'API Storage, consultez les exemples suivants :
Types
AccessLevel
Niveau d'accès de 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 les contextes provenant de l'extérieur de l'extension.
StorageArea
Propriétés
- 
    onChangedEvent<functionvoidvoid> Chrome 73 et versions ultérieuresDéclenché lorsqu'un ou plusieurs éléments changent. La fonction onChanged.addListenerse présente comme suit :(callback: function) => {...} - 
    callbackfonction Le paramètre callbackse présente comme suit :(changes: object) => void - 
    modificationsobjet 
 
- 
    
 
- 
    
- 
    effacervide PromiseSupprime tous les éléments du stockage. La fonction clearse présente comme suit :(callback?: function) => {...} - 
    callbackfunction facultatif Le paramètre callbackse présente comme suit :() => void 
 - 
            RenvoiePromise<void> Chrome 95 et versions ultérieuresLes promesses ne sont compatibles qu'avec Manifest V3 et les versions ultérieures. Les autres plates-formes doivent utiliser des rappels. 
 
- 
    
- 
    getvide PromiseRécupère un ou plusieurs éléments du stockage. La fonction getse présente comme suit :(keys?: string | string[] | object, callback?: function) => {...} - 
    clésstring | string[] | object facultatif Clé unique à obtenir, liste de clés à obtenir ou dictionnaire spécifiant les valeurs par défaut (voir la description de l'objet). Une liste ou un objet vides renverront un objet de résultat vide. Transmettez nullpour obtenir l'intégralité du contenu du stockage.
- 
    callbackfunction facultatif Le paramètre callbackse présente comme suit :(items: object) => void - 
    élémentsobjet Objet avec des éléments dans leurs mappages clé-valeur. 
 
- 
    
 - 
            RenvoiePromise<object> Chrome 95 et versions ultérieuresLes promesses ne sont compatibles qu'avec Manifest V3 et les versions ultérieures. Les autres plates-formes doivent utiliser des rappels. 
 
- 
    
- 
    getBytesInUsevide PromiseObtient la quantité d'espace (en octets) utilisée par un ou plusieurs éléments. La fonction getBytesInUsese présente comme suit :(keys?: string | string[], callback?: function) => {...} - 
    clésstring | string[] facultatif Clé unique ou liste de clés pour lesquelles obtenir l'utilisation totale. Une liste vide renvoie 0. Transmettez nullpour obtenir l'utilisation totale de l'espace de stockage.
- 
    callbackfunction facultatif Le paramètre callbackse présente comme suit :(bytesInUse: number) => void - 
    bytesInUseTotal Quantité d'espace de stockage utilisé, en octets. 
 
- 
    
 - 
            RenvoiePromise<number> Chrome 95 et versions ultérieuresLes promesses ne sont compatibles qu'avec Manifest V3 et les versions ultérieures. Les autres plates-formes doivent utiliser des rappels. 
 
- 
    
- 
    getKeysvide Promesse Chrome 130 et versions ultérieuresObtient toutes les clés du stockage. La fonction getKeysse présente comme suit :(callback?: function) => {...} - 
    callbackfunction facultatif Le paramètre callbackse présente comme suit :(keys: string[]) => void - 
    cléschaîne[] Tableau contenant les clés lues à partir du stockage. 
 
- 
    
 - 
            RenvoiePromise<string[]> Les promesses ne sont compatibles qu'avec Manifest V3 et les versions ultérieures. Les autres plates-formes doivent utiliser des rappels. 
 
- 
    
- 
    supprimervide PromiseSupprime un ou plusieurs éléments du stockage. La fonction removese présente comme suit :(keys: string | string[], callback?: function) => {...} - 
    cléschaîne | chaîne[] Clé unique ou liste de clés des éléments à supprimer. 
- 
    callbackfunction facultatif Le paramètre callbackse présente comme suit :() => void 
 - 
            RenvoiePromise<void> Chrome 95 et versions ultérieuresLes promesses ne sont compatibles qu'avec Manifest V3 et les versions ultérieures. Les autres plates-formes doivent utiliser des rappels. 
 
- 
    
- 
    setvide PromiseDéfinit plusieurs éléments. La fonction setse présente comme suit :(items: object, callback?: function) => {...} - 
    élémentsobjet Objet qui fournit chaque paire clé/valeur pour mettre à jour le stockage. Les autres paires clé/valeur dans le stockage ne seront pas affectées. Les valeurs primitives telles que les nombres seront 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érialisé comme prévu),DateetRegex(sérialisés à l'aide de leur représentationString).
- 
    callbackfunction facultatif Le paramètre callbackse présente comme suit :() => void 
 - 
            RenvoiePromise<void> Chrome 95 et versions ultérieuresLes promesses ne sont compatibles qu'avec Manifest V3 et les versions ultérieures. Les autres plates-formes doivent utiliser des rappels. 
 
- 
    
- 
    setAccessLevelvide Promise Chrome 102 et versions ultérieuresDéfinit le niveau d'accès souhaité pour la zone de stockage. Par défaut, le stockage sessionest limité aux contextes approuvés (pages d'extension et service workers), tandis que le stockagemanaged,localetsyncautorise l'accès à partir de contextes approuvés et non approuvés.La fonction setAccessLevelse présente comme suit :(accessOptions: object, callback?: function) => {...} - 
    accessOptionsobjet - 
    accessLevelNiveau d'accès à l'espace de stockage. 
 
- 
    
- 
    callbackfunction facultatif Le paramètre callbackse présente comme suit :() => void 
 - 
            RenvoiePromise<void> Les promesses ne sont compatibles qu'avec Manifest V3 et les versions ultérieures. Les autres plates-formes doivent utiliser des rappels. 
 
- 
    
StorageChange
Propriétés
- 
    newValuetout facultatif Nouvelle valeur de l'élément, le cas échéant. 
- 
    oldValuetout facultatif Ancienne valeur de l'élément, le cas échéant. 
Propriétés
local
Les éléments de la zone de stockage local sont locaux à chaque machine.
Type
StorageArea et objet
Propriétés
- 
    QUOTA_BYTES10485760 
 Quantité maximale de données (en octets) pouvant être stockées dans le stockage local, mesurée par la conversion en chaîne 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.lastErrorlors de l'utilisation d'un rappel, ou une promesse refusée en cas d'utilisation d'async/await.
managed
Les éléments de la zone 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 savoir comment configurer une règle, consultez Manifeste pour les zones de stockage.
Type
sync
Les éléments de la zone de stockage sync sont synchronisés à l'aide de la synchronisation Chrome.
Type
StorageArea et objet
Propriétés
- 
    MAX_ITEMS512 
 Nombre maximal d'éléments pouvant être stockés dans le stockage synchronisé. Les mises à jour qui entraîneraient le dépassement de cette limite échoueront immédiatement et définiront runtime.lastErrorlors de l'utilisation d'un rappel ou lorsqu'une promesse est refusée.
- 
    MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE1000000 
 ObsolèteL'API storage.sync n'est plus soumise à un quota d'opérations d'écriture soutenues. 
- 
    MAX_WRITE_OPERATIONS_PER_HOUR1800 
 Nombre maximal d'opérations set,removeouclearpouvant être effectuées chaque heure. Cela correspond à une opération toutes les deux secondes, ce qui est inférieur à la limite à court terme de nombre d'écritures par minute.Les mises à jour qui entraîneraient le dépassement de cette limite échouent immédiatement et définissent runtime.lastErrorlors de l'utilisation d'un rappel ou lorsqu'une promesse est refusée.
- 
    MAX_WRITE_OPERATIONS_PER_MINUTE120 
 Nombre maximal d'opérations set,removeouclearpouvant être effectuées chaque minute. Cela représente deux écritures 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.lastErrorlors de l'utilisation d'un rappel ou lorsqu'une promesse est refusée.
- 
    QUOTA_BYTES102400 
 Quantité totale maximale (en octets) de données pouvant être stockées dans le stockage synchronisé, mesurée par la concaténation JSON de chaque valeur et de la longueur de chaque clé. Les mises à jour qui entraîneraient le dépassement de cette limite échouent immédiatement et définissent runtime.lastErrorlors de l'utilisation d'un rappel ou lorsqu'une promesse est refusée.
- 
    QUOTA_BYTES_PER_ITEM8192 
 Taille maximale (en octets) de chaque élément individuel dans le stockage synchronisé, mesurée par la chaîne JSON de sa valeur plus la longueur de sa clé. Les mises à jour contenant des éléments dépassant cette limite échoueront immédiatement et définiront runtime.lastErrorlors de l'utilisation d'un rappel ou lorsqu'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
- 
    callbackfonction Le paramètre callbackse présente comme suit :(changes: object, areaName: string) => void - 
    modificationsobjet 
- 
    areaNamechaîne 
 
-