Firefox扩展优先级

时间:2014-07-01 15:34:16

标签: javascript firefox firefox-addon firefox-addon-sdk

众所周知,Firefox没有扩展权限机制。所以没有人知道(包括Firefox)实际做什么扩展,它可以做任何它想要的(当然在api内)。

问题是关于扩展优先级。想象一下,用户安装了几个新标签扩展。他重启Firefox,新标签会起作用吗? 我试图搞清楚。

Firefox数据存储在C:\Users\UserName\AppData\Roaming\Mozilla\Firefox\Profiles\Whatever.default中,还有extensions目录,其中实际包含扩展数据。有关所有已安装扩展程序的部分数据存储在addons.jsonextensions.json

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

此外,我尝试启用/禁用扩展,查看上次更改的文件并进行比较。什么都没用。只需布尔标志,即启用或禁用该扩展,并由用户启用或禁用。

此外,我尝试更改addons.jsonextensions.json中的扩展程序顺序,但似乎它可能不会影响任何内容。


大多数扩展,使用"低api"对新标签使用类似的代码:

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

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

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

一些参考文献:

Firefox documentation. On page load. "Low" api style

Firefox documentation. sdk/tabs module. "High" api style


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

所有扩展程序接收事件(新标签页打开 - gBrowser" NewTab"低级别API中的事件,sdk / tabs中的onLoad / onReady / onActivate等)?以及Firefox如何决定处理哪些回调?或Firefox处理所有回调并显示最后一个的结果?如果这是真的,我认为不同的扩展之间存在竞争,有时会有不同的新标签。但总有稳定一个新的标签扩展正在运行。

会感激任何想法。

1 个答案:

答案 0 :(得分:2)

没有可靠的,明显的"订单"。这取决于很多因素:

  • 初始化顺序,取决于附加组件管理器如何在内部存储已安装扩展的顺序,在附加组件类型上(不重新启动的附加组件在非重新启动加载项的另一点启动)
  • 加载项本身的操作顺序/时间。附加组件是否会立即修改某些内容?超时后?看完窗户后?经过一些其他的异步API回调(例如,在从附加组件管理器查询它自己的元数据之后)
  • 注册活动的顺序和位置。
  • 在大多数" API" s中,后一个加载项会覆盖之前的加载项。
  • 在其他API中,例如在DOM API中,第一个加载项可能会获胜(例如,通过取消DOM事件的传播)。

所以,基本上没有可靠的方式,附加作者可以真正,可靠地影响对她有利的事情(在游戏中有太多的实现细节)。

附加组件会尝试修改有限的资源(例如新的标签页,这实际上是一个简单的偏好;只能有一个),基本上会相互争斗。

解决方案?

但是,大多数情况下,附加组件可能会检测到某些事情正在发生(例如,检测到newtab页面已被覆盖,或者稍后再次被覆盖)并告诉用户可能存在是另一个附加干扰的问题。 ("亲爱的朋友;我们检测到您已经有一个新的标签附加组件;请禁用其他附加组件以使NewTabX正常运行。")

问题?

对于许多附加组件,这不是一个真正的问题,因为他们并没有真正使用有限的资源,或者在Firefox中有明确的方法让用户选择要使用的扩展名(例如,你有没有问题,当两个附加组件为同一网页链接添加上下文菜单时,用户只会看到两个可供选择的项目;"在附加组件ABC中下载&#34 ;;"在Add-下载在XYZ");

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

子问题

  

所有扩展程序接收事件(新选项卡是否已打开 - gBrowser" NewTab"事件处于低级api,onLoad / onReady / onActivate处于sdk / tabs等)?

使用通常的addEventListener内容和SDK API:Yupp。如果两个东西覆盖浏览器DOM中相同的onxzy=元素属性,那么当然不会;后者覆盖获胜

  

Firefox如何决定处理哪些回调?

根据DOM规范,

正常addEventListener个订单。或者非DOM API使用的任何内容(FIFO,LIFO)。

  

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

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

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

  

如果这是真的,我认为不同的扩展之间会有比赛,有时会有不同的新标签。但总有一个新的标签扩展程序正在稳定运行。

是的。

与其他浏览器的扩展系统的比较。

大多数情况下,其他浏览器基本上与Firefox一样。 某些内部订单不一定是一成不变的,或者显而易见的,DOM事件(在网站中)将被分派到多个附加组件,多个附加组件可以将侦听器添加到其他内容(例如{ {1}})和最新/第一个加载项获胜,具体取决于API。

结论

所有扩展尝试"拥有"有限的资源可能会与尝试执行相同操作的其他附加组件发生冲突。期待意外:p