IHTMLWindow2にSleipnirScriptのインターフェースオブジェクトを渡す

SaveTextAreaやポップアップ辞書で利用している小技の話。SaveTextArea作ってた頃のmixiの日記読んでる人はわかってると思うけど正直やってる本人が何やってるか良くわかってないので説明するは気が進まないのだけど、解説、というか現時点での認識を書き散らしてみる。何らかの参考になれば幸い。
あれらのスクリプトでは、IHTMLWindow2*1にデータベースオブジェクトインタフェース(IDatabase)を渡してページ内のスクリプト要素からsqliteのデータベースにアクセスできるようにしている。これによってページ内でイベントが起きた時にデータベースを使ってごにょごにょしたりできる、というわけ。
ではIHTMLWindow2に渡せるのはIDatabaseだけかというと、少なくてもIAPIと、mixiの日記で経緯を書いたようにISleipnirを付加できることを確認している。恐らくインターフェースオブジェクトであればどれも渡せると思う。Sleipnir2スレを見てあれ?と思ったので確認すると、SeaHorseで単に_window.sleipnir = sleipnirってしても使えない事が確かにあった。この場合はこうすれば良い。

_window.sleipnir = sleipnir;
sleipnir.Status = "Windowオブジェクトにsleipnirオブジェクトを渡しました";
_window.unload = "window.sleipnir = null";

IDatabaseやgriffin-stewieの日記 - SleipnirのSeaHorseでドメイン越えでやっているようなIUnknownの引渡しは問題ないことから考えるに_window.sleipnir = sleipnirだけではISleinirオブジェクトのインスタンスの生成が行われないからだと思ってる。だから組み込みスクリプト内でインスタンスの生成が必要なことをやってやれば組み込みスクリプト終了後もISleipnirオブジェクトにアクセスできる。うちではcachepodとかが動いてるせいか、UserActionでなら上記みたいなことせんでも単に_window.sleipnir = sleipnirってやるだけで渡せてるし、SeaHorseでもうまくいったりするから真相はわからんけど。
ISleipnirを渡せる以上、他のインターフェースオブジェクトを渡せる意味が薄い*2ように思うかも知れないが、IHTMLWindow2に渡したオブジェクトはページ内のスクリプトからもアクセスできるので、ISleipnirを渡してしまうとmixiで漏らしたように割と洒落にならないセキュリティホールが出来てしまう。母集団が少な過ぎるのでわざわざ狙ったりはされないと思うけど、少なくてもスクリプト書きはそのようなスクリプトを導入することによってセキュリティホール発生しうるということは把握しておいた方が良いように思う。

*1:_windowとかwindowとかのこと

*2:他のインターフェースオブジェクトは全てISleipnirから辿れるので