Google GearsとGreasemonkeyをセットにして使うことをGearsMonkeyと名付けて紹介されているのをはてなブックマーク - miyagawaのブックマーク / 2007年11月22日で知りました。
Google Gearsの持っている機能をGreasemonkeyからも呼び出せるところを利用して、どんなウェブページでも(自分でコードを書けば)オフライン機能をくっつけることができたりするようになるわけです!というわけで、なにか作ってみようと思っていじったら思わぬところではまって進まず(MMgcに続いてまた)何もできあがらなかったため、以下はまりどころについてだけですが書いておきます...
ひとつめのLocalServerは触っていませんがURLをキーにしてリソースをキャッシュしておいたりする機能を提供しているようです。
ふたつめのDataBaseはsqliteがjavascriptから呼べるようになっていて、FirefoxのmozIStorageService - MDCとおなじようにローカルにデータベースを構築、操作することができます。
今回はみっつめのWorkerPoolではまりました。
これはjavascriptにスレッドを提供するものですが、スレッドと聞いてふつうイメージするようなものとは大きく違っています。そしてなんか不安定です。
まずWorkerPool Module API - Google Gears API - Google Codeを見ると、ワーカを作るAPIはint createWorker(scriptText)になっていてscriptTextには関数オブジェクトではなく、文字列としてjavascriptのコードを渡すことになっています。これは文字列であれば単純なCのポインタとして渡すことができてjavascriptのオブジェクトをスレッド間で参照するのはNGという制約をクリアできるからです。
workerFuncとすると
var workerFunc = function () {
var n = 0;
google.gears.workerPool.onmessage = function(messageText,senderId,message) {
switch( messageText ) {
case: .....
case: .....
}
}
var workerID = unsafeWindow.google.gears.workerPool.createWorker(
"(" + workerFunc.toString() + ")" + "( )"
);
というかんじで新しくワーカをつくることができます。
ワーカの中からは、一切DOMに触れることができません。ワーカからアクセスできるのはjavascriptのコアが持っているDateやArrayのようなオブジェクトとGoogle Gearsの持っている機能だけで、ウインドウの中を直接参照したりすることはできません。メインのウインドウとワーカとの間で値のやり取りをしたいときは
sendMessageは、メインのスレッドから生成したワーカに対して文字列を送信することができます。createWorkerの戻り値でメッセージを送りたいワーカを指定して送ります。
unsafeWindow.google.gears.workerPool.sendMessage(String("increment"), workerID);
ワーカの側で送られてきたメッセージを受け取るには
google.gears.workerPool.onmessage
に関数をいれておけばokです。ワーカの側からメインのスレッド側にデータを送りたいときも同様にsendMessageを使います。
が、ワーカの中からsendMessageを呼ぶところが不安定なようで、いっときは動いていたのにこの記事を書き始めたらFirefoxごと落ちてしまうようになってしまいました(OSX Firefox 2.0.0.9+Google Gears 0.2.4.0)... サンプルとしてResources and Tools - Google Gears API - Google Codeで公開されているコードのsample/primeを参考にして同じように書いて、やっと動くようになって、よーしと書き始めたんですけど...

ソースコードはgoogle-gears - Google Codeで公開されていて、配布されているバイナリもシンボル情報が含まれているので、すぐに原因を調べたりも(能力次第で)できたりします。
window.google.gears.factory.create('beta.workerpool', '1.1');
するところでバージョン指定をひとつ下げて1.0にしないとFailed to create requested object.と言われてワーカープールを作ることができませんでした。動かなくなっちゃったのてちょっと再試できてないのですが1.0だとワーカからsendMessageしてもメインのスレッドが反応してくれなかった気がします(Windows Firefox 2.0.0.9+Google Gears 0.1.54.0)。
"Gearsのワーカープールは気難しいところがあります"ぐらいのことしか書けずちっともGearsMonkeyの話になっていなくてごめんなさい。次回きちんとどうしたら落ちる/落ちないのかを押さえた上でGearsMonkeyでなにか作ってみたいと思います...
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/180
comments