[Chrome拡張]　Chrome拡張画面でタイマー(定期実行処理)を使用する方法

ManifestV3になり、setTimeoutが使えなくなったので、
Chrome拡張 V3でタイマーを利用する方法をご紹介します。

V3では、setTimeoutの代わりにAlarmsAPIを使用します。
今回は、Chrome拡張画面(menu.html)からのタイマー実行をご紹介します。

contents scriptでのタイマー使用方法はこちらをご覧ください。
[[Chrome拡張]　Content Scriptsでタイマー(定期実行処理)を使用する方法](https://qiita.com/doran/items/2620b2c8f2ac2c5548b6)

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

[こちらは別のChrome拡張の記事です。合わせてどうぞ](https://qiita.com/doran/items/6613ea2d92b330bae2c9)
:::
#### 用意するファイル
```
root/
 　├ manifest.json
 　├ menu.html
 　├ js/
 　│　 ├ background.js
 　│　 ├ menu.js
 　│　 └ jquery-3.5.1.min.js
 　└ img/
 　　  ├ icon32.png
  　　 └ icon48.png
```
#### menu.html
まずは、Chrome拡張メニューのアイコンをクリックした際に表示させるHTMLページを用意します。
「manifest.json」と同じ階層に「menu.html」と「js/jquery-3.5.1.min.js」、
「js/menu.js」を用意しました。

button#startを押してタイマーを開始、button#stopを押してタイマー停止させます。
div#timeにタイマーのカウントアップを表示します。
```html
<!DOCTYPE HTML>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <title>タイマーテスト</title>
    <script src="js/jquery-3.5.1.min.js"></script>
    <script src="js/menu.js"></script>
  </head>
  <body>
    <button type="button" id="start">開始</button>
    <div id="time" style="display:inline-block; padding:0px 10px;">停止中</div>
    <button type="button" id="stop">停止</button>
  </body>
</html>
```
#### menu.js
次に「menu.html」で行われた操作を処理する「menu.js」を「js」フォルダ以下に作成します。
1.開始ボタンを押す。
　***chrome.alarms.create***でアラームを登録します。
　アラーム通知の周期は***最小で1分単位***で設定できます。
　今回は、periodInMinutesに1を指定しています。(1分単位)
2.指定した周期でアラームが通知される。
　***chrome.alarms.onAlarm.addListener***でアラーム通知を受け取ります。
　引数のalerm.nameが***chrome.alarms.create***で設定した名前であるか確認します。
3.タイマーをカウントアップする。
4.タイマーを停止する。
　***chrome.alarms.clear***に止めたいアラームの名前を指定してアラームを止めます。
```js
const ALERT_NAME = "alert_test";
$(function(){
  //「開始」ボタンを押したときに読み出されます。
  $(document).on("click","#start",function(){
    $("#time").text("0");
    //アラームを開始します。
    chrome.alarms.create(ALERT_NAME,{"periodInMinutes":1});
  });
  //「停止」ボタンを押したときに読み出されます。
  $(document).on("click","#stop",function(){
    $("#time").text("停止中");
    //アラームを停止します。
    chrome.alarms.clear(ALERT_NAME);
  });
});
//アラームの通知を受け取る。
chrome.alarms.onAlarm.addListener(function (alarm) {
  if (alarm.name == ALERT_NAME) {
    $("#time").text(Number($("#time").text())+1);
  }
});
```
#### manifest.json
AlarmsAPIを使う場合、**permissions**に「alarms」を設定します。
```json
{
  "name": "タイマーテスト",
  "version": "1.00",
  "description": "タイマー送信テスト",
  "permissions": ["alarms"],
  "background": {
    "service_worker": "js/background.js"
  },
  "action": {
    "default_icon": {
      "32": "images/icon32.png"
    }
  },
  "icons": {
    "48": "images/icon48.png"
  },
  "manifest_version": 3
}
```
#### background.js
Chromeブラウザのツールバーにあるアイコンがクリック時に「menu.html」を
新しいタブで開くためにbackgroundを用意します。
また、拡張機能をインストールしたときに呼ばれるイベントで登録済みのタイマーを消しておきます。
```js
//ツールバーにあるアイコンをクリックしたときに呼ばれる
chrome.action.onClicked.addListener(function(){
  chrome.tabs.create({"url": "menu.html"});
});
//拡張機能をインストールしたときに呼ばれる
chrome.runtime.onInstalled.addListener(function() {
  //登録済みのアラームを全て削除
  chrome.alarms.clearAll();
});
```

#### 実行結果
1.「開始」ボタンを押してタイマーをスタートさせます。
![スクリーンショット 2023-06-19 14.37.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/0ecb70e4-45ea-193a-431e-26e6d1ccad95.png)
2.しばらく待つと1分単位で値が更新されていきます。
![スクリーンショット 2023-06-19 14.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e6d5f8ca-5538-bb51-baca-129cd2cb4418.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)