Javascript 如何确定Firefox WebExtensions中是否实际触发了last tabs.onRemoved?
我正在使用WebExtensionsAPI开发一个Firefox插件。我在外接程序中收听Javascript 如何确定Firefox WebExtensions中是否实际触发了last tabs.onRemoved?,javascript,firefox-addon-webextensions,Javascript,Firefox Addon Webextensions,我正在使用WebExtensionsAPI开发一个Firefox插件。我在外接程序中收听tabs.onRemoved事件,需要在回调函数中执行一些操作。一般来说,它工作得很好 问题是,如果只有一个Firefox窗口,并且tab close会导致窗口关闭,那么Firefox似乎会在不启动选项卡的情况下退出。onRemoved 我试过: 在Firefoxabout:debug页面,开始调试我的加载项,在选项卡中添加断点。一旦删除了回调函数,Firefox将在不点击断点的情况下退出 在选项卡中向本机
tabs.onRemoved
事件,需要在回调函数中执行一些操作。一般来说,它工作得很好
问题是,如果只有一个Firefox窗口,并且tab close会导致窗口关闭,那么Firefox似乎会在不启动选项卡的情况下退出。onRemoved
我试过:
- 在Firefox
页面,开始调试我的加载项,在about:debug
选项卡中添加断点。一旦删除了回调函数,Firefox将在不点击断点的情况下退出
- 在
回调中,本机应用程序端未收到消息选项卡中向本机消息传递应用程序发送消息。在已删除的
- 收听
。如果只剩下一个窗口,则最后一个windows.onRemoved
似乎也不会触发windows.onRemoved
tabs.onRemoved
是否真的被触发了
我想确保我的回调函数在Firefox进程退出之前完成运行,怎么做
编辑:
这是我创建的最小可复制示例,它基于Mozilla官方示例选项卡。我删除了不相关的部分:
manifest.json
{
"browser_action": {
"browser_style": true,
"default_title": "Tabs, tabs, tabs",
"default_popup": "tabs.html"
},
"description": "A list of methods you can perform on a tab.",
"homepage_url": "https://github.com/mdn/webextensions-examples/tree/master/tabs-tabs-tabs",
"manifest_version": 2,
"name": "Tabs, tabs, tabs",
"permissions": [
"tabs"
],
"version": "1.0",
"background": {
"scripts": ["background.js"]
}
}
tabs.js
document.addEventListener("click", function(e) {
function callOnActiveTab(callback) {
browser.tabs.query({currentWindow: true}).then((tabs) => {
for (var tab of tabs) {
if (tab.active) {
callback(tab, tabs);
}
}
});
}
if (e.target.id === "tabs-remove") {
callOnActiveTab((tab) => {
browser.tabs.remove(tab.id);
});
}
e.preventDefault();
});
tabs.html
<!DOCTYPE html>
<html>
<body>
<a href="#" id="tabs-remove">Remove active tab</a><br>
<script src="tabs.js"></script>
</body>
</html>
我是Firefox的作者或彩色标签。我是这样处理的:
browser.tabs.onRemoved.addListener(onRemoved);
onRemoved(tabId, removeInfo) {
browser.tabs.remove(tabId, function () {
browser.tabs.query({
currentWindow: true
}, function (tabs) {
tabs = tabs.filter(tab => tab.id != tabId);
console.log(tabs);
})
});
您确定Firefox是在未命中断点的情况下退出,还是在命中断点的情况下退出。Firefox在遇到JavaScript代码中的断点时不停止关闭进程并不太不合理。@Makyen我确信这一点(测试了很多次)。Mozilla的家伙们说:这只是因为弹出窗口在窗口关闭之前就关闭了。后台页面和其他剩余上下文中的侦听器按预期启动。我在一周前问他们如何确保听众被解雇,现在还没有回答。请回答主题中的问题:包括一个重复问题的问题。对于Chrome扩展或Firefox WebExtensions,这几乎总是意味着包括manifest.json和一些背景、内容和/或弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码没有按我想要的方式工作?”)必须包括:(1)所需的行为,(2)特定的问题或错误,(3)在问题本身中重现它所需的最短代码。另请参见:、和。需要a的原因是我们想提供帮助。如果我们不必重新创建复制问题所需的任何代码,那么帮助就容易多了。这是您已经拥有的代码。因此,请帮助我们帮助您,并提供一个完整的复制问题。如果没有a,甚至开始帮助你所需的努力量也要高得多,这大大减少了愿意/能够帮助你的人数。即使我们付出了额外的努力,我们也必须猜测你的问题的重要部分。你为什么要在弹出窗口中听这个?这不是一个合理的测试,看看事件是否发生时,你只是从弹出窗口内收听。即使在弹出窗口打开时关闭最后一个选项卡,也不清楚哪一个先发生:弹出窗口关闭(破坏接收事件的任何可能性)或事件触发。如果您真的想测试这个,那么您需要从实际的后台脚本而不是弹出窗口收听事件。坦白地说,我本来希望在您删除活动选项卡时弹出窗口会关闭。
browser.tabs.onRemoved.addListener(onRemoved);
onRemoved(tabId, removeInfo) {
browser.tabs.remove(tabId, function () {
browser.tabs.query({
currentWindow: true
}, function (tabs) {
tabs = tabs.filter(tab => tab.id != tabId);
console.log(tabs);
})
});