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/");