拡張機能は、Google Chrome本体と同じ理由で、バグ修正やセキュリティ問題の解決、新機能の追加、パフォーマンス向上、操作性向上などのため、自動的に最新版に更新されるべきだとされている。
拡張機能のパッケージ化と提供は を通じて行われる。開発者はそこで拡張機能のリリースや更新をウェブインターフェースを使って行うことが出来、このドキュメントで以下に書かれているようなことを自分で行う必要は無い。
ここでは、拡張機能をギャラリーを使わずに自分たち自身でホスティングすることを選んだ人たちが、おそらく欲するであろう拡張機能の自動更新機能についての説明を行う。その場合まず、パッケージングについて知っておいた方が良い。
インストールした拡張機能が自動更新URLを設定されていれば、数時間ごとにブラウザはアップデート・マニフェストXMLをリクエストして確認を行う。インストールされているモノよりも新しいバージョンがあれば、ダウンロード後にインストールする。手動更新同様に、新しい crx は旧来のバージョンと同じプライベートキーでサインされていなければならない。
自分自身で拡張機能をホスティングする場合、自動更新には次の “update_url” をManifest Fileに含める必要がある。
{
"name": "My extension",
...
"update_url": "http://myhost.com/mytestextension/updates.xml",
...
}
アップデート・マニフェストとして、次のようなフォーマットのXMLを返さなくてはならない。(appid、codebase、versionの属性値は環境にあわせて設定)
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
</app>
</gupdate>
(このXMLフォーマットは “Googleアップデート” の基板機能である Omaha から拝借している。詳しくは 参照)
拡張機能を識別するための公開鍵。パッケージングで説明したように、自動的に生成されるハッシュ値である。この値を知るには chrome://extensions にアクセスする。
crx ファイルへのURL。
この値を用いて、codebase で指定された場所から crx ファイルをダウンロードすべきかを判定する。そのため、値は crx ファイルの manifest.json に書かれたバージョンと一致していなければならない。
アップデート・マニフェストXMLは、<app>を複数含めることで、幾つもの拡張機能の情報を含めることが出来る。
更新確認の頻度は初期設定では数時間おきであるが、拡張機能の管理画面で “拡張機能を今すぐ更新” ボタンを押してやれば、強制的に更新を行うことができる。
他の方法としては、コマンドラインから —extensions-update-frequency を指定して、更新確認頻度をあげてやることも出来る。例えば、更新確認頻度を45秒おきにするには、次のようにする。
chrome.exe --extensions-update-frequency=45
これによりインストールされている全ての拡張機能への確認頻度が変わるので、ネットワークの帯域やサーバへの付加などを考慮するよう注意が必要である。一時的にテスト対象以外の拡張機能をアンインストールするようなことをすべきであろう。
基本的な自動更新の仕組みは、単純に静的なXMLファイルをapacheなどのウェブサーバに置き、拡張機能の更新があった際に、同時にそのXMLファイルを更新すれば良いようにデザインされている。
より進んだ開発者だれば、おそらく更新確認の仕組みがアップデート・マニフェストに対して拡張機能IDとバージョン番号をリクエスト・パラメータに付加できるという事実を利用したいと思うであろう。そうすれば、静的なXMLファイルを配置するのではなく、サーバ側で動的に作られたXMLを返してやることで、提供する全ての拡張機能のどのバージョンでも、同じ update_url を使えるようになる。
リクエスト・パラメータの書式は、次のようになる。
?x=<extension_data>
実際の通信で <extension_data> は、URLエンコードされた次のような文字列に変換される。
id=<id>&v=<version>
例えば、次のような2つの拡張機能がインストールされているとする。
そして共に updaste_url は http://test.com/extension_updates.php を指しているとする。
この時、更新確認では、次のようなリクエストが送られることになる。
http://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
http://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
注意: Chromeのバージョン3.0.196.x以前では、この機能にバグがある。内容は 参照。
今はまだ実装されていないが、最終的には複数の拡張機能が同じ update_url を持っていた場合には、パラメータで同時に確認する機能が予定されている。先程の例でいくと、リクエストは次のように集約される。
http://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
もしインストールされている拡張機能の多くが同じ update_url を使っていて、GETによるリクエストにはURLが長すぎてしまう場合(1024文字を超えてしまうような)、更新確認機能はPOSTを使うようになる。
拡張機能用のAPIが増えていくにつれて、新バージョンの拡張機能は「ブラウザのバージョンx以上でないと動作しない」というような制御をかけたくなる場合も出てくる。Google Chrome自体が自動更新されるので、数日間のうちには大多数のユーザが最新版を使うようになる。拡張機能の更新を、Google Chromeが指定のバージョン以上である場合に確実に限るようにするには、アップデート・マニフェストの <app> タグに prodversionmin 属性を追加してやる。
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
</app>
</gupdate>
この例であれば、この記述により Google Chrome 3.0.193.0 以上を使っているユーザのみ、拡張機能をバージョン2.0に自動更新するようになる。