Hatena::Grouporera

もし高校野球の女子マネージャーがOpera Browserを使ったら

logo
 | 

2010-06-15

Opera 10.6 の Workers 関連

13:36

昨日の Snapshot で待望の Web Workers が入った Opera 10.6 だけど、色々試して分かったことをつらつらと。

  • Web Workers/Cross-Document Messaging の仕様はほぼ全部実装されてる。
    • structured cloning という、postMessage にオブジェクトを渡せる機能は当然実装済み。
    • Worker の中で Worker も使える。(delegation)
    • SharedWorker も使える。
    • 同じ Snapshot で実装された Offline Web Applications に書いてあるように、SharedWorker 内に applicationCache がある。
      • ここらへんはちゃんと調べてないので割愛。
    • WorkerGlobalContext に console オブジェクトがあるので Worker in Worker 内のデバッグも簡単にできる。
      • Dragonfly ではなくて Error Console を使えば、事前にデバッグコンテクストを指定することなくログが見えるので、他のブラウザには無い Opera のアドバンテージになっている。
    • さらに、Opera は data: URI の Worker も使うことができる。
      • これは他のブラウザでは禁止されてる (仕様では Origin が同一でないとだめ。data: URI はスキームが違うので同じ Origin ではない) けど、Opera 的には OK だ、と WHATWG で読んだとがある。
      • Error Console を開いて↓をブックマークレットとしてお使いください。
javascript:
var w = new Worker('data:application/javascript,onmessage=function(e){console.log(e.data); postMessage("world")}');
w.onmessage = function(e) {
  console.log(e.data);
};
w.postMessage('hello');
    • MessageChannel もある。
    • MessagePort コンストラクターが使えるようになってるけど、これは単体で使えても意味がないので、Chromium みたいに例外出すようにしておくべきなんじゃないかな。

Opera Hacks!

前までも postMessage を使って iframe と通信してクロスドメインリクエストを投げたりすることができたんだけど、window.postMessage を使ってしまうとページ側のスクリプトを邪魔してしまいかねなかった。

10.6 からは、MessageChannel を使って iframe 内と秘密の通信が出来るようになる。最初に iframe との通信を確立するところだけ window.postMessage を使うことになるんだけど、例えば opera.addEventListener('BeforeEvent.message', ..) を使って完全に秘密にすることもできる (はず)。


SharedWorker で他のタブと通信することもできるようになるはず。つまり、

  1. UserJS で iframe を開いて、iframe.src を http://0.0.0.0/ とかにする
  2. http://0.0.0.0/ は存在しないので、エラーページが開く
  3. そのエラーページで UserJS が動くので、SharedWorker('data:...') として SharedWorker を作る
  4. http://0.0.0.0/ で MessageChannel を作り、一つを親ウィンドウに、もう一つを SharedWorker に送る

という感じ。これをすべてのタブでやるようにすると、SharedWorker が Chrome Extension でいう Background Page になる。ちょっと試した限りいけそうな感じ。


残念なのが、Opera Unite から Workers/SharedWorkers が使えないようになっていたこと。Workers を使ってこういうことができると思ったんだけど…

トラックバック - http://orera.g.hatena.ne.jp/edvakf/20100615
 |