[[OpenSocial/gadgets]]
[[OpenSocial/gadgets/UserPref]]
状態の保存
http://code.google.com/intl/ja/apis/gadgets/docs/fundamentals.html#SetPrefs
リンク先に書いてあるように、データをJS内からセットして保存する場合に使用する。
<Require feature="setprefs" />
を記述し、JS内部で
prefs.set()
が実行されると、visibility:hiddenのiframeが作成され、
srcとしてrpc_relay.htmlが読み込まれる。
setされるデータはrpc_relay.html# 以降にエスケープされて追加される。
rpc_relay.htmlの中はスクリプトが記述されており、
location.hrefの#以降を解析して配列に格納する。
そして、その配列を引数としてparent.parentのgadgets.rpc.receive()を実行する。
gadgets.rpc.receive()の実体は
function (fragment) {if (fragment.length > 4) {process(gadgets.json.parse(decodeURIComponent(fragment[fragment.length - 1])));}}
以下の関数ががどのような動作をするのか調べる必要がある。
-gadgets.json.parse
-decodeURIComponent
-process
iGoogle内に設置した場合は
iGoogle -> gadgetのiframe -> prefs.setが作成したiframe
という構造になるので、prefs.setが作成したiframeにとってのparent.parentはiGoogleになる。
親が存在しない場合はparentは自分自身(windowオブジェクト)を返すので、
iframeを介さずshindigから直接ifr?url=で表示している場合にはparent.parentは自分自身を差すことになる。
リンク先のサンプルをiGoogleSandboxで実行したところ、counterの値が保存され、
再読み込み時にはgadgetのiframeのsrcにクエリーストリングup_counter= で保存された値がセットされていた。
おそらくトークンかセッションでiGoogle内に個人の値を保存しているのだろう。
ローカルのapacheに設置したshindigでこの値を保存する場合にはどうすればいいのか調べる必要がある。
表示する際にも、up_ を使って初期値の変更を行うために単純にgadgetのiframeを表示すればいいというわけではなく、保存された値を取得してからgadgetのiframeを表示するように作らねばならないようだ。
(orkutは直接gadgetのiframeをソースに記述しているようだが、iGoogleSandboxではiframeの作成はiGoogle内のJSで行っているようだ)
ソースを読んだが、iframeを作って通信するのはgadgets.rpcの設定によるようだ。
デフォルトの通信がiframeを使うifpc。
他にdpmとwpmという設定値があった。
dpmとwpmはHTML5のdraftによる規格らしい。
tag: [[OpenSocial>tag/OpenSocial]]