m2O

2007/03/15 (木)

data スキームで Eolas 特許越え

|  data スキームで Eolas 特許越え - m2O を含むブックマーク

ここ数日はびっくりしっぱなし。
embed 要素や object 要素を、HTML 内にタグをそのまま書いたり HTML 内のスクリプト(以下、内部スクリプト)で生成することには該当して、script 要素で外部から参照したスクリプト(以下、外部スクリプト)で生成するのは該当しない特許と言うものがあるようです。わけがわかりません*1

その特許に当たらないように Opera9 と WindowsXP SP2 の IE では、HTML に直接書かれた embed(object)タグflash なんかは一度クリックしないとイベントを受け付けないようです。以下の画像は Opera9 で flashマウスを乗っけた場合。

f:id:miya2000:20070315174407p:image

「このコントロールを使用する場合はクリックして下さい。」というツールチップが表示されます。

user.js内部スクリプトと解釈されるようで、先日の「flash 上でマウスジェスチャー…」で生成された flash にもツールチップが表示されます。
まあクリックすればいいだけの事なので気にしなくてもいいんですが、「あのuser.js入れたらおかしくなった」なんて言われるのは癪なので何とかしてみました。タイトルにあるように data スキームを使います。

    // for Eolas patent.
    var bak_rep=window.___rep;
    var scr=document.createElement('script');
    scr.src='data:text/javascript,window.___rep=function(p,x,y){p.replaceChild(x,y)}';
    document.body.appendChild(scr);
    /* (略)ここで embed 要素をDOMツリーに加える */
    // cleanup Eolas.
    window.___rep=bak_rep;
    document.body.removeChild(scr);

user.js ではグローバルな領域を汚さないようにするのは基本なんですが、外部スクリプトを使う場合は仕方ありません。元々のページのスクリプトと名前が被っても問題ないようにバックアップをとって最後に戻しています。
外部化するのはDOMツリーに変化を与える個所だけでいいみたいで、ここでは replaceChild だけど appendChild とか innerHTML でもOKなはずです。残念ながら evalダメでした。

あと Opera は問題なく動いたけど Firefox では data スキームでグローバル function を宣言することができませんでした。よくわからないけど Firefox には不要な処理なので良しとしときます。

--

Firefox(GreaseMonkey)では unsafeWindow というのを使うみたいです。試してないけどそれでいけるんじゃないでしょうか?

*1:あまり興味がないので詳細までは調べてません。なので以後の文章が正確でないかもしれません。間違いがあればご指摘ください