作りたかったもの
特定のページのdocumentを一定時間ごとに取得して、指定したキーワードが入っていれば、通知を出すという拡張機能。ソースコードじゃなくてdocumentとというところがミソで、そのページは一定時間ごとにサーバーと通信をして、動的に内容を書き換えているため、拡張機能で作ろうという発想に至りました。
開発環境
Google Chrome : 79.0.3945.88(64ビット)
Windows10
ソースコード
function init(){
chrome.tabs.query({url:myURL},function(tabs){
if(tabs.length!=0){
chrome.tabs.sendMessage(tabs[0].id,{text:"message"},function(callback){
check(callback);
});
}else{
noti2();//エラー処理
}
});
}
function check(callback){
if(callback==myURL){
console.log("タブを検出しました。監視モードに移行します");
chrome.alarms.create("alarms", {periodInMinutes:time});
}
}
chrome.alarms.onAlarm.addListener(function(request, sender, callback) {
if(request.name=="alarms"){
main();//ここにプログラム本体
}
});
chrome.alarms.create("start/alarms", {delayInMinutes:3});
chrome.alarms.onAlarm.addListener(function(request, sender, callback) {
if(request.name=="start/alarms"){
console.log("起動しました");
init();
}
});
本来ならページを開いていなくても裏でアクセスし、ドキュメントを取ってきたいところなんですが、どうやってするのか、よく分からなかった(background.jsからリクエストを非同期的に生成している?)ので、せめても、ということで、どこかのタブで開かれていたら、動作するようにしました。
発生したトラブル
上記ソースコードでは、拡張機能を読み込んで3分後に起動するようになっています。この間に特定ページの再読み込みを行う手はずなのですが、この3分の間にも main()
が1分ごとに呼ばれ続けていました。
やってみたこと
- この拡張機能のリロード
- この拡張機能を停止して再開
- 他の拡張機能の停止
- ブラウザの再起動( chrome://restart )
- 全ての
chrome.alarms.create
のコメントアウト+拡張機能のリロード
これらを行ってもバグは一向に解消しませんでした。
原因と対策
バグなのか仕様なのかは分かりませんが、拡張機能をリロードしたり、無効化したり、ブラウザを再起動したりしても、chrome.alarms.create
で{delayInMinutes:1}
と指定した時限アラートは残り続けるようです。
解決策としては、
- 拡張機能を一度削除した上で、もう一度読み込み直す
- background.jsの先頭で
chrome.alarms.clearAll();
を呼び出して、今残っている全てのアラートを消す
あたりが考えられます。
最後に
ネットで調べても、古い情報だったり、何故かエラーが出てしまっていたり、セキュリティー上の権限規制が強かったり、謎の挙動を起こしたりする、Google Chromeの拡張機能。もう、私は2度と作りたくないのですが、なかなか優秀な一面もあり、必要に迫られるまで、作りたくないです。
これがバグなのか仕様なのかご存じの方はコメント頂けたら幸いです。
以上。