在外部应用程序卸载外接程序时恢复Firefox首选项的正确方法

时间:2009-10-12 06:22:55

标签: firefox firefox-addon xul uninstall preferences

我在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配置文件,则无法进行此操作(无需进行详细修改)。

有没有更好或“标准”的方法来实现这个简单的任务?

2 个答案:

答案 0 :(得分:0)

您是否尝试在您的扩展程序中打包defaults filesdefaults/preferences/myprefs.js)?我没有检查它是否适用于覆盖Firefox范围的默认值,但它应该。

答案 1 :(得分:0)

卸载程序“坚持”Firefox不能关闭吗?例如,

check if FireFox is open
  if open, inform user "FF must be closed, or cancel uninstall" ok/cancel
  loop

我有几个安装人员对我这样做。但是,我并不记得,我不记得。

此外,这不是解决方案的未来问题,也不涉及配置文件。