我最近将我的一个 GreaseMonkey 脚本转换为 WebExtension,只是为了对这个过程有一个第一印象。现在我已经达到了在禁用/卸载所述扩展程序时进行一些清理或简单地撤消所有更改会很好的地步。
从我在 Mozilla 的页面上看到的,runtime.onSuspend 应该可以解决问题。不幸的是,它看起来还没有实现(我在常规的 Firefox 发布 channel 上)。
换句话说,我想要做的是在用户删除/禁用我的扩展程序后运行代码,以便我可以清理监听器等,并且通常将选项卡恢复到它们的状态,即。 e.,撤消扩展所做的所有更改。
最佳答案
您最初的措辞对于您想要什么有些不清楚。因此,此答案还包含有关在某些情况下您可以接收卸载通知的一种方式的信息。
在卸载/禁用之前在 WebExtension 附加组件中运行代码:
不,即使支持, runtime.onSuspend
事件也不会执行您想要的操作。它用于通知事件页面它们即将被卸载。当它们正在监听的事件的处理完成时,甚至页面也会定期卸载。这并不表示正在卸载扩展。
“确定”您的“WebExtension 被禁用/卸载”:
如果您的问题确实是您在问题的最后一行中陈述的内容:“...有没有办法确定 WebExtension 是否已被禁用/卸载?”然后,看起来您可以使用 runtime.setUninstallURL()
,它是从 Firefox 47 开始实现的。这将允许您设置一个 URL,以便在卸载附加组件时访问。这可用于在您的服务器上记录加载项已卸载。它不会通知您的 WebExtension 它已被卸载,也不会在发生这种情况时允许您在 WebExtension 中运行代码。
不幸的是,您不能在您的 WebExtension 中检测到此 URL 已被访问以表明您的 WebExtension 正在被卸载/禁用。经测试,该网址是在WebExtension完全卸载后访问的。此外,WebExtension 被禁用时也不会访问,也不会在禁用后卸载时访问。只有在启用附加组件的情况下卸载 WebExtension 时才会访问它。由于这是一个仅在启用扩展时运行的 JavaScript 调用这一事实,人们会期望页面仅在离开启用状态时才会打开。
通过将以下行添加到 WebExtension 并查看页面何时打开来完成测试:
chrome.runtime.setUninstallURL("http://www.google.com");
考虑到它的实际运行方式(仅在启用并直接卸载 WebExtension 时才访问),使用它作为“一种确定 WebExtension 是否被禁用/卸载的方法”只会部分有效。应该清楚的是,如果加载项在卸载之前被禁用,则访问此 URL 不会通知您。
关于javascript - Firefox WebExtension : How Do I Run Code Prior to Disable/Uninstall?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38645274/