2008-12-14

iGoogle サンドボックスは、ガジェットのソースコードによって環境を切り替えることで互換性を保っている!?



iGoogle サンドボックスは、ガジェットのソースコードの内容から、旧仕様のガジェットか、新仕様のガジェットかを判別して、それぞれ異なる環境で動作させるようです。

次のガジェットを iGoogle サンドボックスに追加しても、gadgets.util.* といった Gadgets API が取り込まれません。ガジェットをレンダリングする iframe の中身を確認すると、旧仕様のガジェット(現在の iGoogle)と同じ環境に見えます。

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="gadgets.util.registerOnLoadHandler">
</ModulePrefs>
<Content type="html"><![CDATA[
<script type="text/javascript">
_IG_RegisterOnloadHandler(function() {});
</script>
]]></Content>
</Module>

しかし、次のガジェットを iGoogle サンドボックスに追加すると、状況が一変し、gadgets.util.* といった Gadgets API が取り込まれます。ガジェットをレンダリングする iframe の中身を確認すると、新仕様のガジェット(Opensocial 系コンテナ)に近い環境になっているように見えます。

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="gadgets.util.registerOnLoadHandler">
</ModulePrefs>
<Content type="html"><![CDATA[
<script type="text/javascript">
gadgets.util.registerOnLoadHandler(function() {});
</script>
]]></Content>
</Module>

旧仕様と新仕様の切り替わる接点を調べてみましたが、Content 要素の内容が影響していました。次のとおり、Gadgets API を部分的 "gadgets.ut" に含めると、新仕様の環境に切り替わります。

<Content type="html"><![CDATA[
<script type="text/javascript">
//gadgets.ut
</script>

しかし、次のとおり、"gadgets.u" とすると、旧仕様の環境に切り替わります。

<Content type="html"><![CDATA[
<script type="text/javascript">
//gadgets.u
</script>

開発上の都合から、ガジェットのソースコードをすべて外部ファイルに追い出そうと試みたのですが、なぜか iGoogle サンドボックスだけ動作しなかったため、この事象に気がつきました。

iGoogle サンドボックスで Gadgets API を使うときは、Content 要素に Gadgets API を使ってるぞと判別できるような断片を含めておく必要があるみたいです。iGoogle は1つの環境で、新旧の互換性を確保するに至っていないということでしょうかね!?

0 件のコメント: