Chromeのブックマークバーにショートカットを当てる機能拡張


OS X で Safari をメインブラウザとして使っていた理由の一つに、コマンド+数字というショートカットでブックマークバーの項目を呼び出せることがあったのだけど、次のバージョンの開発プレビュー版に更新してから暫くこのショートカットが Chrome のようにタブを呼び出すようになってしまったことに加え、SafariDAVClient が暴走するという正式リリース前にはよくある問題に直面し、更にグレードダウンもできないということから、既定のブラウザを Chrome にし、ブックマークバー(Safari では「お気に入りバー」という)に並ぶブックマークレットをショートカットで呼び出す機能拡張を自作することにした。

http://hkitago.tumblr.com/post/123624450876


(この機能設定はようやく v9 10601.1.50 Seed 5で実装された)

実際にマニュフェストファイル(manifest.json)と本体の JavaScript ファイル(background.js)はこのようなものを書いた。

{
    "name": "Bookmarks Bar Launcher",
    "version": "1",
    "manifest_version": 2,
    "permissions": [
    "bookmarks",
    "tabs",
    ""
  ],
    "background": {
        "scripts": ["background.js"],
        "persistent": false
  },
    "commands": {
        "bblCommand1": {
            "suggested_key": {
                "default": "Ctrl+1",
                "mac": "Command+1"
            },
            "description": "Item 1"
        },
        "bblCommand2": {
            "suggested_key": {
                "default": "Ctrl+2",
                "mac": "Command+2"
            },
            "description": "Item 2"
        },
        "bblCommand3": {
            "suggested_key": {
                "default": "Ctrl+3",
                "mac": "Command+3"
            },
            "description": "Item 3"
        },
        "bblCommand4": {
            "suggested_key": {
                "default": "Ctrl+4",
                "mac": "Command+4"
            },
            "description": "Item 4"
        }
    }
}
chrome.commands.onCommand.addListener(function(command) {
	var url;
	switch(command) {
		case 'bblCommand1': url = url_items[0]; break;
		case 'bblCommand2': url = url_items[1]; break;
		case 'bblCommand3': url = url_items[2]; break;
		case 'bblCommand4': url = url_items[3]; break;
	}
	if((/^javascript:/).test(url)) {
		url = url.replace(/javascript:/g, '');
		chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
			chrome.tabs.executeScript(tabs[0].id, {code: decodeURI(url)});
		});	
	} else {
		window.open(url);	
	}
});
var url_items = new Array();
chrome.bookmarks.getTree(process_bookmark);
function process_bookmark(bookmarks) {
	for(var i = 0; i < bookmarks.length; i++) {
		var bookmark = bookmarks[i];
		if(bookmark.url && (bookmark.url).indexOf('chrome://bookmarks/')) {
			url_items.push(bookmark.url);
		}
		if(bookmark.children) {
			process_bookmark(bookmark.children);
		}
	}
	url_items.splice(4);
}

参考したスタックオーバーフローで知ったのだけど、Google Chrome Extension では最大4つまでしかコマンドを上書きできないそうで、Safari では1〜9までのショートカットになるところを、今回は1〜4までとなってしまった。左手でのショートカットキー操作を考えるとそれでも良いかなという気もしたので、名前を変えた同様の機能拡張を2つ用意することは止めておいた。

また、頻繁に利用する4つ共にブックマークレットを使うことから単に window.open しないで chrome.tabs.executeScript と振り分けをするところが肝。更にブックマークバーの初期状態では先頭に Bookmark という項目があるのでそれをスキップする処理も入れた。今のところの問題は、ブラウザを最初に起動した時に限りこの機能を読み込むので、起動中ブックマークバーの項目を入れ替えた場合に順序の整合性が取れない点にあるのでご注意。

最後に、この機能拡張を利用するには適当な場所にフォルダを作成し2つのファイルを保存した後、Chrome の環境設定>機能拡張と進み、右上の「デベロッパーモード」にチェックを入れると表示される「パッケージ化されていない機能拡張を読み込む…」ボタンを押し、先のフォルダを選択する。
スクリーンショット 2015-08-20 10.19.17

ここまでやってみてうまく動かない場合は、機能拡張環境設定画面の最下方右にある「キーボードショートカット」というリンクをクリックすると、改めてお好みのショートカットを割り当てることができるので設定すると良い。

面倒臭いからパッケージ化された .crx ファイルをよこせ!という方がいらしたら遠慮なくご連絡ください。

http://hkitago.tumblr.com/post/124450780756

P.S. ちなみにウィンドウズ版でも動作することを確認していますが、Safari 体験が少ないと思うので手厚いサポートは遠慮したいところです笑

参照:

,