javascript - Firefox 扩展优先级

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

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

问题是关于扩展优先级。假设用户安装了多个新标签 扩展。他重新启动 Firefox,New tab 会起作用吗? 我想弄明白。

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

首先,安装顺序没有任何作用。较早安装的扩展可以“击败”较晚安装的扩展。反之亦然。

我还尝试启用/禁用扩展,查看最后更改的文件并进行比较。没什么用。只是 bool 标志,该扩展是启用还是禁用以及它是由用户启用还是禁用。

我还尝试更改 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 的扩展优先级如何运作?

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

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

最佳答案

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

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

因此,基本上没有可靠的方法可以让插件作者真正、可靠地影响对她有利的事情(太多的实现细节在起作用)。

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

解决方案?

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

问题?

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

当然,当资源确实有限时,比如只有一个新标签页,那么你最好不要安装多个新标签页插件,否则事情可能会变得疯狂。

子问题

Are all extension receiving events (that new tab is opened – gBrowser "NewTab" event in low level api, onLoad/onReady/onActivate in sdk/tabs and others)?

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

And how Firefox decide whose callback to process?

根据 DOM 规范的正常 addEventListener 顺序。或者任何非 DOM API 使用(FIFO、LIFO)。

Or Firefox processing all callbacks and the result of last one is displaying?

如果多个附加组件从一个回调中修改相同的内容,则最后一个获胜。然而,很多时候,附加组件在对同一事件使用react时会做不同的事情(例如,在选项卡加载时,Greasemonkey 可能会加载用户脚本,Adblock Plus 会阻止某些元素,Linkify 会链接文本链接等)

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

If that was true, I think there were races between different extensions and sometime there will be different new tabs. But there are always stably one new tab extension is working.

是的。

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

大多数时候,其他浏览器的工作原理与 Firefox 基本相同。 一些内部顺序不一定是一成不变的或显而易见的,DOM 事件(在网站中)将被分派(dispatch)到多个附加组件,多个附加组件可以将监听器添加到其他东西(例如 chrome.downloads.onCreated.addListener()) 和最新/第一个附加组件获胜,具体取决于 API。

结论

所有试图“拥有”有限资源的扩展可能会与其他试图做同样事情的附加组件发生冲突。期待意想不到的:p

关于javascript - Firefox 扩展优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24514178/

相关文章:

javascript - xstate 中的参与者和调用服务有什么区别?

javascript Object.prototype VS Anything.prototype

html - CSS 边框渲染优先级

html - Firefox 无法正确显示 CSS header

c++ - 获取窗口图标,将其放在 Canvas 上,叠加图像,另存为ico(WinXP和Win7)

javascript - 左对齐文本输入 onblur (IE 8 & 9)

javascript - jQuery ajax - xhr.responseText 始终未定义

php - 如何使 Firefox 开发人员工具在控制台中显示 FirePHP 消息?

firefox-addon - 为什么 Mozilla Firefox 的扩展(附加组件)会自动删除?

firefox - 从传统的基于 XUL 的附加组件中访问附加 SDK?