chrome.storage

説明

chrome.storage API を使用して、ユーザーデータの保存、取得、変更の追跡を行います。

権限

storage

ストレージ API を使用するには、拡張機能のマニフェスト"storage" 権限を宣言します。次に例を示します。

{
  "name": "My extension",
  ...
  "permissions": [
    "storage"
  ],
  ...
}

コンセプトと使用方法

Storage API は、ユーザーデータと状態を保持するための拡張機能固有の方法を提供します。ウェブ プラットフォームのストレージ API(IndexedDBStorage)に似ていますが、拡張機能のストレージのニーズを満たすように設計されています。主な機能は次のとおりです。

  • 拡張機能のサービス ワーカーやコンテンツ スクリプトを含むすべての拡張機能コンテキストは、Storage API にアクセスできます。
  • JSON シリアル化可能な値はオブジェクト プロパティとして保存されます。
  • Storage API は非同期で、一括読み取りと書き込みのオペレーションを行います。
  • ユーザーがキャッシュと閲覧履歴を削除しても、データは保持されます。
  • 保存された設定は、分割シークレット モードを使用している場合でも保持されます。
  • エンタープライズ ポリシー専用の読み取り専用管理ストレージ領域が含まれます。

拡張機能でウェブ ストレージ API を使用できますか?

拡張機能は、一部のコンテキスト(ポップアップやその他の HTML ページ)で Storage インターフェース(window.localStorage からアクセス可能)を使用できますが、次の理由からおすすめしません。

  • 拡張機能 Service Worker は Web Storage API を使用できません。
  • コンテンツ スクリプトはホストページとストレージを共有します。
  • Web Storage API を使用して保存されたデータは、ユーザーが閲覧履歴を削除すると失われます。

Service Worker からウェブ ストレージ API のデータを拡張機能ストレージ API に移動するには:

  1. 画面外ドキュメントの HTML ページとスクリプト ファイルを準備します。スクリプト ファイルには、変換ルーチンと onMessage ハンドラが含まれている必要があります。
  2. 拡張機能のサービス ワーカーで、データの chrome.storage を確認します。
  3. データが見つからない場合は、createDocument() にお問い合わせ�����さ������
  4. ���された Promise が解決されたら、sendMessage() を呼び出して変換ルーティンを開始します。
  5. 画面外ドキュメントの onMessage ハンドラ内で、変換ルーチンを呼び出します。

拡張機能でのウェブ ストレージ API の動作には、いくつかのニュアンスもあります。詳しくは、ストレージと Cookie の記事をご覧ください。

ストレージ領域

Storage API は、次のストレージ領域に分かれています。

storage.local
データはローカルに保存され、拡張機能が削除されるとクリアされます。ストレージの上限は 10 MB(Chrome 113 以前では 5 MB)ですが、"unlimitedStorage" 権限をリクエストすることで増やすことができます。大量のデータを保存するには、storage.local を使用することをおすすめします。デフォルトでは、コンテンツ スクリプトに公開されますが、chrome.storage.local.setAccessLevel() を呼び出すことでこの動作を変更できます。
storage.managed
管理対象ストレージは、ポリシーがインストールされた拡張機能用の読み取り専用ストレージであり、デベロッパー定義のスキーマとエンタープライズ ポリシーを使用してシステム管理者が管理します。ポリシーはオプションに似ていますが、ユーザーではなくシステム管理者によって構成されるため、組織のすべてのユーザー向けに拡張機能を事前構成できます。デフォルトでは、storage.managed はコンテンツ スクリプトに公開されますが、chrome.storage.managed.setAccessLevel() を呼び出すことでこの動作を変更できます。ポリシーについては、管理者向けドキュメントをご覧ください。managed ストレージ領域の詳細については、ストレージ領域のマニフェストをご覧ください。
storage.session
拡張機能の読み込み中にデータをメモリに保持します。拡張機能を無効にする、再読み込みする、更新する、ブラウザを再起動すると、ストレージはクリアされます。デフォルトではコンテンツ スクリプトに公開されませんが、chrome.storage.session.setAccessLevel() を呼び出すことでこの動作を変更できます。保存容量の上限は 10 MB です(Chrome 111 以前では 1 MB)。storage.session インターフェースは、サービス ワーカーにおすすめのインターフェースの 1 つです。
storage.sync
同期が有効になっている場合、データはユーザーがログインしているすべての Chrome ブラウザに���期されます。無効になっている場合、storage.local と同様に動作します。ブラウザがオフラインのときは、Chrome はデータをローカルに保存し、オンラインに戻ると同期を再開します。割り当ての上限は、約 100 KB、アイテムあたり 8 KB です。同期されたブラウザ間でユーザー設定を保持するには、storage.sync を使用することをおすすめします。ユーザーの機密情報を扱う場合は、代わりに storage.session を使用してください。デフォルトでは、storage.sync はコンテンツ スクリプトに公開されますが、chrome.storage.sync.setAccessLevel() を呼び出すことでこの動作を変更できます。

ストレージとスロットリングの上限

Storage API には次の使用量上限があります。

  • データの保存にはパフォーマンス コストが伴うことが多く、API にはストレージ割り当てが含まれています。データを保存できなくなることがないよう、保存するデータには注意することをおすすめします。
  • ストレージの完了には時間がかかることがあります。その時間を考慮してコードを構成してください。

ストレージ領域の制限と、制限を超えた場合に発生する事象の詳細については、synclocalsession の割り当て情報をご覧ください。

ユースケース

以降のセクションでは、Storage API の一般的なユースケースについて説明します。

ストレージの更新に応答する

ストレージに加えられた変更を追跡するには、その onChanged イベントにリスナーを追加します。ストレージで変更が発生すると、そのイベントがトリガーされます。サンプルコードは、次の変更をリッスンします。

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}".`
    );
  }
});

このアイデアをさらに発展させることもできます。この例では、ユーザーが「デバッグモード」を切り替えることができるオプション ページがあります(実装は示されていません)。オプション ページで新しい設定を保存すると、すぐに storage.sync に保存され、サービス ワーカーが storage.onChanged を使用してできるだけ早く設定を適用します。

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);
  }
});

ストレージからの非同期プリロード

サービス ワーカーは常に実行されているわけではないため、Manifest V3 拡張機能では、イベント ハンドラを実行する前にストレージからデータを非同期で読み込む必要がある場合があります。これを行うために、次のスニペットでは、storageCache グローバルが入力されるまで待機してからロジックを実行する非同期 action.onClicked イベント ハンドラを使用します。

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);
});

DevTools

API を使用して保存されたデータは、DevTools で表示および編集できます。詳しくは、DevTools ドキュメントの拡張機能のストレージの表示と編集をご覧ください。

次のサンプルは、localsyncsession の各ストレージ領域を示しています。

ローカル

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);
});

同期

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);
});

セッション

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);
});

Storage API の他のデモについては、次のいずれかのサンプルをご覧ください。

AccessLevel

Chrome 102 以降

ストレージ領域のアクセスレベル。

列挙型

"TRUSTED_CONTEXTS"
拡張機能自体から発信されたコンテキスト��指定します。

"TRUSTED_AND_UNTRUSTED_CONTEXTS"
拡張機能の外部から発生したコンテキストを指定します。

StorageArea

プロパティ

  • onChanged

    Event<functionvoidvoid>

    Chrome 73 以降

    1 つ以上のアイテムが変更されたときに発生します。

    onChanged.addListener 関数は次のようになります。

    (callback: function) => {...}

    • callback

      関数

      callback パラメータは次のようになります。

      (changes: object) => void

      • 変更

        オブジェクト

  • クリア

    void

    ストレージからすべてのアイテムを削除します。

    clear 関数は次のようになります。

    () => {...}

    • 戻り値

      Promise<void>

      Chrome 95 以降
  • get

    void

    ストレージから 1 つ以上のアイテムを取得します。

    get 関数は次のようになります。

    (keys?: string | string[] | object) => {...}

    • string | string[] | object 省略可

      取得する単一のキー、取得するキーのリスト、またはデフォルト値を指定するディクショナリ(オブジェクトの説明を参照)。空のリストまたはオブジェクトは、空の結果オブジェクトを返します。null を渡して、ストレージの内容全体を取得します。

    • 戻り値

      Promise<object>

      Chrome 95 以降
  • getBytesInUse

    void

    1 つ以上のアイテムで使用されている容量(バイト単位)を取得します。

    getBytesInUse 関数は次のようになります。

    (keys?: string | string[]) => {...}

    • string | string[] 省略可

      合計使用量を取得する 1 つのキーまたはキーのリスト。空のリストは 0 を返します。null を渡して、すべてのストレージの合計使用量を取得します。

    • 戻り値

      Promise<number>

      Chrome 95 以降
  • getKeys

    void

    Chrome 130 以降

    ストレージからすべてのキーを取得します。

    getKeys 関数は次のようになります。

    () => {...}

    • 戻り値

      Promise<string[]>

  • 削除

    void

    ストレージから 1 つ以上のアイテムを削除します。

    remove 関数は次のようになります。

    (keys: string | string[]) => {...}

    • string | string[]

      削除するアイテムの単一のキーまたはキーのリスト。

    • 戻り値

      Promise<void>

      Chrome 95 以降
  • set

    void

    複数のアイテムを設定します。

    set 関数は次のようになります。

    (items: object) => {...}

    • アイテム

      オブジェクト

      ストレージを更新する各 Key-Value ペアを提供するオブジェクト。ストレージ内の他の Key-Value ペアには影響しません。

      数値などのプリミティブ値は、想定どおりにシリアル化されます。typeof "object""function" を含む値は、通常 {} にシリアル化されます。ただし、Array(想定どおりにシリアル化)、DateRegexString 表現を使用してシリアル化)は例外です。

    • 戻り値

      Promise<void>

      Chrome 95 以降
  • setAccessLevel

    void

    Chrome 102 以降

    ストレージ領域の必要なアクセスレベルを設定します。デフォルトでは、session ストレージは信頼できるコンテキスト(拡張機能ページとサービス ワーカー)に制限されますが、managedlocalsync ストレージでは信頼できるコンテキストと信頼できないコンテキストの両方からのアクセスが許可されます。

    setAccessLevel 関数は次のようになります。

    (accessOptions: object) => {...}

    • accessOptions

      オブジェクト

      • accessLevel

        ストレージ領域のアクセスレベル。

    • 戻り値

      Promise<void>

StorageChange

プロパティ

  • newValue

    任意の省略可

    アイテムの新しい値(新しい値がある場合)。

  • oldValue

    任意の省略可

    アイテムの古い値(古い値が存在する場合)。

プロパティ

local

local ストレージ領域のアイテムは、各マシンにローカルです。

タイプ

StorageArea とオブジェクト

プロパティ

  • QUOTA_BYTES

    10485760

    ローカル ストレージに保存できるデータの最大量(バイト単位)。各値の JSON 文字列化と各キーの長さの合計で測定されます。拡張機能に unlimitedStorage 権限がある場合、この値は無視されます。この上限を超える更新は直ちに失敗し、コールバックを使用している場合は runtime.lastError を設定し、async/await を使用している場合は拒否された Promise を設定します。

managed

managed ストレージ領域のアイテムは、ドメイン管理者が構成したエンタープライズ ポリシーによって設定され、拡張機能に対して読み取り専用です。この Namespace を変更しようとすると、エラーが発生します。ポリシーの構成については、ストレージ領域のマニフェストをご覧ください。

タイプ

session

Chrome 102+ MV3+

session ストレージ領域のアイテムはメモリに保存され、ディスクに永続化されません。

タイプ

StorageArea とオブジェクト

プロパティ

  • QUOTA_BYTES

    10485760

    メモリに保存できるデータの最大量(バイト単位)。各値とキーの動的に割り当てられたメモリ使用量を推定して測定されます。この上限を超過する更新は直ちに失敗し、コールバックを使用している場合や Promise が拒否された場合は runtime.lastError を設定します。

sync

sync ストレージ領域のアイテムは、Chrome 同期を使用して同期されます。

タイプ

StorageArea とオブジェクト

プロパティ

  • MAX_ITEMS

    512

    同期ストレージに保存できるアイテムの最大数。この上限を超える更新はすぐに失敗し、コールバックを使用している場合や Promise が拒否された場合は runtime.lastError が設定されます。

  • MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE

    1000000

    非推奨

    storage.sync API には、継続的な書き込みオペレーションの割り当てがなくなりました。

  • MAX_WRITE_OPERATIONS_PER_HOUR

    1800

    1 時間あたりに実行できる setremoveclear オペレーションの最大数。これは 2 秒あたり 1 回で、短期間の書き込み回数の上限よりも低くなります。

    この上限を超過する更新は直ちに失敗し、コールバックを使用している場合や Promise が拒否された場合は runtime.lastError を設定します。

  • MAX_WRITE_OPERATIONS_PER_MINUTE

    120

    1 分あたりに実行できる setremoveclear オペレーションの最大数。これは 1 秒あたり 2 回で、短期間で 1 時間あたりの書き込み数よりも高いスループットを実現します。

    この上限を超過する更新は直ちに失敗し、コールバックを使用している場合や Promise が拒否された場合は runtime.lastError を設定します。

  • QUOTA_BYTES

    102400

    同期ストレージに保存できるデータの合計最大量(バイト単位)。各値の JSON 文字列化と各キーの長さの合計で測定されます。この上限を超過する更新は直ちに失敗し、コールバックを使用している場合や Promise が拒否された場合は runtime.lastError を設定します。

  • QUOTA_BYTES_PER_ITEM

    8192

    同期ストレージ内の各アイテムの最大サイズ(バイト単位)。値の JSON 文字列化とキーの長さを合計した値で測定されます。この上限を超えるアイテムを含む更新は直ちに失敗し、コールバックを使用している場合、または Promise が拒否された場合は runtime.lastError が設定されます。

イベント

onChanged

chrome.storage.onChanged.addListener(
  callback: function,
)

1 つ以上のアイテムが変更されたときに発生します。

パラメータ

  • callback

    関数

    callback パラメータは次のようになります。

    (changes: object, areaName: string) => void

    • 変更

      オブジェクト

    • areaName

      文字列