Jetpackからブラウザへのアクセス、特権を得る

ややこしいから並べてみた。抜けがあるかも。

function log(m) {console.log(m)}

const Cc = Components.classes;
const Ci = Components.interfaces;
var chromeWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
                   .getService(Ci.nsIWindowMediator)
                   .getMostRecentWindow("navigator:browser");

// about:jetpackにて実体調査
log(chromeWindow)                                          // Window browser.xul *
log(chromeWindow.window)                                   // Window browser.xul *
log(chromeWindow.document)                                 // Document browser.xul
log(chromeWindow.content.document)                         // Document about:jetpack
log(chromeWindow.gBrowser.contentWindow)                   // Window about:jetpack
log(chromeWindow.gBrowser.contentDocument)                 // Document about:jetpack
log(chromeWindow.gBrowser.selectedBrowser.contentWindow)   // Window about:jetpack
log(chromeWindow.gBrowser.selectedBrowser.contentDocument) // Document about:jetpack
log(jetpack.tabs.focused.contentWindow)                    // Window about:jetpack
log(jetpack.tabs.focused.contentDocument)                  // Document about:jetpack
log(jetpack.tabs.focused.raw)                              // tab.tabbrowser-tab
log(jetpack.tabs.focused.raw.ownerDocument)                // Document browser.xul
log(jetpack.tabs.focused.raw.ownerDocument.defaultView)    // Window browser.xul *
log(jetpack.tabs.focused.raw.contentWindow)                // undefined
log(jetpack.tabs.focused.raw.contentDocument)              // undefined
log(jetpack.tabs.focused.ownerDocument)                    // undefined
log(jetpack.tabs.focused.contentWindow.defaultView)        // undefined


Window browser.xul のものはXPConnect特権でコードが実行できる。JetpackAPIから操作できない事が出来たり、Firefox本体や拡張と同じように振る舞える。

簡単に特権コードを試してみるには、アドレスバーにchrome://browser/content/browser.xulと打ち込んでFirebugコンソールに以下のコードを入れて実行する。(windowは無くてもいい)
window.gBrowser.addTab("http://www.google.com/");

同じことをJetpackから行うには、

const Cc = Components.classes;
const Ci = Components.interfaces;
var chromeWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
                   .getService(Ci.nsIWindowMediator)
                   .getMostRecentWindow("navigator:browser");
chromeWindow.gBrowser.addTab("http://www.google.com/");