我在 Windows 上编写了一个应用程序套件,其中安装了一个 Firefox 插件,一旦运行,它就会通过与 nsIPrefService 接口修改 Firefox 网络首选项。
扩展程序本身与应用程序的其他部分一起位于Program Files下的文件夹中,这些部分相互配合。
由于该应用程序由许多组件组成,因此卸载它的正确方法是通过控制面板或通过我为用户提供的卸载快捷方式。
当用户选择卸载时,我无法控制 Firefox 是否会运行(可能我可以尝试检测它是否在卸载程序中运行并请求用户关闭它以继续)。
由于卸载程序的目的是从最终用户系统中删除程序的所有痕迹,即:
- Program Files 文件夹下的所有文件,包括扩展组件
- 从 Firefox 中删除插件(通过删除 HKEY_CURRENT_USER\Software\Mozilla\Firefox\Extensions 下的注册表项,导致插件在下次 Firefox 重新启动时取消注册)
- 删除应用程序特定的注册表项
然后在卸载之后,我的任何代码都不会留在用户系统上,能够将网络首选项恢复到安装组件之前的状态。这导致最终用户无法浏览网页并且非常沮丧!
目前我能弄清楚如何做到这一点的唯一方法是让我的组件将用户配置文件文件夹的位置写入窗口的注册表 - 我可以使用我的插件来做到这一点:
Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties).get("ProfD",
Components.interfaces.nsIFile).path
然后让我的卸载程序直接修改该位置的 prefs.js 文件。但这只有在我可以保证 Firefox 在卸载期间没有运行时才有效(因为 prefs.js 是在 FF 关闭时重写的)
对我来说,这不是一个优雅的解决方案:
- 这似乎不是未来的证明,因为它取决于 prefs.js 使用的格式和符号,这可能会在未来的 FF 版本中发生变化。
- Firefox 有一个讨厌的习惯,即并不总是正确关闭(有时其他已安装的附加组件会阻止它从内存中完全卸载。这会破坏我的卸载程序)。
- 如果用户使用我的插件设置了多个 FF 配置文件,这将不起作用(无需精心修改)。
有没有更好或“标准”的方法来完成这个简单的任务?