模拟放置事件在 Chrome 扩展中有效,但在 Firefox 附加组件中无效?

Simulating drop event works in Chrome extension but not Firefox add-on?

我正在尝试在浏览器扩展的内容脚本中模拟放置事件(使用拖放 API)。本质上,我想模拟用户以编程方式删除图像。到目前为止我有这个:

const dataTransfer = new DataTransfer();
dataTransfer.items.add(file); // File object representing image being dropped
const event = new DragEvent('drop', { dataTransfer });
document.body.dispatchEvent(event);

当所有模拟都在浏览器中本地进行时,这在 Chrome 和 Firefox 上都非常有效。 This JSFiddle 在两种浏览器中效果都很好——如果您上传文件,系统会模拟掉落并且图像会显示在预览中。

问题是,当我尝试使用浏览器扩展完成完全相同的事情时,我 运行 遇到了 Firefox 中的问题(但不是 Chrome)。我已经将 demo extension 放在一起,它完成与 JSFiddle 相同的事情,但带有内容脚本。在 Chrome 上,扩展程序注入文件输入并完美模拟掉落(图像显示在 #preview 中):

可以看到(在徒手圈中)dataTransfer.files的长度为1——拖放的图片文件在列表中。但是当我在 Firefox 上使用完全相同的扩展时:

图像已上传(请参阅输入)但未被删除并显示在预览中。从控制台中,您可以看到 dataTransfer.files 在 Firefox 中是空的,即使 dataTransfer.items 中有文件!

为什么这里有差异?我检查了 Mozilla 的兼容性检查器,它说我的扩展已准备好跨平台。 By then HTML5 spec files 应该与 items 同步,AFAICT 没有任何条件保证 Firefox 上的列表为空。这可能是一个错误吗?

感谢 , the problem was due to Firefox's Xray vision 将内容脚本和页面脚本的全局对象(包括 File)分开的策略。通过展开页面的 DataTransfer 对象而不是内容脚本的对象,我能够模拟掉落:

const dataTransfer = new window.wrappedJSObject.DataTransfer();