使用WebExtensions隐藏iframe Firefox插件

时间:2016-06-13 10:54:28

标签: iframe firefox-addon firefox-webextensions

我需要使用WebExtensions在Firefox插件中创建隐藏的iframe。

这就是我尝试做的事情(正如这里建议的那样:Load multiple pages in a hidden iframe from a xul-based firefox extension):

var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"].
                   getService(Components.interfaces.nsIAppShellService).
                   hiddenDOMWindow;

我收到错误" Components.classes未定义",似乎无法解决它。

帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

不要这样做。在WEAPI中,这甚至不可能,您无法在该范围内运行此类代码。

WEAPI

如果您正在使用webextensions,请使用背景页面,您不必担心这一点 - https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Anatomy_of_a_WebExtension#Background_scripts

自举

在引导程序中,您可以执行此操作,但不能执行此操作。在bootstrap中使用WEAPI使用的相同技术,这是自Firefox 23以来支持的无窗口浏览器 -

 var webnav = Services.appShell.createWindowlessBrowser(true);
 var docshell = webnav.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDocShell);
 var systemPrincipal = Cc["@mozilla.org/systemprincipal;1"].createInstance(Ci.nsIPrincipal);
 docshell.createAboutBlankContentViewer(systemPrincipal);
 var contentWindow = docshell.contentViewer.DOMDocument.defaultView;

 // when you are done with it, destroy it
 if (webnav.close) { webnav.close() }; // only available in Firefox 46+, and is needed for good measure
 webnav = null; // in Firefox <= 45 setting to null will cause it to get GC'ed which will destroy it

这是另一个例子,这就是webextenions如何使用上面的代码:

let chromeWebNav = Services.appShell.createWindowlessBrowser(true);
this.chromeWebNav = chromeWebNav;

let url;
if (this.page) {
  url = this.extension.baseURI.resolve(this.page);
} else {
  // TODO: Chrome uses "_generated_background_page.html" for this.
  url = this.extension.baseURI.resolve("_blank.html");
}

if (!this.extension.isExtensionURL(url)) {
  this.extension.manifestError("Background page must be a file within the extension");
  url = this.extension.baseURI.resolve("_blank.html");
}

let system = Services.scriptSecurityManager.getSystemPrincipal();

let chromeShell = chromeWebNav.QueryInterface(Ci.nsIInterfaceRequestor)
                              .getInterface(Ci.nsIDocShell);
chromeShell.createAboutBlankContentViewer(system);

let chromeDoc = chromeWebNav.document;
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
let browser = chromeDoc.createElementNS(XUL_NS, "browser");
browser.setAttribute("type", "content");
browser.setAttribute("disableglobalhistory", "true");
browser.setAttribute("webextension-view-type", "background");
chromeDoc.body.appendChild(browser);

let frameLoader = browser.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader;
let docShell = frameLoader.docShell;

let webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
this.webNav = webNav;

webNav.loadURI(url, 0, null, null, null);

let window = webNav.document.defaultView;
this.contentWindow = window;

https://dxr.mozilla.org/mozilla-central/source/toolkit/components/extensions/ext-backgroundPage.js#25-64