思ってることってこんなもんだよ
Chrome拡張機能でパーミッションを追加して再リリースすると何が起きるのか

開発者は常に新しい価値をユーザに提供したいと考えています。自分の技術的興味が、結果としてユーザを幸せにすることを切に願っています。新しい機能を提供するということは、時にユーザの持ち物をプログラムから更にアクセスできるようにならないと実現しません。勝手に持ち物に触ることは、現実世界ではやってはいけないことですし、もちろんChromeの中においても同じです。ユーザに許可を得て初めて、プログラムはユーザの持ち物に触れる権利を得られるのです。

全てのユーザが「うん、いいよ」と言ってくれれば話は楽です。しかし、世の中そんなに簡単ではありません。

Chrome拡張機能を作ったことのある方であれば、manifest.jsonファイルに"permissions"属性があることを知っていると思います。そのChrome拡張機能が予めユーザのどんな持ち物に触れるか、ユーザの持ち物をどこに持ち出すか、といったことを"permissions"属性に書いておきます。そのChrome拡張機能をインストールする際に、Chromeはユーザに「この拡張機能はこんなことやあんなことをするかもよ?いいの?それでもインストールしちゃう?」と聞いてきます。ユーザがそれに同意しないと、その拡張機能はインストールされず、ユーザのChrome内で動作することはありません。

僕が公開したImage Collector extensionは、ここ一週間で1万9千人以上のユーザにインストールされていると、Chromeウェブストアは僕に教えてくれています。

Event pageに仕込んであるGoogle Analyticsの統計を見ると、平均で3万4千セッションとなっていました。

世界中のChromeユーザに使ってもらってるんだな、と感激していました。自分で便利だと思う機能を次々と追加してきましたが、それが他の人にとっても嬉しいことだとすると、それはそれで作りがいを更に感じることができるわけです。

僕は有頂天になっていたかもしれません。

先日Image Collector extensionに、ある機能を追加しました。それは、画像をダウンロードしたWebページを自動的にブックマークに追加してくれる、という機能でした。あとで「あれ、あの日に画像をダウンロードしたページってどこだっけ?」と思い出せないことが何度かあって、自動的にブックマークしてくれれば、あとで思い出すのは簡単です。仕事柄、一日中PCに向かっているために、閲覧履歴からそれを見つけるのは事実上不可能です。自分にとってこの機能は重要であり、他の人にとっても嬉しいことだと信じていました。

僕は、manifest.jsonファイルに以下の記述を追加して、Chromeウェブストアに新しいバージョンを公開しました。Chrome拡張機能からユーザのブックマークをいじるためには、"bookmarks"パーミッションが新たに必要になります。

{
  ...
  "permissions": [
    ...,
    "bookmarks"
  ],
  ...
}

新しいバージョンが世界中のユーザに浸透していく様を、Google Analyticsでしばらく見ていました。Google Analyticsのリアルタイム機能は素晴らしいです。公開した直後は、900以上の訪問者が来ていました。

これが、ものの数時間で、なんと10分の1近くまで数値が下がってしまったのです!

最初、僕は何が起きているのか、わかりませんでした。こんなにも一気にImage Collector extensionからユーザが離れていくのです。「そんなにブックマーク機能を追加したことがネガティブだったのか?」とも思いました。「設定でブックマークしないことも選択できるようにしたのに、それが見つけられないのでは?」とも考えました。でも、実際に起きていることは、それらとは違いました。もっと本質的なミスを僕はしてしまったのです。

古いバージョンから新しいバージョンに再インストールされる際に、もしmanifest.jsonファイルの"permissions"属性にパーミッションが追加されていたとします。まさに今回がその状況です。この場合、暗黙的にそのパーミッションを許可してしまうと、ユーザの知らないところで拡張機能が持ち物にアクセスできてしまいます。これは非常に危険なことです。そのため、Chromeは対象の拡張機能を「無効化」します。つまり、新しいバージョンをインストールはするけど、動作を止めてしまうのです。もちろんこれはユーザを守るための「非常に正しい挙動」です。

ユーザはそのことに気がつくかというと、現在のChromeの動きでは気がつかないかもしれません。もちろん、何も警告を出さないわけではありません。Chromeの新しいバージョンが出たときにアップデート促すように、メニューアイコンに緑色の矢印マークが表示されます。それを押すと、拡張機能がユーザからの同意を待っていることが表示されます。ただ、本当に小さなマークですので、すぐに気がつかないユーザも多いことでしょう。

また、そこからユーザに提示されるUIは、「権限を再設定」ボタンと、その隣に表示される「Chromeから削除」ボタンの2つです。これは僕の勘ですが、この2つが提示された場合に多くのユーザは、「なにこれ怖い」と思って「Chromeから削除」ボタンを押してしまうのではないかと思うのです。もちろん、その結果Image Collector extensionはChromeから削除されます。つまり、ユーザが減るわけです。

上の画像の黒抜きの箇所は、対象の拡張機能の名前が入ります。

まとめると、

  • "permissions"属性に何かを追加する。
  • Chrome拡張機能が無効化される。
  • ユーザに「Chromeから削除」される。

という、開発者にとって最悪なシナリオをユーザは辿ることになってしまうわけです。

Google Alanyticsの訪問数がみるみる下がっていった現象は、新しいバージョンがChromeウェブストアから世界中のImage Collector extensionユーザに配信されるに従ってその拡張機能が無効化され、Google Analyticsに通信がされなくなっていった結果です。Image Collector extensionでは、タブを開いたときなどの各種イベントに応じてEvent pageが活性化されます。そのタイミングでbackground.htmlファイルが呼び出され、そこに仕込んであるGoogle Analyticsがコールされます。つまり、ユーザはImage Collector extensionをインストールするだけで、訪問者数に常にカウントされる状況になるのですが、拡張機能が無効化されてしまっては、訪問者数にカウントされることはありません。

ただ、もうこれでImage Collector extensionもユーザがいなくなって終わりなのかというと、それも違います。実は、Chromeのダッシュボード上で見ることができるインストール数のグラフは、下がっているどころか微増しています。

Image Collector extensionでは、ユーザの操作に応じて、そのイベント発生数をGoogle Analyticsで集計しています。つまり、そのイベント発生数の方が、訪問者よりもリアルな利用者の実態を示すことになるのですが、その落ち込みはEvent pageの活性化数が加味された訪問者数の減少に比べて大きくはない、という結果です。

ここから読み取れることは、

  • Image Collector extensionを入れてくれていた人は多かった。
  • しかし、アクティブに使われる割合は10分の1程度だった。
  • 非アクティブなユーザのChrome内でImage Collector extensionは眠ってる状態になった結果、訪問者数は激減した。
  • しかし、幸いにも新規にインストールしてくれる人数は減っていない。
  • 上記の要因がほとんどであり、新規に追加した機能に対するリアクションかどうかはわからない(たぶんほとんど関係ない)。

ということで、元々アクティブに使ってくれていた100人程度の数値に落ち着いただけで、その後徐々に新しいバージョンを再度使ってくれるユーザが増えてきてもおかしくないかな、と楽観的に考えてよさそうです。ただし、やはり"permissions"属性に新規にパーミッションを追加してバージョンアップしてしまうことのリスクは相当なものでした。

ではこの事態は避けることはできなかったのか?というと、避けることはできました。というか、その方法も知っていましたし、goo.gl URL Shortener extensionで過去にやったことがありました。その方法は、"optional_permissions"属性とchrome.permissions.request()関数の利用です。これらを使うことで、拡張機能を無効化させることなく、新しいパーミッションをユーザに同意してもらうことが可能になります。その方法は別のエントリで書こうと思います。

「最初から知ってたんだったら、そうすれば良かったじゃん」と思ったことでしょう。僕もそう思います。しかし、"permissions"属性に追加して再リリースした時に何が起きるのか、興味がものすごくあったのです。自分が普段使ってる拡張機能の中には今までそういうバージョンアップをしたものはなく、個人的に未経験だったのです。

これからChrome拡張機能を作ろうと思っている方は、よーーーーく考えてパーミッションを取り扱うようにしましょう。