[Chrome拡張]　ストレージ(chrome.storage.local)を利用する方法

拡張機能内で値を保持したい場合、Chrome拡張ではchrome.storageが利用できます。
今回は、そのchrome.storageを利用する方法をご紹介します。

なお、chrome.storageに保存できる最大容量は、約5Mbyteまでになります。
このサイズを超える場合は、
manifest.jsのpermissionsに「unlimitedStorage」を追加してください。

:::note info
新しく作成したchrome拡張を公開しました。
そこで使用した技術を備忘録として共有できればと思い、記事を書いています。
[こちらがそのChrome拡張の記事です。ご興味があれば](https://qiita.com/doran/items/8c3ca80de3f149dce0e0)

[こちらは別のChrome拡張の記事です。合わせてどうぞ](https://qiita.com/doran/items/6613ea2d92b330bae2c9)
:::

#### 用意するファイル
```
root/
 　├ manifest.json
 　├ popup.html
 　├ js/
 　│　 ├ popup.js
 　│　 └ jquery-3.5.1.min.js
 　└ img/
 　　  ├ icon32.png
  　　 └ icon48.png
```
#### popup.html
ポップアップメニューのソースです。
p#titleに保存したタブのタイトルを表示します。
button#btn(「ストレージクリア」ボタン)を押すと保存していたタイトルを消します。
```html
<!DOCTYPE HTML>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <script src="js/jquery-3.5.1.min.js"></script>
    <script src="js/popup.js"></script>
  </head>
  <body>
    <p id="title" style="min-width: 520px;"></p>
    <button id="btn" type="button" style="margin-top:10px;">ストレージクリア</button>
  </body>
</html>
<!DOCTYPE HTML>
```
#### popup.js
popup.htmlを開いたときと、
button#btnを押したときに実行する処理を記述します。
1.***chrome.tabs.query***
　現在のウィンドウ(***currentWindow:true***)で表示中のタブ(***active:true***)を取得します。
　ここではタブのタイトル名を取得しています。
2.***chrome.storage.local.get***
　ストレージから保存しているタイトル名を取得します。
　指定している"title"は、コールバックで返されるvalueのキー値になります。
　もし、複数取得したい場合は、配列で["title","other",..]と指定します。
3.***chrome.storage.local.set***
　ストレージにタイトル名を保存します。
　タイトル名が保存されていなかった場合は、現在のタブタイトル名を
　タイトル名が保存済みの場合は、取得したタイトル名に現在のタブタイトル名を付け足しています。
```js
$(function(){
  chrome.tabs.query({ active: true, currentWindow: true },function(tab){
    //ストレージから保存されているデータを取得
    chrome.storage.local.get("title", function(value) {
      var title = (value.title ? value.title+"<br>" : "")+tab[0].title;
      //ストレージにデータを保存
      chrome.storage.local.set({"title": title},function(){
        $("#title").html(title);
      });
    });
  });
  $(document).on("click","#btn",function(){
    $("#title").html("");
    //ストレージをクリア
    chrome.storage.local.clear();
  });
});
```
#### manifest.json
***permissions***
　storage：ストレージを使用するための権限
　　　　　5Mbyteを超えるサイズを取り扱いたい場合、
　　　　「unlimitedStorage」を追加してください。
　tabs：タブの情報を取得するための権限
　　　　 この権限がなくともタブの情報は取得できますが、
　　　　 ない場合は「url,pendingUrl,title,favIconUrl」は取得できません。
　　　　　url： タブのURL
　　　　　pendingUrl： タブが完全に開かれる(コミットされる)前のタブURL
　　　　　title： タブのタイトル
　　　　　favIconUrl： タブのファビコンURL
***action*** - ***default_popup***
　chrome拡張のアイコンをクリックした際に呼び出すHTML(popup.html)を指定します。
```json
{
  "name": "ストレージテスト",
  "version": "1.00",
  "description": "ストレージテスト",
  "permissions": ["storage","tabs"],
  "action": {
    "default_icon": {
      "32": "images/icon32.png"
    },
    "default_popup": "popup.html"
  },
  "icons": {
    "48": "images/icon48.png"
  },
  "manifest_version": 3
}
```
#### 実行結果
1.Chrome拡張のポップアップメニューを開くと。。タブのタイトル名が取れている
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/c6f343b1-aa07-b585-80ab-348e94beb734.png">
2.続けてタブ切替、ポップアップメニューを開くを繰り返すと。。開いたタブのタイトル名が全て取れている。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/6598f568-b1dd-0254-389b-295ba225e3b3.png">
3.ウィンドウを閉じて、再びポップアップメニューを開くと。。閉じる前のタイトル名も残っている
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/fc19ab67-ebe9-88b3-cece-54d0e9abeddf.png">

ちなみに。。。。

プログラム以外から保存されているストレージの内容をみたい場合は
1.Chrome拡張アイコンを右クリック
2.メニューの「ポップアップ検証」をクリック
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/bf74f0c0-3f44-579e-b3f6-9e50370c4bea.png">
3.DevToolsが開かれるので、コンソールで下記を実行
```js
chrome.storage.local.get("title", function (data) { console.info(data) });
```
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e04e270a-f5da-4cdf-71ae-95ab242bf019.png">

おしまい。。
#### その他のChrome拡張の実装方法
以下はこれまでに投稿したChrome拡張の記事です。用途に応じてご覧ください。
[[Chrome拡張]　ツールバーのアイコンをクリックしてHTMLページを表示する方法](https://qiita.com/doran/items/743f687eb413c41432e1)
[[Chrome拡張]　Chrome拡張メニューからページを操作する方法](https://qiita.com/doran/items/9203789b570632e2456e)
[[Chrome拡張]　Webページ(content scripts)からChrome拡張画面へメッセージを送る方法](https://qiita.com/doran/items/faf21f816b168606cfbe)
[[Chrome拡張]　Chrome拡張画面でタイマー(定期実行処理)を使用する方法](https://qiita.com/doran/items/c2c5c225691fd423b2e6)
[[Chrome拡張]　Content Scriptsでタイマー(定期実行処理)を使用する方法](https://qiita.com/doran/items/2620b2c8f2ac2c5548b6)
[[Chrome拡張]　Chrome拡張メニューからWebページを操作する方法](https://qiita.com/doran/items/8045701ba688f50d6295)
[[Chrome拡張]　Chrome拡張メニューからWebページを操作する方法(jQueryを使う)](https://qiita.com/doran/items/817432932bf77c781002)
[[Chrome拡張]　Chrome拡張メニューとWebページでやりとりする方法](https://qiita.com/doran/items/7ccf10bb310ab46478d4)
[[Chrome拡張]　Chrome拡張メニューとWebページでやりとりする方法(Content Scriptsを使う)](https://qiita.com/doran/items/e69ba19cbd2f5049bc97)
[[Chrome拡張]　Chrome拡張メニューから開いていないWebページの情報を取得する方法](https://qiita.com/doran/items/c2d3249c53b97ddeed0d)
[[Chrome拡張]　ポップアップメニューを表示する方法](https://qiita.com/doran/items/6684c939c5dc2b9d091a)
[[Chrome拡張]　ポップアップメニューからWebページを操作する方法](https://qiita.com/doran/items/c34be1c03353a02cd04f)
[[Chrome拡張]　ポップアップメニューからWebページを操作する方法(jQueryを使う)](https://qiita.com/doran/items/6b7181e369cd1be7dfc4)
[[Chrome拡張]　ポップアップメニューからWebページを操作する方法(スタイル変更)](https://qiita.com/doran/items/00ea4f88862031811ed4)
[[Chrome拡張]　ストレージ(chrome.storage.local)を利用する方法](https://qiita.com/doran/items/38a89bcaf4b89c758725)
[[Chrome拡張]　オプションページを表示する方法](https://qiita.com/doran/items/8154f96c200b73bb9e38)