Hatena::Groupos0x

FFFF RSSフィード

0xFFのメモです。

2009 December 20th Sunday

Chrome Keyconfig、Chrome Gestureにアクションを追加する方法:ドラフト

| 19:04 | Chrome Keyconfig、Chrome Gestureにアクションを追加する方法:ドラフト - FFFF を含むブックマーク はてなブックマーク - Chrome Keyconfig、Chrome Gestureにアクションを追加する方法:ドラフト - FFFF

Chrome Keyconfig、Chrome Gesturesにアクションを追加する方法について、AutoPatchWork 1.0.2では、下記のようにした。

Google Code Archive - Long-term storage for Google Code Project Hosting.

var CHROME_GESTURES = 'jpkfjicglakibpenojifdiepckckakgk';
var CHROME_KEYCONFIG = 'okneonigbfnolfkmfgjmaeniipdjkgkl';
var action = {
	group:'AutoPatchWork',
	actions:[
		{name:'AutoPatchWork.toggle'},
		{name:'AutoPatchWork.request'}
	]
};
chrome.extension.sendRequest(CHROME_GESTURES, action);
chrome.extension.sendRequest(CHROME_KEYCONFIG, action);

こんな感じでオブジェクトを渡すと、Keyconfig、Gesturesの設定画面のセレクトボックスにAutoPatchWork.toggleとAutoPatchWork.requestが追加される。ユーザーがそれを選択し、どこかのページでそのアクションを呼び出すとその名前のEventが発行されるようにしている。

Gesturesの場合、こんな感じ。

var ev = document.createEvent('Event');
ev.initEvent(act.name, true, false);
ev.direction = GM._directionChain;
ev.action = act;
document.dispatchEvent(ev);

Keyconfigの場合、timesはviモードを有効にしている場合に5 jと押すと5が入る。

var ev = document.createEvent('Event');
ev.initEvent(act.name, true, false);
ev.key = key;
ev.action = act;
ev.times = KC._times||KC.times||1;
ev.target = target;
document.dispatchEvent(ev);

これらのEventオブジェクトに付けたプロパティは、拡張同士だと参照可能だけど、ページ側からは見えないようになっています(今のところ)。

で、とりあえずはこれで使えそうな気がするけど、ちょっと問題がある。

というのも、AutoPatchWorkからsendRequestするタイミングがシビアで、起動時に登録を失敗することがあるみたい。しかも、AutoPatchWorkの有効・無効を切り替えると、アクションが増えてしまう…。

このへん、スマートな解決方法がなさそうでどうしたものかなと悩み中です。

ConstellationConstellation2009/12/21 18:18登録が成功したか, KeyConfigがinstallされているかなどがわかるとありがたいので, callbackを呼んでいただけるとありがたいです. (成功しなかった場合は自前で準備など...)

2009 May 7th Thursday

AutoPager extension for Google Chrome ver 0.1

| 21:22 | AutoPager extension for Google Chrome ver 0.1 - FFFF を含むブックマーク はてなブックマーク - AutoPager extension for Google Chrome ver 0.1 - FFFF

フライング気味(extensionの実装が固まっていない)だと思うのでこっちでこそこそ(?)と公開してみる。

念のため書いておきますが、ほんと実験的なバージョンなので、自己責任でお願いします。


Google Chrome 2.0.177.1あたりで動くGoogle Chrome extension版の AutoPager です。

まず、Dev版のGoogle Chromeインストールしてください。

んで、crxをファイルをダウンロードして、実行してください。一応、インストールはそれだけです。

http://ss-o.net/chrome_extention/autopager.crx

http://autopatchwork.googlecode.com/files/autopatchwork.crx

名前変えました。アンインストール機能はないので、旧バージョンは手動で削除してください。

Google Chromeが立ち上がると思いますが、初回は動きません…*1

一度終了し、

 --enable-extensions

オプションをつけて起動してください。(初回動かないのはすでに Code Review に上がってたはず)

パッケージ

Page not found - The Chromium Projectsにあるスクリプトでパッケージにしました。フォーマットはzipなので、普通に解凍できます。

SITEINFOの管理

拡張版AutoPagerizeの特徴は、SITEINFOをキャッシュしている点です。

toolstrip上に変数としてSITEINFOをキープしていて、ページを開いた際はtoolstripとpostMessageでやり取りをして必要なSITEINFOだけ(urlがマッチしたもの)だけを取得します。

なので、PC(主にメモリ)にやさしい作りになっているはずです。

実際、どんな感じなのかソースの要点を少し。

toolstrip.html

toolstripは本来はボタンとかを置く場所みたい。ここに起動中開きっぱなしのWindowが存在するので、SITEINFO置き場として利用する。

chromium.self.onConnect.addListener(function(port) {
//こんな感じでconnectionを開いてメッセージを待ち受ける
	port.onMessage.addListener(function(info,con){
// 第一引数に受け取ったメッセージ、第二引数に(メッセージを送ってきたタブへの)connectionが入る
		var infos = [], url = info.url;
		for (var i = 0,len = siteinfo.length;i < len;i++){
			if (new RegExp(siteinfo[i].url).test(url))
				infos.push(siteinfo[i]);
		}
		con.postMessage(infos);//マッチしたSITEINFOをタブに送る
		con.postMessage({date:timestamp.toLocaleString()});//デバッグ用
	});
});
AutoPager.js
//まず、toolstripへのコネクションを繋ぐ
var connection = chromium.extension.connect();
//toolstripからのメッセージを受け取る準備をしておく
connection.onMessage.addListener(function(infos){
	if (infos.length) {
		infos.some(_autopager);
	} else {
		console.log(infos.date);
	}
});
//ページのURLをtoolstripに送る
connection.postMessage({url:location.href});

postMessageは基本的にJSONでやり取りすることになります。JSONシリアライズできないデータは受け渡しできないので注意が必要です。

APボタン

適当な感じのAPボタン…とりあえず、クリックするとSITEINFOを最新(といってもウチのサーバーにキャッシュしているファイルですが)にします。

予定では、もう少しちゃんとしたボタンにして、クリックした際は管理画面を開くようにしようと思っています。

ソース・ライセンス

AutoPagerizeとの互換性を保ちつつ、ソースは新たに*2書き直したので、ライセンスはMITあたりにしようと思っています。ソースをどこに置くか決めつつ考えます。まあ、GitHubかGoogle Codeの2択なんだけど。gitがいいけど、Google的にはMercurialなのかなと。

参考リンク

404 Not Found

Page not found - The Chromium Projects

*1:ただ、すでにオプション付きで起動していればすぐに動くようになります

*2:実際には、Twitter用AutoPagerize - os0x.blogがベース

hanabusahanabusa2009/06/03 19:08installしたextensionはchromeのアドレスバーに
chrome://extensions/
で、インスコ済みのextensionが表示されてuninsllボタンをクリックすれば再起動いらずでuninstallできますね

os0xos0x2009/06/03 19:23お、そうですね。
Dev版では Chrome 3.0.182.2 からuninstall機能が付きました。