firefox插件强制重启安装

时间:2016-06-03 02:30:15

标签: firefox firefox-addon firefox-addon-sdk

我有没有以最佳方式构建的firefox jetpack addon-sdk扩展 - 重新安装后,一些旧的XPCOM组件挂在内存中,无法注册新的。所以我需要强制浏览器重新启动扩展更新/安装。我知道旧版本通过defaultm执行此操作,但这些是无重启的,所以问题是:如何强制在扩展升级时重启browres? 我查看了package.json并没有发现任何内容。

1 个答案:

答案 0 :(得分:2)

我的期望是,如果您希望将Add-on SDK扩展标记为非重新启动,那么您基本上是SOL。 Add-on SDK生成restartless扩展,使用标准的无重启启动方法。因此,无论何时创建附加SDK附加组件,您实际上都创建了一个由Add-on SDK包装的无重启加载项。

您可以在jpm xpi创建的 install.rdf 文件中更改以下行:
<em:bootstrap>true</em:bootstrap>

<em:bootstrap>false</em:bootstrap>
这会导致您的扩展程序被视为非重新启动的加载项。它将被Firefox和Mozilla附加组件视为扩展,需要重启才能启用/禁用。

但是,这样做会导致加载项无法正常运行。永远不会调用加载项的入口点。

因此,您必须自行强制重启。

您需要存储一个首选项,表示您已经或尚未重新启动(即不会最终重新启动)。见:

您应该与用户打开dialog / panelMDN add-on SDK panel API),告知他们需要重新启动才能使您的插件正常运行并向他们提供当时重启的选项,或者等待。请参阅:Addon SDK way to make a dialog

在我的一个加载项Change Profile's Window Icons中,需要重新启动以使更改完全生效(不重新启动只会导致部分效果)。我告诉用户该需求,并从选项对话框中为他们提供选项。对话框如下:
Change Profile's Icon Options Dialog

在此对话框中,按钮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();

以上代码的部分内容是从我的其他答案中复制过来的,包括this one,或者是我写的extension