Le rechargement involontaire d'une extension Chrome, en particulier celle en mode développeur, peut créer du contenu orphelin scripts. Ces scripts restent exécutés en arrière-plan mais perdent la communication avec le reste de l'extension, ce qui entraîne des erreurs telles que "contexte d'extension invalidé" et "runtime.lastError non vérifié".
Les orphelins le script de contenu peut toujours recevoir des messages DOM. Pour le supprimer :
1. Envoyer un message à partir du nouveau script de contenu :
2. Désenregistrer les écouteurs dans le script orphelin :
3. Script d'arrière-plan :
4. Script de contenu :
5. Script contextuel :
Exemple de code :
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) {}
}
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3