ユーザースクリプト(0.9.2.5)
ユーザースクリプトは別ウィンドウで実行されます。
そちらの空間には対象タブのwindowをラップしたwindowと実際のdocument(現時点ではラップしてません)、またクロスドメイン対策なのかlocationにガードがかかっているため、ラップしたlocationが渡されています。
実際にはwindowオブジェクトは書き換わっておらず、unsafeWindowという変数に入っています。が、ユーザースクリプト内のwindowという文字列をunsafeWindowに置換して実行しています。
利点
- タブ側でスクリプトを切っていても実行される。
- これを改悪だと思われるかたがいらしたらご意見ください。
- セキュリティの向上
- この方式であれば別ドメイン宛のxmlhttpRequestは完全に安全だと思います。タブ側からは全く呼び出せません。*1
- prototype書き換え等で汚染の心配が無い。
- prototype.jsを使っているサイトなどとバッティングする心配がありません。
欠点
- 別空間なため、グローバルオブジェクトがタブ側のものと違う場合がある。
- window,document,locationは差し替えてありますが、他に問題があればお知らせください。document.locationは差し替えていないため、触ると「書き込みできません。」というエラーが出ます。困るようならご相談ください。
- ラップしたwindow等のオブジェクトのメソッドで省略可能な引数が省略できない。
- ざっと見た限りでは良く使われるもので省略するのはwindow.open()ぐらいだと思います。これもタブブラウザのユーザースクリプトではあまり使わないと思うので対処してません。
- ActiveXObject("Microsoft.XMLHTTP")が動かない。
- 別空間で実行している関係でクロスドメイン扱いになり、動かなくなります。GreaseMonkeyでXMLHttpRequestが使えなくなったのと同様GM_xmlhttpRequestを使えば問題ありません。(追記:2006/10/11)
仕様
- 本来IEコンポーネント系では存在しないグローバル変数
- unsafeWindow
- unsafeWindowはGreaseMonkeyと違い、windowと同等ですので意識して直接使わなくて結構です。普通にwindowを使っていただければ内部でunsafeWindowに強制的に置換されます。
- unsafeWindow
- 本来IEコンポーネント系では存在しないメソッド
- object.addEventListner()およびobject.removeEventListener()
- GM_xmlhttpRequest(),GM_getValue(),GM_setValue(),GM_log()
- prototype書き換え
- Array.prototype
- forEach,map,filter,indexOf,lastIndexOf,every,someを拡張しています。
- Array.prototype
その他Tips
@include * であってもローカルファイル、about:blankでは実行されません。
eventオブジェクトはちょっと内部事情でそのまま使えないのでスクリプトを置換しています。event → unsafeWindow._event。