凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Googleリーダーでキーボードショートカットから +1 をつける

はじめに

追記 (2011/11/12):
公式で共有ボタンが出来ましたので、以下のスクリプトは用無しとなりました。

    • -

先日、Google リーダーが改悪変更されましたね。
より見やすくなり、Google+での共有も簡単になった「Googleリーダー」 : ライフハッカー[日本版]
共有機能がなくなり、代わりにG+への導線が出来ました。ただ前バージョンではできていた「Shift + S -> c -> (コメント書く) -> Tab -> Enter」という流れで共有コメントをつける機能がなくなってしまいました。
新しいバージョンでは、マウスで +1 ボタンをクリックし、その後「Share on Google+」をクリックしてコメントを書いて 、「Tab -> Tab -> Enter」という流れになってしまいました。
面倒です。とても面倒です。そこでなんとかキーボードショートカットだけでこれを実現できないかと画策した結果をまとめます。結論から言いますと、+1ボタンをクリックするところまでは成功しましたが、そのあとでコメント欄を開くところまでたどり着きませんでした…。無念。

実現できたこと

「Shift + s」押下で +1 します。

環境

Google Chrome 16.0.912.15 dev + NinjaKit(NinjaKit - os0x.blog

NinjaKitを使用しています。FireFoxグリモンでもいけるかもしれませんが、試してません。

仕組み

実は +1 ボタンのエリアは iframe になっていて、https://plusone.google.com を参照しています。Google リーダーは http://www.google.com/ 上にあるのでクロスドメイン制約に引っかかってしまいます。そこで postMessage を使って iframe 先へとデータを送っています。ただ、NinjaKit(グリモンも)の制約で、スクリプト上で postMessage を実行できません。そこで下記サイトを参考に、NinjaKit の外側で postMessage を実行するようにしています。

GreasemonkeyでクロスドメインiframeのcontentWindowにアクセスするとエラーになる件の回避方法 - 文殊堂

www.google.com 側:

(function(){
	var onKeyDown = function(e){
		switch (e.keyCode) {
		case 83: // 's' key
			if (!event.shiftKey) return; // 'Shift' key
			location.href = "javascript:(" +
				(function(){
					var ce  = document.getElementById("current-entry");
					var ifr = ce.getElementsByTagName("iframe")[0];
					ifr.contentWindow.postMessage("plus", "*");
					ifr.focus();
				}).toString()
			+ ")()";
			break;
		}
	}
	window.addEventListener("keydown", onKeyDown, false);
})();

plusone.google.com 側:

(function(){
	var onMessage = function(e){
		switch (e.data) {
		case "plus":
			var button   = document.getElementById("button");
			var click    = document.createEvent("MouseEvents");
			click.initEvent("click");
			button.dispatchEvent(click);
			break;
		}
	}
	window.addEventListener("message", onMessage, false);
})();

おわりに

ifr.focus() して、plusone.google.com 側でごにょごにょすれば、コメント欄開いてコメントつけられるかな、と思ったのですが上手く行きませんでした。。
誰か続き作ってください。