gpt4 book ai didi

javascript - 安装和升级基于 Firefox Add-on-SDK 的扩展时强制重新启动

转载 作者:行者123 更新时间:2023-12-02 14:34:00 25 4
gpt4 key购买 nike

我有基于 Firefox Jetpack Add-on-SDK 的扩展,该扩展不是以最佳方式构建的 - 重新安装后,一些旧的 XPCOM 组件卡在内存中,并且无法注册新组件。因此,我需要在扩展更新/安装时强制浏览器重新启动。我知道旧版本默认会执行此操作,但这个版本无需重新启动。

所以我的问题是:如何强制浏览器在扩展升级时重新启动?我查看了 package.json 但什么也没找到。

最佳答案

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

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

<em:bootstrap>false</em:bootstrap>
这会导致您的扩展被视为不可重新启动的附加组件。 Firefox 和 Mozilla 附加组件会将其视为需要重新启动才能启用/禁用的扩展。

但是,这样做会导致您的附加组件无法运行。您的附加组件的入口点永远不会被调用。

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

您需要存储一个首选项,指示您是否已重新启动(即,这样您就不会不断重新启动)。请参阅:

您应该打开 dialog/panel ( MDN 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我写的。

关于javascript - 安装和升级基于 Firefox Add-on-SDK 的扩展时强制重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37605031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com