在最近的 Chrome 更新之后,当我尝试使用 chrome.tabs API 时,我的扩展程序开始触发“Unchecked runtime.lastError: Tabs cannot be editor now (user may be draging a tab)”。关于这个问题还没有太多信息,但我相信这是一个浏览器错误。与此同时,我的扩展程序导致 chrome 选项卡的切换速度明显变慢,就像以前一样。现在需要几秒钟来更改选项卡。所以我正在寻找一种解决方法。
任何想法如何解决这一问题?
在最近的 Chrome 更新之后,当我尝试使用 chrome.tabs API 时,我的扩展程序开始触发“Unchecked runtime.lastError: Tabs cannot be editor now (user may be draging a tab)”。关于这个问题还没有太多信息,但我相信这是一个浏览器错误。与此同时,我的扩展程序导致 chrome 选项卡的切换速度明显变慢,就像以前一样。现在需要几秒钟来更改选项卡。所以我正在寻找一种解决方法。
任何想法如何解决这一问题?
到目前为止,我发现的唯一解决方案是将我的处理程序置于这样的超时状态:
chrome.tabs.onActivated.addListener((activeInfo) => {
setTimeout(() => {
// The old listener handler moves here
}, 100);
});
但一定有更好的方法,对吧?
在 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);
});
你仍然会得到错误,但至少它会起作用
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);
}
})
}
正如@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(...
...好吧,除了 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();
}
)
}
}();