我正在尝试将chrome中的加载项移植到firefox。附加组件将是现代风格(bootstrapped / 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:Value没有实现接口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]]
答案 0 :(得分:0)
解决方案是将window
替换为unsafeWindow
,将document
替换为unsafeWindow.document
。
我认为有两种脚本,lib
中的后端脚本和data
中的内容脚本。事实证明,虽然内容脚本可以修改您的页面,但它们实际不会注入页面。这并不是说你只是将脚本挂在页面的源代码下面。 Insead,内容脚本和页面脚本生活在略有不同的上下文中。 unsafeWindow
是实际网页脚本中的window
。我相信这是因为恶意页面可能会操纵它的window
方法,从而改变内容脚本的行为。
我不知道是否有办法在不使用unsafeWindow
的情况下模拟事件(页面可能会更改document.createEvent
,然后呢?)。它适用于没有unsafeWindow
的Chrome。如果有人指出如何正确地做到这一点,或者详细阐述为什么可以使用unsafeWindow
,我可以接受这个答案。