firebug in greasemonkey

XPCNativeWrapper通した時点でwindow以下のインスタンスはidlにあるやつかnativeのDOMlv0メソッド以外参照できなくなる(ref. XPCNativeWrapper - MDC)ので当然firefoxのconsoleとか呼べなくなるんだけどgreasemonkeyの中からconsole.logとか呼べる。

よく見たらsandboxに細工が。

greasemonkey.js

  injectScripts: function(scripts, url, unsafeContentWin, chromeWin) {
    var sandbox;
    var script;
    var logger;
    var console;
    var storage;
    var xmlhttpRequester;
    var safeWin = new XPCNativeWrapper(unsafeContentWin);
    var safeDoc = safeWin.document;

    // detect and grab reference to firebug console and context, if it exists
    var firebugConsole = this.getFirebugConsole(unsafeContentWin, chromeWin);

    for (var i = 0; script = scripts[i]; i++) {
      sandbox = new Components.utils.Sandbox(safeWin);

      logger = new GM_ScriptLogger(script);

      console = firebugConsole ? firebugConsole : new GM_console(script);

      storage = new GM_ScriptStorage(script);
      xmlhttpRequester = new GM_xmlhttpRequester(unsafeContentWin,
                                                 appSvc.hiddenDOMWindow);

chrome/non-chromeのセキュリティはほかにはない落とし穴があって難しい。getter/setterはまだ未チェック。