普段GreatNewsというRSSリーダーを使っている。動作は軽快だしあまり不満はないのだが、内蔵のタブブラウザの機能がおまけ程度の機能しかないのでちょっと不満に思っていた。
んで、いままではリンクURLをコピーしてFirefoxに貼り付けていたのだが、読みたい記事がたまってくるとそれも面倒になってきた。要するに「Firefoxで開く」というメニューが欲しくなったのだ。
たぶんその手の右クリック拡張あるだろうなーと思って探していたら「そんなん、自分で作れ。」とばかりにR-Click! Union 拡張メニュースクリプトの作り方が見つかったので自作することに。
具体的な方法は先のリンク先を見てもらえばわかるので割愛するが、あとはメニューから呼び出されたときに
<-- もう消しちゃったスクリプトだから動くかわかんないや。 たぶん平気だけど。--> <script language="JScript"> with( external.menuArguments ) { new ActiveXObject("WScript.Shell").Run( event.srcElement.href ); } </script>メニューはリンク上での右クリック時のみに設定してあるため、このように非常にシンプルだ。(実はそうでもなかったが)
ところが考えてみれば当たり前で、このスクリプトではセキュリティ警告がでてしまう。はて。
他にレジストリ登録されている拡張メニューを見たところ、昔インストールした「紙 2001」(紙copiの前身)の取り込みメニューが登録されており、そちらを参考にさせてもらったところVBScriptでCreateObjectしていた。
半信半疑で先のスクリプトをVBSで書き直そうと思ったが、ずいぶんとVBS書いてなかったのと、ものすげー冗長になるのが目に見えていたのでWScript.Shellを取得する部分のみおそるおそるVBSに置き換えた次のようなスクリプトを書いてみた。
<-- もう消しちゃったスクリプトだから動くかわかんないや。 たぶん平気だけど。--> <scritp language="VBScript"> Function GetShellObject() Set GetShellObject = CreateObject("WScript.Shell") End Function </script> <script language="JScript"> with( external.menuArguments ) { GetShellObject().Run( event.srcElement.href ); } </script>うまくいくじゃん!!...なんだか納得いかんけど。
まあ不恰好だがよいか、と思ってちょろちょろとテストしていたら、imgなリンクの時にはメニューが表示されないことに気がついた。場当たり的にレジストリのcontextsの値に画像時のフラグも加えたが、今度はevent.srcElementがimgになるので当然リンク先が取得できない。ああ、探索する必要があるのね、ふぅ。
で、再帰で要素をバブリング探索するように書き換えてついでになにを思ったか未練たらしくVBS廃止→new ActiveXの復活をして以下のようなコードにした。
<script language="JavaScript"> with( external.menuArguments ) { ( function(ele) { if( /^a$/i.test( ele.tagName ) ) { new ActiveXObject("WScript.Shell").Run( ele.href ); } else { if( ele.parentElement ) arguments.callee( ele.parentElement ); } } )( event.srcElement ) } </script>なぜか警告がでなくなった。はれ?
警告でないじゃん、と思ったのはつかの間、これimgなリンクだと大丈夫で、普通のリンクだと怒られるという不可思議な現象になっていた。え、ひょっとしてコールスタックの数で挙動に違いが?本当か??
セコメントをする