itagagaki
@itagagaki (板垣 史彦)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Chrome拡張機能が停止されたことをコンテンツスクリプトが検知するには?

Chrome拡張機能が削除または無効化されたときに、ページに注入されて動いているままのコンテンツスクリプトがそれを検知するにはどうするのがよいでしょうか?
コンテンツスクリプトがDOMに追加した要素を削除するなどのお片付けをして、自分自身の動きもそこで止めたいのです。

0

1Answer

ここを参考にして解決しました。
https://stackoverflow.com/q/44329086
https://stackoverflow.com/q/53939205

まず試したのは、こう。

let extentionEnabled = true;

const onEnabled = () => {
}

const onDisabled = () => {
}

const validityChecker = () => {
  enabled = !!(chrome.runtime?.id);
  if (extentionEnabled && !enabled) {
    onDisabled();
  } else if (!extentionEnabled && enabled) {
    onEnabled();
  }
  extentionEnabled = enabled;
};

setInterval(validityChecker, 1500);

スマートだと思えませんが他に方法が無いのではしょうがないですね。これで拡張機能が無効にされたり削除されたときにはonDisabledが呼ばれるようになりました。

だがしかし、その後拡張機能を再び有効にしてもonEnabledは呼ばれません。chrome.runtime.idundefinedのままです。

考えてみれば、それはそう。コンテンツスクリプトはブラウザがページを読み込んだときにページに注入されて動き出すものだから、再び動かすためにはページをリロードしないといけないし、そのときスクリプトは置き換わるので上記のコードは意味がない。

なので、やるなら以下のようにして拡張機能の削除や無効化には対応する。

const onDisabled = () => {
}

let pingTimer;

const validityChecker = () => {
  if (chrome.runtime?.id) {
    return;
  }
  clearInterval(pingTimer);
  onDisabled();
};

pingTimer = setInterval(validityChecker, 1500);

で、再び有効化したときは自分でページをリロードしてねという仕様にするしかないかなと。

0Like

Your answer might help someone💌