16

在最近的 Chrome 更新之后,当我尝试使用 chrome.tabs API 时,我的扩展程序开始触发“Unchecked runtime.lastError: Tabs cannot be editor now (user may be draging a tab)”。关于这个问题还没有太多信息,但我相信这是一个浏览器错误。与此同时,我的扩展程序导致 chrome 选项卡的切换速度明显变慢,就像以前一样。现在需要几秒钟来更改选项卡。所以我正在寻找一种解决方法。

任何想法如何解决这一问题?

4

5 回答 5

10

到目前为止,我发现的唯一解决方案是将我的处理程序置于这样的超时状态:

chrome.tabs.onActivated.addListener((activeInfo) => {
        setTimeout(() => {
           // The old listener handler moves here
        }, 100);
    });

但一定有更好的方法,对吧?

于 2021-06-02T14:07:31.627 回答
2

在 chrome.tabs.onActivated.addListener 之外创建单独的函数。这种方式对我有用。

function insertScript(tab) {
  chrome.tabs.get(tab.tabId, function (info) {
    console.log(info);
   });
}
chrome.tabs.onActivated.addListener(function (tab) {
   setTimeout(function () {
     insertScript(tab);
    }, 500);
});
于 2021-06-25T20:29:32.707 回答
2

你仍然会得到错误,但至少它会起作用

chrome.tabs.onActivated.addListener(function(activeInfo) {getActivatedTab();});
function getActivatedTab(){
    chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
        try{
            if(tabs[0]!=undefined){
            
                console.log(tabs[0].url);   
            }
        }
        catch(err){
            setTimeout(function() {
            getActivatedTab();
            },100);
        }
    })
}
于 2021-06-09T14:10:12.603 回答
1

正如@wOxxOm 所指出的,这是Chrome91中的一个错误。

如果您经常调用例如,建议使用此补丁xchrome.tabs.query

const ChromeWrapper = {
  chromeTabsQuery: function (params, callback) {
    chrome.tabs.query(params, tabs => {
      if (chrome.runtime.lastError) {
        setTimeout(function () {
          //console.warn("Patch for xchrome.tabs.query (Chrome 91).");
          ChromeWrapper.chromeTabsQuery(params, callback)
        }, 100); // arbitrary delay
      } else {
        callback(tabs)
      }
    })
  }
}

然后,只需替换的实例

xchrome.tabs.query(...

和:

ChromeWrapper.chromeTabsQuery(...
于 2021-07-05T11:43:00.277 回答
0

...好吧,除了 setTimeout 之外,我没有更好的解决方案,因为我并没有真正看到标签完成后发布的消息/事件在哪里,所以我要做的也是添加一个setTimeout来做一些“试验和错误”。

但是我的做法是覆盖原来的chrome.tabs.get,这样我们就可以像我们预期的方式使用它一样拥有相同的体验。(当他们最终有一天修复它时,很容易删除这个片段)

这是我的代码,干杯

    chrome.tabs.get = function () {
        const orig_get = chrome.tabs.get.bind(chrome.tabs);
        return async function (tabId) {
            return new Promise(
                resolve => {
                    var tryGet = () => {
                        orig_get(tabId)
                        .then(resolve)
                        .catch(() => {
                            // console.log("retry get");
                            setTimeout(() => {
                                tryGet(tabId);
                            }, 50);
                        })
                    };
                    tryGet();
                }
            )
        }
    }();
于 2021-07-06T07:11:00.753 回答