Después de la actualización reciente de Chrome, mi extensión comenzó a activar "Unchecked runtime.lastError: las pestañas no se pueden editar en este momento (el usuario puede estar arrastrando una pestaña)" cuando intento usar la API de chrome.tabs. Todavía no hay mucha información sobre este problema, pero creo que se trata de un error del navegador. Mientras tanto, mi extensión hace que las pestañas de Chrome cambien notablemente más lento de lo que solía ser. Ahora toma un par de segundos cambiar la pestaña. Así que estoy buscando una solución.
Alguna idea de cómo solucionar este problema?
La única solución que he encontrado hasta ahora es poner a mis controladores en un tiempo de espera como este:
chrome.tabs.onActivated.addListener((activeInfo) => { setTimeout(() => { // The old listener handler moves here }, 100); });Pero debe haber una mejor manera, ¿verdad?
Seguirá recibiendo errores, pero al menos funcionará.
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); } }) }Este es un error en Chrome91, como lo señaló @wOxxOm.
Se sugiere este parche si está haciendo muchas llamadas a, por ejemplo 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) } }) } }Y luego, simplemente reemplace las instancias de
xchrome.tabs.query(...con:
ChromeWrapper.chromeTabsQuery(...... Muy bien, no tengo una solución realmente mejor que setTimeout, ya que realmente no veo dónde se publican los mensajes/eventos después de que se completó la pestaña, así que lo que hago también es agregar un setTimeout para hacer algo " prueba y error".
Pero cómo lo hago es anular el chrome.tabs.get original para que podamos tener la misma experiencia mientras lo usamos de la manera esperada. (Y eliminar fácilmente este fragmento cuando finalmente lo arreglen algún día)
Aquí está mi código, saludos
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(); } ) } }();cree una función separada fuera de chrome.tabs.onActivated.addListener. de esta manera funciona para mí.
function insertScript(tab) { chrome.tabs.get(tab.tabId, function (info) { console.log(info); }); } chrome.tabs.onActivated.addListener(function (tab) { setTimeout(function () { insertScript(tab); }, 500); });