我有基于Firefox Jetpack的SDK扩展程序,该扩展程序不是以最佳方式构建的-重新安装后,一些旧的XPCOM组件挂在内存中,无法注册新的。因此,我需要在扩展程序更新/安装上强制浏览器重新启动。我知道较旧的版本默认情况下会执行此操作,但是此版本不会重启。
所以我的问题是:如何在扩展程序升级时强制浏览器重新启动?我已经调查过[[package.json却一无所获。
您可以在jpm xpi
时创建的
install.rdf文件中更改以下行:<em:bootstrap>true</em:bootstrap>
至<em:bootstrap>false</em:bootstrap>
这会使您的扩展程序被视为不可重启的加载项。 Firefox和Mozilla附加组件会将其视为扩展,需要启用/禁用重新启动。
因此,您必须自行强制重新启动。
您将需要存储一个首选项,该首选项指示您已经或尚未重新启动(即,这样您就不会最终连续重新启动)。参见:
在我的附加组件之一Change Profile's Window Icons中,需要重新启动才能使更改完全生效(不重新启动只会部分生效)。我会通知用户这种需求,并从选项对话框中为他们提供选项。该对话框如下所示:
在此对话框中,按钮Accept changes and Restart Firefox
将执行其操作,然后重新启动Firefox。我用来重新启动Firefox的代码是:
window.opener.content.document.getElementById('cmd_restartApp').doCommand();
这将使用Firefox内置的重新启动功能来执行重新启动。因此,如果必须重新启动的确切方法或与之相关的任何内务处理方法发生变化,则无需使该代码保持更新。确切地说,您将如何调用该函数取决于您要使用的上下文。在某种程度上,这将取决于您实现通知用户需要重新启动并向他们提供现在或以后执行此操作的选项的方式。鉴于您尚未在问题中指定此代码,因此无法准确告诉您需要使用哪种代码才能导致重新启动。但是,通常,您将需要引用基本的Firefox窗口之一。您可以通过多种方法中的任何一种来获取该参考,具体取决于您如何实现与用户的交互。
一种方法是:
if (window === null || typeof window !== "object") { //If you do not already have a window reference, you need to obtain one: // Add/remove a "/" to comment/un-comment the code appropriate for your add-on type. //* Add-on SDK: var window = require('sdk/window/utils').getMostRecentBrowserWindow(); //*/ /* Overlay and bootstrap (from almost any context/scope): var window=Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator) .getMostRecentWindow("navigator:browser"); //*/ } if (typeof document === "undefined") { //If there is no document defined, get it var document = window.content.document; } //Then restart: document.getElementById('cmd_restartApp').doCommand();