Unintentionally reloading a Chrome extension, particularly those in developer mode, can create orphaned content scripts. These scripts remain running in the background but lose communication with the rest of the extension, resulting in errors such as "extension context invalidated" and "unchecked runtime.lastError".
The orphaned content script can still receive DOM messages. To remove it:
1. Send Message from New Content Script:
2. Unregister Listeners in Orphaned Script:
3. Background Script:
4. Content Script:
5. Popup Script:
Example 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) {}
}
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3