Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何确定Firefox WebExtensions中是否实际触发了last tabs.onRemoved?_Javascript_Firefox Addon Webextensions - Fatal编程技术网

Javascript 如何确定Firefox WebExtensions中是否实际触发了last tabs.onRemoved?

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将在不点击断点的情况下退出 在选项卡中向本机

我正在使用WebExtensionsAPI开发一个Firefox插件。我在外接程序中收听
tabs.onRemoved
事件,需要在回调函数中执行一些操作。一般来说,它工作得很好

问题是,如果只有一个Firefox窗口,并且tab close会导致窗口关闭,那么Firefox似乎会在不启动
选项卡的情况下退出。onRemoved

我试过:

  • 在Firefox
    about:debug
    页面,开始调试我的加载项,在
    选项卡中添加断点。一旦删除了回调函数,Firefox将在不点击断点的情况下退出
  • 选项卡中向本机消息传递应用程序发送消息。在已删除的
    回调中,本机应用程序端未收到消息
  • 收听
    windows.onRemoved
    。如果只剩下一个窗口,则最后一个
    windows.onRemoved
    似乎也不会触发
我想可能是Firefox的bug。所以我在BugZilla()上发布了一个bug。但是Firefox的家伙说这不是一个bug

有没有办法确定
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);
                })
            });