chrome.tabs.onActivated 事件回调中的标签信息不可用

问题描述

当我尝试从 chrome.tabs.onActivated 事件回调中获取标签信息时,当标签通过鼠标单击切换时,我得到 undefined 结果和错误消息

未选中的 runtime.lastError:现在无法编辑选项卡(用户可以 正在拖动标签)。

延迟 100 毫秒或使用 CTRL+TAB 切换选项卡,或者如果在窗口未聚焦时单击选项卡,它工作正常:

background.js

chrome.tabs.onActivated.addListener( info =>
{
  chrome.tabs.get(info.tabId,tab => console.log("get",tab));
  chrome.tabs.query({active: true,windowId: info.windowId},tab => console.log("query",tab));
  chrome.tabs.getSelected(tab => console.log("getSelected",tab));
  setTimeout(()=>
  {
    chrome.tabs.get(info.tabId,tab => console.log("setTimeout get",tab));
    chrome.tabs.query({active: true,tab => console.log("setTimeout query",tab));
    chrome.tabs.getSelected(tab => console.log("setTimeout getSelected",tab));
  },100);
});

manifest.json

{
   "background": {
      "persistent": true,"scripts": [ "background.js" ]
   },"description": "tab info within chrome.tabs.onActivated event","manifest_version": 2,"name": "test","permissions": [ "tabs" ],"version": "0.0.1"
}

这是一个错误还是什么?

在 Chrome 91.0.4472.77 64 位和 MS Edge 91.0.864.41 64 位中测试

解决方法

是的,这是一个错误:⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

https://bugs.chromium.org/p/chromium/issues/detail?id=1213925

解决方法是将 runtimeErrorsetTimeout 一起捕获

function tabsGet(id,callback)
{
  const cb = tab => (chrome.runtime.lastError) ? setTimeout(e => chrome.tabs.get(id,cb)) : callback(tab);
  chrome.tabs.get(id,cb);
}