我很好奇 Firefox 附加组件安装过程的内部工作原理。我注意到当用户从 addons.mozilla.org 安装附加组件时会发生以下步骤:
- 加载项已下载(可能在临时文件夹中)。
- 弹出安装确认对话框(“安装来自您信任的作者的附加组件”)。
- 单击安装后,附加组件将存储在/extensions/staged 文件夹中。除了附加组件之外,还有一个 JSON 文件,如下所示:addon_id.json。
- Firefox 提示用户重新启动浏览器。
- 重新启动后,/extensions/staged/文件夹中的内容将移动到/extensions/文件夹。
我想知道的是:
- Firefox 源代码中的哪个代码部分负责第 5 步?我假设一些 c++ 或 js 代码或一些 xpcom 模块负责确定加载项正在等待安装在 staged/文件夹中,并执行必要的步骤(移动文件、注册加载项等)。 ).任何人都可以指出那个模块/代码吗?
- 加载项在下载时(第 1 步)临时存储在哪里?
基本上,我想在第 1 步下载附加组件之后但在它成为浏览器的一部分之前(第 5 步)更改一些文件。我想在 Firefox 源代码中添加此功能。
最佳答案
您的分析大部分是正确的,只是遗漏了自举扩展。引导扩展不需要重新启动浏览器,它们将被移出 staged
目录并立即激活。
附加组件管理器是从 Firefox 4 开始的所有 JavaScript。重要文件是 amWebInstallListener.js (处理来自 Web 的附加安装的组件),AddonManager.jsm (通用插件管理 API)和 XPIProvider.jsm (XPI 打包扩展的提供者)。
extWebInstallListener.onWebInstallRequested()
使用一堆AddonInstall
实例(在XPIInstall.jsm
中定义)调用并创建一个Installer
实例,为每个安装调用AddonInstall.install()
。下载进入由XPIProvider.jsm
中的getTemporaryFile()
确定的临时文件(操作系统特定临时目录中的tmp-foo.xpi
).Installer.checkAllDownloaded()
确定所有下载已完成并显示模态确认对话框 (URI_XPINSTALL_DIALOG
)。AddonInstall.startInstall()
将附加组件移动到临时目录中。之后将立即安装引导加载项。对于其他附加组件,它会继续到第 4 步。onInstallEnded
监听器被触发 - 其中一个显示浏览器需要重新启动的消息。- 浏览器重启后
XPIProvider.startup()
调用XPIProvider.checkForChanges()
调用XPIProvider.processPendingFileChanges()
。
关于firefox - Firefox 附加组件安装过程的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9521541/