0

我正在尝试将附加组件从 chrome 移植到 firefox。附加组件将是现代风格(引导/ SDK),我正在使用附加组件生成器。

在内容脚本中,我试图用以下代码合成一个事件:

var evt = document.createEvent('MouseEvents');
evt.initMouseEvent('mousedown', true, true, window,
    1, 0, 0, 0, 0, false, false, false, false, 0, null);
element.dispatchEvent(evt);

我在调用以下内容时收到错误initMouseEvent

TypeError:值未实现接口 WindowProxy。

查看变量:

console.log("element:", ""+element);
console.log("document:", ""+document);
console.log("window:", ""+thewindow);

他们有奇怪的包装,但在下面是预期的类型。有什么想法可以让我成功吗?

element: [object XrayWrapper [object HTMLDivElement]]
document: [object XrayWrapper [object HTMLDocument]]
window: [object XrayWrapper [object Window]]
4

1 回答 1

0

解决方案是windowunsafeWindowdocument替换unsafeWindow.document

我以为有两种脚本,一种是存在于 中的后端脚本,一种lib是存在于data. 事实证明,虽然内容脚本可以修改您的页面,但它们实际上并没有注入到页面中。这不像您只是将脚本挂在页面源代码下方。Insead,内容脚本和页面脚本生活在稍微不同的环境中。unsafeWindowwindow来自实际页面的脚本。我相信这样做的原因是恶意页面可能会操纵它的方法window,从而改变你的内容脚本的行为。

我不知道是否有一种方法可以在不使用unsafeWindow的情况下模拟事件(页面可能会更改document.createEvent,然后呢?)。它可以在没有unsafeWindow. 如果有人指出如何正确地做到这一点,或者详细说明为什么可以使用unsafeWindow,我可以接受这个答案。

于 2013-07-09T13:14:09.183 回答