Javascript Firefox扩展优先级

Javascript Firefox扩展优先级,javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,众所周知,Firefox没有扩展权限机制。所以没有人知道(包括Firefox)扩展实际上在做什么,它可以做它想做的一切(当然是在api中) 问题是关于优先权。假设用户安装了几个新的选项卡扩展。他重启Firefox,什么新标签可以使用? 我在想办法 Firefox数据存储在C:\Users\UserName\AppData\Roaming\Mozilla\Firefox\Profiles\Whatever中。默认值,还有扩展名目录,其中实际包含扩展名数据。有关所有已安装扩展的一些数据存储在addo

众所周知,Firefox没有扩展权限机制。所以没有人知道(包括Firefox)扩展实际上在做什么,它可以做它想做的一切(当然是在api中)

问题是关于优先权。假设用户安装了几个新的选项卡扩展。他重启Firefox,什么新标签可以使用? 我在想办法

Firefox数据存储在
C:\Users\UserName\AppData\Roaming\Mozilla\Firefox\Profiles\Whatever中。默认值
,还有
扩展名
目录,其中实际包含扩展名数据。有关所有已安装扩展的一些数据存储在
addons.json
extensions.json

首先,安装顺序不起任何作用。以前安装的扩展可以“击败”以后安装的扩展。反之亦然

我还尝试启用/禁用扩展名,查看上次更改的文件并比较它们。没什么用。仅布尔标志,该扩展是启用或禁用的,并且由用户启用或禁用

我还试图更改
addons.json
extensions.json
中的扩展顺序,但这似乎不会影响任何事情


大多数使用“低api”的扩展对新选项卡使用类似的代码:

var newtab = {
    init: function ()
    {
        gBrowser.addEventListener("NewTab", newtab.opentab, false);
    },

    opentab: function (aEvent)
    {
        // action here
    }
}

window.addEventListener( "load", newtab.init, false);

一些参考资料:


那么,您认为Firefox的扩展优先级是如何工作的呢?

是否所有扩展都接收事件(新选项卡已打开–低级api中的gBrowser“NewTab”事件、sdk/tabs中的onLoad/onReady/onActivate和其他)?Firefox如何决定处理谁的回调?或者Firefox正在处理所有回调并显示最后一个回调的结果?如果这是真的,我想不同的扩展之间会有竞争,有时会有不同的新标签。但总有一个新的标签扩展正在工作

如果您有任何想法,我将不胜感激。

没有可靠、明显的“秩序”。这取决于很多因素:

  • 初始化顺序取决于加载项管理器在加载项类型内部存储已安装扩展的顺序(无重启加载项在非无重启加载项的另一点启动)
  • 附加组件本身的操作顺序/时间。附加组件是否会立即修改某些内容?暂停之后?看了窗户之后?在其他一些异步API回调之后(例如,从加载项管理器查询自己的元数据之后)
  • 已注册事件的顺序和位置
  • 在大多数“API”中,后面的加载项会覆盖前面的加载项
  • 在其他API中,例如DOM API,第一个附加组件可能会获胜(例如,通过取消DOM事件的传播)
因此,基本上没有一个插件作者能够真正、可靠地影响对她有利的事情的可靠方式(太多的实现细节在起作用)

而加载项试图修改有限的资源(例如,新的标签页,这实际上是一个简单的首选项;只能有一个),将基本上相互争斗

解决方案 但是,在大多数情况下,加载项可能会检测到发生了什么事情(例如,检测到newtab页面已被覆盖,或稍后再次被覆盖),并告诉用户另一个加载项可能存在问题。 (“亲爱的朋友,我们检测到您已经有了一个新的选项卡加载项;请禁用另一个加载项以使NewTabX正常工作。”)

问题 对于许多附加组件来说,这并不是一个真正的问题,因为它们的资源有限,或者Firefox中有明确的方式供用户选择要使用的扩展(例如,当两个附加组件为同一网页链接添加上下文菜单时,用户只会看到两个可供选择的项目;“在ABC附加模块中下载”;“在XYZ附加模块中下载”)

当然,当有一个真正有限的资源时,比如只有一个newtab页面,那么最好不要安装多个newtab页面附加组件,否则事情可能会变得疯狂

子问题 是否所有扩展都接收事件(新选项卡已打开–低级api中的gBrowser“NewTab”事件、sdk/tabs中的onLoad/onReady/onActivate和其他)

使用通常的
addEventListener
stuff和sdkapi:Yupp。如果有两个东西覆盖了浏览器DOM中相同的
onxzy=
元素属性,那么当然不是;后者覆盖成功

Firefox如何决定处理谁的回调

正常的
addEventListener
按照DOM规范的顺序,或者非DOM API使用的任何东西(FIFO、LIFO)

或者Firefox正在处理所有回调并显示最后一个回调的结果

如果多个加载项通过回调修改同一内容,则最后一个加载项将获胜。但是,通常情况下,加载项在对同一事件作出反应时会做不同的事情(例如,在“加载”选项卡上,Greasemonkey可能加载用户脚本,Adblock Plus将阻止某些元素,Linkify将Linkify文本链接,等等)

这也是所有事件都必须处理的原因,Firefox不能也不会简单地选择某个事件而忽略其他事件

如果这是真的,我想在不同的扩展之间会有竞争,有时会有不同的新标签。但总有一个新的标签扩展在工作

是的

与其他浏览器的扩展系统进行比较。 大多数情况下,其他浏览器的工作原理与Firefox基本相同。有些内部顺序不一定是一成不变或显而易见的,DOM事件(在网站中)将被发送到多个附加组件,多个附加组件可以将侦听器添加到其他内容(例如,
chrome.downloads.onCreated.addListener()
)以及最新/第一个附加组件,具体取决于API

结论 所有试图“拥有”有限资源的扩展都可能与其他试图“拥有”有限资源的加载项发生冲突。E