在基于Firefox的SDK扩展插件的安装和升级时强制重新启动

问题描述 投票:0回答:1

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

所以我的问题是:如何在扩展程序升级时强制浏览器重新启动?我已经调查过[[package.json却一无所获。

javascript firefox firefox-addon firefox-addon-sdk
1个回答
2
投票
我的期望是,如果您希望尝试将Add-on 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 / 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

  • © www.soinside.com 2019 - 2024. All rights reserved.