安装和升级基于 Firefox Add-on-SDK 的扩展时强制重启
Force restart on install and upgrade of Firefox Add-on-SDK based extension
我有基于 Firefox Jetpack Add-on-SDK 的扩展,它不是以最佳方式构建的 - 重新安装后,一些旧的 XPCOM 组件挂在内存中,无法注册新组件。所以,我需要在扩展 update/install 上强制重启浏览器。我知道旧版本默认会这样做,但这个是无需重新启动的。
所以我的问题是:如何强制浏览器在扩展升级时重启?
我调查了 package.json 但一无所获。
我的期望是,如果您希望尝试将您的附加 SDK 扩展标记为不可重启,那么您基本上是 SOL。 Add-on SDK produces a restartless 使用标准无重启启动方法的扩展。因此,实际上,无论何时您创建一个 Add-on SDK 附加组件,您实际上都创建了一个由 Add-on SDK 包装的无需重新启动的附加组件。
您可以在 jpm xpi
时创建的 install.rdf 文件中更改以下行:
<em:bootstrap>true</em:bootstrap>
至
<em:bootstrap>false</em:bootstrap>
这将导致您的扩展被视为非重新启动的附加组件。它会被 Firefox 和 Mozilla 附加组件视为需要重新启动的扩展 enabled/disabled.
但是,这样做会导致您的附加组件无法运行。您的附加组件的入口点将永远不会被调用。
因此,您必须自行强制重启。
您将需要存储一个首选项来指示您是否已重新启动(即,这样您就不会连续重新启动)。参见:
- Firefox extension opening a page on install
- 附录 B:安装和卸载
脚本
你应该打开一个dialog/panel (MDN add-on SDK panel API) with the user to inform them that a restart is required in order for your add-on to function and provide them with the option to restart at that time, or to wait. See: Addon SDK way to make a dialog
在我的一个插件 Change Profile's Window Icons 中,需要重新启动才能使更改完全生效(不重新启动只会导致部分效果)。我将这种需要告知用户,并从选项对话框中为他们提供这样做的选项。对话框如下所示:
在此对话框中,按钮 Accept changes and Restart Firefox
将执行其指示的操作,并重新启动 Firefox。我用来重启 Firefox 的代码是:
window.opener.content.document.getElementById('cmd_restartApp').doCommand();
这使用 Firefox 内置的重启功能来执行重启。因此,如果必须执行重新启动的确切方法或与这样做相关的任何内务处理发生变化,则无需更新该代码。
具体如何调用该函数取决于您在调用时所处的上下文。在某种程度上,这将取决于您如何实现通知用户需要重新启动并为他们提供现在或以后这样做的选项。鉴于您没有在问题中指定这一点,因此无法准确告诉您需要使用的代码才能重新启动。但是,一般来说,您将需要对基本 Firefox windows 之一的引用。您可以通过多种方法中的任何一种获取该引用,具体取决于您如何实现与用户的交互。
一种方法是:
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, or from an extension我写的
我有基于 Firefox Jetpack Add-on-SDK 的扩展,它不是以最佳方式构建的 - 重新安装后,一些旧的 XPCOM 组件挂在内存中,无法注册新组件。所以,我需要在扩展 update/install 上强制重启浏览器。我知道旧版本默认会这样做,但这个是无需重新启动的。
所以我的问题是:如何强制浏览器在扩展升级时重启? 我调查了 package.json 但一无所获。
我的期望是,如果您希望尝试将您的附加 SDK 扩展标记为不可重启,那么您基本上是 SOL。 Add-on SDK produces a restartless 使用标准无重启启动方法的扩展。因此,实际上,无论何时您创建一个 Add-on SDK 附加组件,您实际上都创建了一个由 Add-on SDK 包装的无需重新启动的附加组件。
您可以在 jpm xpi
时创建的 install.rdf 文件中更改以下行:
<em:bootstrap>true</em:bootstrap>
至
<em:bootstrap>false</em:bootstrap>
这将导致您的扩展被视为非重新启动的附加组件。它会被 Firefox 和 Mozilla 附加组件视为需要重新启动的扩展 enabled/disabled.
但是,这样做会导致您的附加组件无法运行。您的附加组件的入口点将永远不会被调用。
因此,您必须自行强制重启。
您将需要存储一个首选项来指示您是否已重新启动(即,这样您就不会连续重新启动)。参见:
- Firefox extension opening a page on install
- 附录 B:安装和卸载 脚本
你应该打开一个dialog/panel (MDN add-on SDK panel API) with the user to inform them that a restart is required in order for your add-on to function and provide them with the option to restart at that time, or to wait. See: Addon SDK way to make a dialog
在我的一个插件 Change Profile's Window Icons 中,需要重新启动才能使更改完全生效(不重新启动只会导致部分效果)。我将这种需要告知用户,并从选项对话框中为他们提供这样做的选项。对话框如下所示:
在此对话框中,按钮 Accept changes and Restart Firefox
将执行其指示的操作,并重新启动 Firefox。我用来重启 Firefox 的代码是:
window.opener.content.document.getElementById('cmd_restartApp').doCommand();
这使用 Firefox 内置的重启功能来执行重启。因此,如果必须执行重新启动的确切方法或与这样做相关的任何内务处理发生变化,则无需更新该代码。
具体如何调用该函数取决于您在调用时所处的上下文。在某种程度上,这将取决于您如何实现通知用户需要重新启动并为他们提供现在或以后这样做的选项。鉴于您没有在问题中指定这一点,因此无法准确告诉您需要使用的代码才能重新启动。但是,一般来说,您将需要对基本 Firefox windows 之一的引用。您可以通过多种方法中的任何一种获取该引用,具体取决于您如何实现与用户的交互。
一种方法是:
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, or from an extension我写的