GoogleChromeのExtension作成 タブの削除時に直前のタブに戻る拡張を作ってみる

こんばんは。松田です。
今日はGoogleChromeのExtensionを作ってみたいと思います。
実装するExtensionの内容はとっても簡単。「タブを閉じたときに直前に開いていたタブに戻る」Extensionです。

みなさんGoogleChrome使ってますか?
Extension入れまくってますか?
自分はChromeにExtensionを入れられるようになってから完全にChromeの虜となっています。

そんな中、最近気に入っている拡張がこれです。

Right Click Opens Link in New Foreground Tab
https://chrome.google.com/extensions/detail/afalkcagoidkdjdlfoaicbanbfgoamoo?hl=ja

リンクを右クリックしたら新しいタブでリンク先を開いてくれる、ただそんだけのExtensionです。
とてもシンプルなものですが、自タブに表示されている内容を消したくないときや、画像を別枠で見たいときなどに重宝してます。
要するに画像がいっぱいあるようなサイトで画像をポンポン別タブで開くときにすごい便利なんです。

しかし、このExtensionを使っていて気になってくるのが、新しく開いたタブを消した時の遷移先です。
別タブで開いて見たいリンク先は、大抵そんなに重要でない内容のものが多いので、開いて消して開いて消してを繰り返すことになります。
自分としてはリンクを別タブで開いて消して開いて消して・・・を繰り返したいのですが、Chromeは消したタブの右のタブにフォーカスを当ててしまうため、思ったような快適な操作ができません。

というわけで、前置きが長くなりましたが、そんな理由から「タブを閉じたときに直前に開いていたタブに戻る」動作をするExtensionを作ってみることにしました。

Extensionのつくりかた基礎

まず最初に見たサイトはここ。
http://code.google.com/chrome/extensions/getstarted.html
英語ですがExtensionの作り方の基礎がシンプルで分かりやすく解説されています。
このページの内容を追っていくだけで5分もかからずにExtensionが作れてしまいます。
まずはこのページの内容をさらーっと追って作ってみるとよいかと思います。

次に見たのがここ。
http://dev.screw-axis.com/doc/chrome_extensions/
そうは言ってもやっぱ日本語で見たいよねー。ということで読みあさりました。
上の本家リファレンスの日本語訳が載っています。

実際につくってみる

1. まずExtensionを開発するディレクトリを用意します。

2. その中にmanifest.jsonファイルを作成します。

このmanifest.jsonファイルがExtensionの設定ファイルとなります。
作成するExtensionの名称や基本動作をここで設定します。

manifest.json


{
  "name": "BackToTheLastTab",
  "version": "1.0",
  "description": "Go back to the last tab when you close a tab.",
  "background_page": "background.html",
  "permissions": [
  	"tabs"
  ]
}

Extensionの実際の処理を行うのが、ここで"background_page"に設定した "background.html" になります。
このHTMLに記述したJavaScriptの処理がExtensionの実行結果となります。

"background_page"はバックグラウンドで処理を行わせるための項目ですが、この他にもExtensionの処理を行わせる方法はいくつか存在します。
その中でもよく使われそうなものをいくつかピックアップします。


■ browser_action
上部メニューにアイコンが追加される、最も基礎的なExtension。
アイコンをクリックしたときにExtensionが実行される。
すべてのページで共通して使えるような機能を実装する。
■ page_action
アドレスバーの右にアイコンが表示される形式のExtension
特定のページにだけ有効な機能を実装するのに使われる。
RSS取得ボタン等々。。
■ options_page
Extensionの設定を変更するオプションページのHTMLを指定する。
HTMLとJavaScriptで記述。
■ chrome_url_overrides
Chromeの特定のページを上書きする。
新規タブを開いたときや、履歴ページを開いたときに、独自のページを表示させることができる。
Feedlyとかが使ってるのがこれ。
■ background_page
Extensionが起動した瞬間からずーっと実行されているページ。
HTMLで記述されてるけど実際は表示されない。
ここにJavaScriptでコードを仕込んでおいて、必要なときに実行させたりする。
とりあえず何かしたかったらここにJavaScript仕込めばいいと見た。

今回作成するExtensionでは表示する画面は必要なく、裏側で起動されていればいいだけなので、"browser_action" も "page_action" も記述していません。
また、タブの操作を行わせるため、permissionsにtabsを渡しています。

3. 同じディレクトリ内に、background.htmlをおきます。

background.html


<html>
<head><title>background</title></head>
<script type="text/javascript">
var selectedId1 = -1; // 直前に開いたタブのID
var selectedId2 = -1; // ↑のひとつ前に開いていたタブのID
/**
 * タブが切り替えられたときの処理
 */
chrome.tabs.onSelectionChanged.addListener(function(tabId, selectInfo) {
//	alert(tabId + ':' + selectInfo);
selectedId2 = selectedId1;
selectedId1 = tabId;
});
/**
 * タブが閉じられたときの処理
 */
chrome.tabs.onRemoved.addListener(function(id, removedInfo) {
//	alert(id + ':' + removedInfo);
//	alert('selected2 = ' + selectedId2);
if (selectedId2 > 0) {
chrome.tabs.update(selectedId2, {selected:true});
}
});
</script>
<body>
</body>
</html>

このExtensionの本体になるのがこのファイルのScript部分です。
やりたいことが簡単なのでスクリプトもえらくシンプルです。

タブが切り替えられたときに、今まで開いていたタブのIDを記憶しておく処理と、タブが閉じられたときに、記憶していたタブにフォーカスを当てる処理を書いています。
デバッグ方法がよくわかんなかったので、いたるところにalert()を仕込んで実行しまくりました。
script開始部分にalert('hoge');を仕込み、Extension実行時に 'hoge' が表示されなければJSがどこか間違ってます。
多分もっとかっこいい開発方法があるはずです。

タブの操作なので、下のURLを読んで片っ端から実行してみました。
http://dev.screw-axis.com/doc/chrome_extensions/ref/api/tabs/

これでExtensionは完成です。

GoogleChromeにExtensionをインストール
次に、作ったExtensionをChromeにインストールしてみます。

1. まずはChrome右上の設定ボタンから、「拡張機能」画面を開きます。

2. 次に「デベロッパーモード」をクリック。
ボタンが3つ現れるので、「パッケージ化されていない拡張機能を読み込みます」ボタンをクリックします。

3. フォルダ選択のウィンドウが出るので、作成したExtensionのフォルダを選択。
すると他のExtensionと同様に作成したExtensionが読み込まれます。

これでインストール完了です。
作成したExtensionが一覧に表示され、実行されます。
もし納得した動きになっていなかったら、スクリプトを修正して「再読み込み」を繰り返します。

作ったExtensionを公開する

作ったついでに以下のページを参考に公開してみました。
http://blog.smartnetwork.co.jp/staff/node/44

BackToTheLastTab

https://chrome.google.com/extensions/detail/gmnobciacgaahhngegnpblmomljmbcmd
ちゃちゃーっとファイルを圧縮してアップしただけでほんとに公開されちゃってます。
簡単すぎてびびります。

最初のサンプルの実行に5分。このExtensionの実装に1時間ほど。
Extension開発というネーミングから取っ付きづらいものかとイメージしてたのですが、驚くほどあっさりと作れました。
快適なChrome生活を送るために、ぜひ皆さんもステキなExtensionを作ってみてください。