先日、ブックマークレットとおんなじくらいお手軽にFirefoxで開いているページの中身をスクリプトに渡して処理したりできないかなーと思って Browse Web and Developer Tools :: Firefox Add-ons を見ていたらFirefoxの拡張機能を作るときに少し役に立ちそうなものを発見しました。
Execute JS という名前のextensionで、説明に# Execute arbitrary (multiline) JavaScript Code in every window you like.と書かれているとおり入力したjavascriptのコードを実行してくれるものです。
# Evaluting the properties of an object.
# Modifying functions on the fly i.e. you can search for functions, load and edit them and eventually save the modified function.

Components.classes にアクセスできてXPCOMオブジェクトを操作できるところです。
XPCOMをつかうと何でもできますが、とりあえず Execute JS から cmd.exe を実行してみましょう。ローカルファイルの実行方法は Code snippets:Running applications - MDC にあるのでこれをまねして書きます。
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("c:\\windows\\system32\\cmd.exe");
var process = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = [];
process.run(false, args, args.length);
を実行するコードとして入力して実行すると
cmd.exeが起動します。
Firebugのコンソールでは Components.classes にアクセスできないのでextensionのコードスニペットを見てためしにちょっと動かしてみたい、というときには使えませんが Execute JS ならComponents.classesにアクセスできるので便利じゃないでしょうか。
Components.classesにアクセスできたりアクセスできなかったりするのの差はどこでできるのかも調べてみましたが、けっきょくはっきりとはわかりませんでした。
Execlute JS は渡されたコードを指定されたウインドウを getWindowForResource で取得したオブジェクトのevalメソッドでjavascriptのコードを実行しています。それに対してFirebugは渡されたコードがextensionのコンテキストで実行されることを避けるためか、最終的に
function injectScript(script, win)
{
win.location = "javascript: " + script;
}
というコードで渡されたスクリプトを実行していました。
正確なところはわかりませんがevalしないでlocationにjavascript:で代入することで実行コンテキストをextensionから切り離して、ふつうのウインドウのコンテキストで実行させることができるようです。
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/148
comments