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はまだ未チェック。