Recarregar acidentalmente uma extensão do Chrome, especialmente aquelas no modo de desenvolvedor, pode criar conteúdo órfão roteiros. Esses scripts permanecem em execução em segundo plano, mas perdem a comunicação com o restante da extensão, resultando em erros como "contexto de extensão invalidado" e "runtime.lastError não verificado".
O órfão script de conteúdo ainda pode receber mensagens DOM. Para removê-lo:
1. Enviar mensagem do novo script de conteúdo:
2. Cancelar registro de ouvintes em script órfão:
3. Script em segundo plano:
4. Script de conteúdo:
5. Script pop-up:
Código de exemplo:
background.js:
// Re-inject content script
chrome.runtime.onInstalled.addListener(() => {
chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
chrome.tabs.executeScript(tabs[0].id, { file: 'content.js' });
});
});
content.js:
// Orphaned script detection and cleanup
var orphanMessageId = chrome.runtime.id 'orphanCheck';
window.dispatchEvent(new Event(orphanMessageId));
window.addEventListener(orphanMessageId, unregisterOrphan);
// Register named listeners
chrome.runtime.onMessage.addListener(onMessage);
document.addEventListener('mousemove', onMouseMove);
// Orphan flag and cleanup function
window.running = true;
function unregisterOrphan() {
if (chrome.runtime.id) {
// Not orphaned
return;
}
window.removeEventListener(orphanMessageId, unregisterOrphan);
document.removeEventListener('mousemove', onMouseMove);
try {
chrome.runtime.onMessage.removeListener(onMessage);
} catch (e) {}
return true;
}
popup.js:
async function sendMessage(data) {
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
if (await ensureContentScript(tab.id)) {
return await chrome.tabs.sendMessage(tab.id, data);
}
}
async function ensureContentScript(tabId) {
try {
const [{ result }] = await chrome.scripting.executeScript({
target: { tabId },
func: () => window.running === true,
});
if (!result) {
await chrome.scripting.executeScript({
target: { tabId },
files: ['content.js'],
});
}
return true;
} catch (e) {}
}
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3