Chrome拡張機能で"chrome.storage.sync"に保存したデータが、Chrome更新時にクリアされてしまう問題("chrome.runtime.onInstalled.addListener"実装時の注意点)について

今回は、私が作成したマウスジェスチャのChrome拡張機能 "Our Mouse Gesture"で発生していたChrome更新時に"chrome.storage.sync"に保存したデータがクリアされてしまう問題についてのお話です。

とある日、利用して下さっているユーザーから、ユーザーレビュー欄に以下のコメントが投稿されていました。

Chromeを更新する度にアドオンの設定がリセットされます。それがなければ文句なしの星5です。
(原文のまま)

私は当然自分でもこの"Our Mouse Gesture"を利用しているのですが、デフォルト設定は自分が使い易い内容としているので、マウスジェスチャのアクション設定はデフォルト設定で利用しており、この問題は全く認識しておらず、ちょっと驚きました。

1. 原因

結論から述べますと、原因はChrome拡張機能のインストール時に実行されると言われている"chrome.runtime.onInstalled.addListener()"で実行していた、"chrome.storage.sync"をクリアするコードでした。

chrome.runtime.onInstalled.addListener(function(details) {
  :
    // 設定をクリアする。
    chrome.storage.sync.clear(); // ←このコードが原因
  :
});

2. "chrome.runtime.onInstalled.addListener()"が実行されるタイミングと実装する内容

前述の通り、"chrome.runtime.onInstalled.addListener()"は、名前からも想像できるとおり、Chrome拡張機能がインストールされた時に実行されるイベントと言われています。 その性質上ここに実装する内容は、Chrome拡張機能をインストールする際に行っておいた方が良い初期化処理が主になると思います。

私はC言語からプログラムを始めたので、どうしても初期化処理といえば、データ格納領域をクリアしておくという発想になり、 今回問題となったコード「chrome.storage.sync.clear();」を実施していました。

Chrome拡張機能をインストールする際に、マウスジェスチャ設定を保存しておく「chrome.storage.sync」領域にゴミ情報があったら良くないと思い、条件反射的にクリアをしていました。

ところが、"chrome.runtime.onInstalled.addListener()"が実行されるタイミングは、以下の3つがあるようです。

  1. Chrome拡張機能がインストールされる時
  2. Chrome拡張機能がアップデートされ、Chrome拡張機能の新しいバージョンがインストールされる時
  3. Chromeがアップデートされ、Chromeの新しいバージョンがインストールされる時

私は 1. の時だけ実行されるのだと思っていたのですが、今回の問題では3. でも実行されるというのが想定外でした。。。

3. まとめ

まとめとしては、

"chrome.runtime.onInstalled.addListener()"は、何度も実行されるイベントなので、永続データの初期化処理はしてはいけない!

でした。

後書き

本記事が同様の問題に直面して困っている人の一助になれたら幸いです。
最後まで読んで頂きありがとうございました。

また、”Our Mouse Gesture"を使ってくれている人、本問題を報告してくれた人に感謝致します。

以上。