こんにちは、ALBERTの太田です。今回からChrome4のリリースまでの間、Google Chrome Extensionsの詳細を追っていきたいと思います。なおタイトルの通り、この連載は先取り! Google Chrome Extensionsの続編となっています。
まず、重要なお知らせがあります。前回の特集で何度か使用していたToolstripsとMoleがベータリリースまでに削除されることが決まりました。その代わりとして、今回解説するBrowser Actionsが利用できるようになります(Important: Toolstrips being removed in favor of browser actions)。また、Browser Actionsに合わせて、第3回で解説したPage Actions APIの新バージョンが提案されています。こちらも詳細は追って解説します。
そして、Chromeの今後の開発スケジュールが公開されました。こちらによると(2009年10月15日時点で)、2009年10月末にBeta版の1回目のリリースがあり、12月10日に再度beta版の更新が行われ、最終的に2010年1月12日にChrome 4の正式リリースとなる予定が立っています。
それでは、今回はChrome ExtensionsのAPIの中から、Browser Actions APIとTabs APIの使い方を見ていきます。
Browser Actions API
Browser Actions APIはツールバーにボタンを追加するAPIです。(2009年10月12日時点では)まだドキュメントはなく、提案段階のドキュメントのみですが、実装はかなり進んでおりWindowsのdev版でその機能を試すことができます。
最初に、実装案のモックを見てみます。
このようにOmniBox(アドレスバー)の隣に任意のボタンを追加できます。FirefoxのAdd-onでもよく使用される機能です。ツールバーの領域には限りがあるので、解決策として図1のように数が多い場合は隠れるようになる予定です(Windowsのクイック起動とよく似ています)。このBrowser Actionsの使い方と詳細を解説します。
Browser Actionsの使い方
では、サンプルを見ていきます。Browser Actionsを使用するには、例によってまずmanifest.jsonにその定義を記述します。
なお、今回はChromiumのリポジトリにある、Browser Actionsの印刷ボタンをサンプルとして使用します。
browser_actionというプロパティに、default_title(マウスオーバー時に表示されるテキスト)とdefault_icon(ボタンとして使用される画像)を指定しています。default_iconは必須です。この記述だけでボタンの設定は完了です。続いて、ボタンをクリックした際のアクションをBackground Pagesで定義します。
このように、chrome.browserAction.onClickedでボタンがクリックされた際のアクションを定義できます。これでボタンをクリックしたら現在選択しているタブを印刷するシンプルな機能を実現できます(印刷ではなく印刷プレビューであればもっと実用的なのですが、今のところ印刷プレビューを呼び出すAPIは用意されていないようです)。
Badgeの使い方
Browser ActionsにはBadgeと呼ばれるボタン上にテキストを表示する機能があります。このBadgeの使い方を見てみます。
このように、Background PagesやToolstripsなどの拡張コンテキストからchrome.browserActionのメソッドとして、setBadgeText、setBadgeBackgroundColor、setIcon、setTitleが使用できます。それぞれtabIdを指定することでタブごとに値を設定することが可能です。
setBadgeTextは4文字以内のテキストを指定します(2009年10月12日時点では、数値を渡すとエラーになるので注意が必要です)。setBadgeBackgroundColorはBadgeの背景色を配列で指定します。赤、緑、青、透明度の順となっており、CSSなどで使われるRGBAです。
ssetIconはアイコン画像のパス、もしくはImageDataを渡すことができます。ImageDataを渡すことができるので、canvasを使って動的に作ったイメージをボタンにすることが可能です。
Popupの使い方
Popupは図2のモックのように、Browser Actionのボタンをクリックした際に任意のHTMLを表示するAPIです。
こちらもmanifest.jsonでHTMLのパスを指定します。
Browser Actionsを使ったExtensionの作成
それでは、Browser ActionsのBadgeを使った簡単なExtensionを作成してみます。Badgeは何かの件数を表示するのに適しており、公式のサンプルとしてGmail checkerなどが存在します。そこで、今回は手軽なAPIが存在するlivedoor Readerの未読件数を表示するExtensionを作成します。
livedoor Readerの未読件数API
livedoor Readerには未読件数を返すシンプルなAPIが存在します。具体的には http://rpc.reader.livedoor.com/notify?user=USERNAME というURLにリクエストを投げると、未読件数がテキストで返ってきます。
未読件数のテキストは |100|| という形で返ってきます。先頭の|を取り除けば、parseIntが使用できるので、substringで先頭の文字だけ取り除いています。また、件数取得が成功していたら、setTimeoutで1分間置いて取得を繰り返しています。
続いて、Badgeの更新処理を見ていきます。Badgeは4文字までしか表示できないので、未読件数が5ケタになる場合は指数表記による短縮表記になるように実装しました。
JavaScriptにおいて、45e3は45000(45×(10の3乗))を意味します。これは主にコンピューター上でよく用いられる表記で、一般的ではありませんが、4文字という制約からこの表記を採用しました。
Popupによる簡易設定フォーム
続いて、ユーザーIDを入力するフォームを用意します。今回はPopupを使って簡易フォームを作成します。まずはmanifest.jsonでpopupを定義します。
中身となるHTML/CSSを用意します。
さらに、このフォームを処理するJavaScriptを用意します。
Popup側では、chrome.extension.getBackgroundPageでBackground Pageのグローバルオブジェクトを取得し、ユーザー名が入力されたら初期化処理を行うようにしています。
最後になりますが、Background Pageでの初期化処理を記述します。
Popupで入力されたユーザー名をlocalStorageにも保存しておき、ブラウザを終了しても設定が保存されるようにしています。
本当にシンプルですが、これでこのExtensionは完成です。インストールはこちらからどうぞ
Inter Extension Communication
Extensions同士での連携のために、InterExtensionCommunicationというAPIが用意されています(Revision 28565 以降)。こちらの使い方を簡単に見てみます。
まず、メッセージを送信したいExtensionのIDを把握する必要があります。これは chrome://extensions/ などで確認できます。そのIDに対してchrome.extension.connectでコネクションを作成します。このときnameで名前を指定しておくと、受け取り側で誰からのメッセージか判断しやすくなります。
続いて、メッセージの受け取る側の処理です。chrome.extension.onConnectExternalでほかのExtensionsからの接続を受け、メッセージを受信できる状態にします。メッセージを受け取った際の第2引数(ここではinfoという名前)には、メッセージを送信した側のExtensionの情報(idなど)が入っています。
Tabs/Windows APIの操作
最後に、Tabs/Windows APIの汎用的な操作をコードスニペットとしてまとめます。多くの関数はTabオブジェクトを引数として渡します。TabオブジェクトはTabs APIのgetやgetSelectedなどのほか、Content Scriptからメッセージを受け取った際の第2引数のtabプロパティからも取得することができます。
このようにどの操作もかなりシンプルに記述できます。タブの選択を切り替えたい場合はchrome.tabs.updateでselected:trueだけを送る点だけは少しわかり難いかもしれません。
そのほか、JavaScriptのTipsとして、配列の走査を途中で中断したい場合はArray.someを使用して、return trueをするとそこで走査を止めることができます(このとき、someはtrueを返します)。
まとめ
今回は前回の特集記事以降に実装されたBrowser Actions APIを中心に、Inter Extension Communication APIと、よく使うTabs APIの操作方法をまとめました。次回はExtensionsから少し離れ、User Scriptsについて解説を行う予定です。