2010-04-01 83 views
1

我想在我的Firefox扩展中运行带有内容特权的托管脚本。为此,我在隐藏窗口中创建了一个内容iframe,该窗口指向一个拉取脚本的html文件。该脚本需要“历史记录”可用,但由于某些原因,在隐藏窗口中创建的内嵌框架没有历史记录。Firefox中的iFrame隐藏窗口与contentWindow.history?

Chromebug报告本作的iframe的contentWindow.history:

object does not support history (nsIDOMHistory)

和脚本给出了这样的错误,当其不可用:

Error: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMHistory.length]

任何想法?

回答

0

A <浏览器类型=“内容”>默认会自动连线会话历史记录,而iframe type =“content”>不会,但您可以随时手动连线。

不要忘记确保您的元素是在XUL命名空间中创建的。我相信隐藏的窗口是关于:空白的HTML文档,除了在Mac上。

+0

我试过这个结果相同。这里是我使用的代码,其中doc是隐藏窗口的文档。 (浏览器) var browser = doc.createElementNS(XUL_NS_URI,'browser') browser.setAttribute('type','content'); browser.setAttribute('disablehistory',false); browser.setAttribute('src',url); doc.documentElement.appendChild(browser); – Jon 2010-04-13 19:31:48

+0

我似乎有一个历史对象附加到xul浏览器,但每次尝试使用.back()或go(-1)时都会引发异常。你有什么想法可能导致它? – webwise 2011-05-03 13:14:04

1

事实证明,隐藏窗口的URL曾经是:空白的,但这显然是一个安全漏洞,所以它现在是资源://gre/res/hiddenWindow.html(或资源:// gre- resources/hiddenWindow.html),因此它不具有XUL浏览器元素所需的chrome权限,以便能够连接其自己的会话历史记录,甚至可以访问其自己的内容文档。

即使使用XUL iframe元素,您也必须小心,因为它的任何属性都不起作用,因为它在没有chrome特权的情况下运行。所以你必须做类似iframeElement.boxObject.QueryInterface(Components.interfaces.nsIContainerBoxObject).docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindow)的东西来检索它的内容窗口。

+0

试图编辑我的文章的更新,但当我尝试时,堆栈溢出错误。你对隐藏的窗口是正确的。我的扩展在隐藏窗口中有一个chrome iframe(用作单例js上下文)。我可以在那里嵌入浏览器并手动连接sessionHistory。有用!谢谢。 – Jon 2010-04-14 03:07:51