gadgets.rpc の仕組みを調べてみる。
<コンテナ側>
まず、gadgets.rpc.init()で、ブラウザがpostMessageを使えると、
gadgets.rpctx.wpm.init(processFn,readyFn)を呼んでいる。
wpm.init()では、まず自分のwindowに対してpostMessageを送信して、
postMessageが非同期に行われるかを確認する。
非同期に実行されない場合、ラップして非同期で行うようにしている。
postMessage = function(win, msg, origin) {
window.setTimeout(function() {
win.postMessage(msg, origin);
}, 0);
};
その後、windowのmessageイベントにwpm.onmessage()をバインドしている。
- wpm.onmessage()は、なにやらセキュリティのチェックも行えるらしいが、
- とりあえず、init()でセットしたrpc.process()を呼んでいる。
最後に、rpc.transportReady()を呼んでreturn;
- ready('..', true);で、initで設定されたreadyFn※(rpc.transportReady()をコール.
- receiverTx['..'] に gadgets.rpctx.wpm オブジェクトを設定している。
- なにやら、 earlyRpcQueue[]にrpcを設定しておくと、このタイミングでcallしてくれる。
gadgets側だと、setupReceiver('..'); して終わっている。
setupReceiverについては、またあとで。