【问题标题】:Are events generated by Firefox extension 'trusted'?Firefox 扩展生成的事件是否“可信”?
【发布时间】:2012-07-12 16:49:40
【问题描述】:

我的 Firefox 扩展程序会生成事件,例如点击。作为响应,Web 应用程序尝试打开一个新窗口。但是,当弹出窗口阻止程序启动时,它会被 Firefox 阻止。但是,如果我手动单击一个按钮并在网络应用程序尝试打开窗口时响应该按钮,它就会通过。

我的问题是为什么我的扩展程序生成的事件不被视为“受信任”,并且在用户点击时以同样的方式处理?是否有一些后门来实现这种行为?

【问题讨论】:

    标签: firefox firefox-addon dom-events


    【解决方案1】:

    编辑:这个答案已经过时了。它指的是自 Firefox 57 起不再支持的经典扩展。基于 Web 扩展 API 的扩展有 no way of generating trusted events

    是的,扩展程序生成的事件始终是可信的。这意味着 event.isTrusted 将是 true 并且事件将能够触发需要受信任事件的操作(例如 Ctrl-Tab keypress 事件以切换浏览器选项卡)。但是,它们仍然是合成事件,这意味着没有与它们关联的本机(操作系统级别)事件。而且由于弹出窗口拦截器适用于原生事件,它不会看到您的扩展程序生成的事件。

    您可以使用nsIDOMWindowUtils.sendMouseEventToWindow() 代替document.createEvent()。此方法用于测试,也将生成本机事件。这对于弹出窗口拦截器应该已经足够了。

    var utils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                      .getInterface(Components.interfaces.nsIDOMWindowUtils);
    utils.sendMouseEventToWindow("click", 10, 20, 0, 1, 0);
    

    【讨论】:

    • 非常感谢弗拉基米尔。这正是我一直在寻找的。有什么理由不将它用于所有事件创建?有没有性能方面的缺点?
    • 根本做不到,语义不同。 sendMouseEvent 将本机事件添加到通常的事件处理中,浏览器将确定如何处理它(特别是在哪里分派 DOM 事件)。使用createEvent,您可以控制在何处分派事件并跳过所有本机事件处理。
    • “是的,由扩展程序生成的事件总是受信任的。” - 你能扩展一下吗?我正在尝试做到这一点,使用我的扩展内容脚本内部的 document.createEvent() ,但 isTrusted 是错误的。我很想知道是否有特定的方法或标准,例如需要签署扩展名或其他任何内容。
    • @alandarev:附加 SDK 及其内容脚本是另一种野兽,它们以网站的权限运行,因此无法创建可信事件。
    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多