説明
chrome.storage
API を使用して、ユーザーデータの保存、取得、変更の追跡を行います。
権限
storage
ストレージ API を使用するには、拡張機能のマニフェストで "storage"
権限を宣言します。次に例を示します。
{ "name": "My extension", ... "permissions": [ "storage" ], ... }
コンセプトと使用方法
Storage API は、ユーザーデータと状態を保持するための拡張機能固有の方法を提供します。ウェブ プラットフォームのストレージ API(IndexedDB、Storage)に似ていますが、拡張機能のストレージのニーズを満たすように設計されています。主な機能は次のとおりです。
- 拡張機能のサービス ワーカーやコンテンツ スクリプトを含むすべての拡張機能コンテキストは、Storage API にアクセスできます。
- JSON シリアル化可能な値はオブジェクト プロパティとして保存されます。
- Storage API は非同期で、一括読み取りと書き込みのオペレーションを行います。
- ユーザーがキャッシュと閲覧履歴を削除しても、データは保持されます。
- 保存された設定は、分割シークレット モードを使用している場合でも保持されます。
- エンタープライズ ポリシー専用の読み取り専用管理ストレージ領域が含まれます。
拡張機能でウェブ ストレージ API を使用できますか?
拡張機能は、一部のコンテキスト(ポップアップやその他の HTML ページ)で Storage
インターフェース(window.localStorage
からアクセス可能)を使用できますが、次の理由からおすすめしません。
- 拡張機能 Service Worker は Web Storage API を使用できません。
- コンテンツ スクリプトはホストページとストレージを共有します。
- Web Storage API を使用して保存されたデータは、ユーザーが閲覧履歴を削除すると失われます。
Service Worker からウェブ ストレージ API のデータを拡張機能ストレージ API に移動するには:
- 画面外ドキュメントの HTML ページとスクリプト ファイルを準備します。スクリプト ファイルには、変換ルーチンと
onMessage
ハンドラが含まれている必要があります。 - 拡張機能のサービス ワーカーで、データの
chrome.storage
を確認します。 - データが見つからない場合は、
createDocument()
にお問い合わせください。 - 返された Promise が解決されたら、
sendMessage()
を呼び出して変換ルーティンを開始します。 - 画面外ドキュメントの
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 にはストレージ割り当てが含まれています。データを保存できなくなることがないよう、保存するデータには注意することをおすすめします。
- ストレージの完了には時間がかかることがあります。その時間を考慮してコードを構成してください。
ストレージ領域の制限と、制限を超えた場合に発生する事象の詳細については、sync
、local
、session
の割り当て情報をご覧ください。
ユースケース
以降のセクションでは、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 ドキュメントの拡張機能のストレージの表示と編集をご覧ください。
例
次のサンプルは、local
、sync
、session
の各ストレージ領域を示しています。
ローカル
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
ストレージ領域のアクセスレベル。
列挙型
"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
(想定どおりにシリアル化)、Date
、Regex
(String
表現を使用してシリアル化)は例外です。
- 戻り値
Promise<void>
Chrome 95 以降
-
- setAccessLevel
void
Chrome 102 以降ストレージ領域の必要なアクセスレベルを設定します。デフォルトでは、
session
ストレージは信頼できるコンテキスト(拡張機能ページとサービス ワーカー)に制限されますが、managed
、local
、sync
ストレージでは信頼できるコンテキストと信頼できないコンテキストの両方からのアクセスが許可されます。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
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 時間あたりに実行できる
set
、remove
、clear
オペレーションの最大数。これは 2 秒あたり 1 回で、短期間の書き込み回数の上限よりも低くなります。この上限を超過する更新は直ちに失敗し、コールバックを使用している場合や Promise が拒否された場合は
runtime.lastError
を設定します。 - MAX_WRITE_OPERATIONS_PER_MINUTE
120
1 分あたりに実行できる
set
、remove
、clear
オペレーションの最大数。これは 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
文字列
-