javascript - 如何确定最后一个 tabs.onRemoved 在 Firefox WebExtensions 中实际触发?

标签 javascript firefox-addon-webextensions

我正在使用 WebExtensions API 开发 Firefox 插件。我在附加组件中监听 tabs.onRemoved 事件,需要在回调函数中执行某些操作。大多数情况下它工作得很好。

问题是,如果只有一个 Firefox 窗口,并且选项卡关闭导致窗口关闭,则 Firefox 似乎会退出而不触发 tabs.onRemoved

我已经尝试过:

  • 在 Firefox about:debugging 页面,开始调试我的插件,在 tabs.onRemoved 回调函数中添加断点,Firefox 在没有遇到断点的情况下退出
  • tabs.onRemoved 回调中向 native 消息应用程序发送消息, native 应用程序端未收到消息
  • 收听windows.onRemoved。如果只剩下一个窗口,则最后一个 windows.onRemoved 似乎也不会被触发

我认为这可能是 Firefox 的一个错误。所以我在 BugZilla ( https://bugzilla.mozilla.org/show_bug.cgi?id=1342322#add_comment ) 上发布了一个错误。但 Firefox 的人说这不是一个错误。

有什么方法可以确定 tabs.onRemoved 是否真的被触发了?

我想确保我的回调函数在 Firefox 进程退出之前完成运行,该怎么做?

编辑:

这是我创建的最小可重现示例,它基于 Mozilla 官方示例 tabs-tabs-tabs。我删除了不相关的部分:

list .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>

背景.js

//onRemoved listener. fired when tab is removed
browser.tabs.onRemoved.addListener(function(tabId, removeInfo){
  console.log(`The tab with id: ${tabId}, is closing`);

  if(removeInfo.isWindowClosing) {
    console.log(`Its window is also closing.`);
  } else {
    console.log(`Its window is not closing`);
  }
});

最佳答案

我是 Firefox 的 ColorfulTabs 的作者。我是这样处理的:

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);
                })
            });

关于javascript - 如何确定最后一个 tabs.onRemoved 在 Firefox WebExtensions 中实际触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42919560/

相关文章:

javascript - 绕过 XHR 的 CSRF 保护是否安全? ( rails )

javascript - 如何在 Firefox WebExtensions 中从后台与侧边栏脚本进行通信? (或相反亦然)

javascript - Firefox WebExtension - chrome.tabs.query

javascript - 如何监听 XMLHttpRequests - 浏览器扩展

javascript - backbone-pageable remove() 使用了无效的 url

javascript - 如何使用java脚本检查chrome浏览器是否安装?

Javascript 字符串 Text 和 String() 对象之间的比较

javascript - 除非禁用缓存,否则 HTML 视频无法工作

javascript - Mozilla WebExtensions contextMenus.create 不工作

google-chrome - 新 Firefox WebExtensions API 中的选项页面