Maison > interface Web > js tutoriel > le corps du texte

Comment corriger les erreurs « Contexte d'extension invalidé » provoquées par des scripts de contenu orphelins dans les extensions Chrome ?

Susan Sarandon
Libérer: 2024-11-01 04:59:27
original
820 Les gens l'ont consulté

How to Fix

Comment supprimer un script orphelin après la mise à jour de l'extension Chrome

Problème

Le rechargement involontaire d'une extension Chrome, en particulier celles 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é".

Solution

L'orphelin le script de contenu peut toujours recevoir des messages DOM. Pour le supprimer :

1. Envoyer un message à partir du nouveau script de contenu :

  • Dans le nouveau script de contenu fonctionnel, envoyez un message au script orphelin à l'aide de window.dispatchEvent.
  • Utilisez un identifiant de message unique , tel que orphanMessageId.

2. Désenregistrer les écouteurs dans le script orphelin :

  • Dans le script orphelin, définissez un écouteur pour l'orphanMessageId.
  • Dans cet écouteur, désenregistrez tous les écouteurs précédents et annulez les variables globales.
  • Cela rend l'ancien script éligible au garbage collection.

3. Script d'arrière-plan :

  • Réinjectez le script de contenu lors du rechargement/de l'installation de l'extension.

4. Script de contenu :

  • Utilisez des fonctions nommées pour les écouteurs d'événements afin de conserver leurs références.
  • Définissez une propriété window.running pour indiquer une instance active.
  • Lors de la réception de l'orphanMessageId, désinscrivez les auditeurs et marquez le script comme orphelin.

5. Script contextuel :

  • Vérifiez si un script de contenu fonctionnel est présent avant d'envoyer des messages.
  • Utilisez EnsureContentScript pour garantir l'injection de script.

Exemple de code :

background.js :

<code class="javascript">// 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' });
  });
});</code>
Copier après la connexion

content.js :

<code class="javascript">// 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;
}</code>
Copier après la connexion

popup.js :

<code class="javascript">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) {}
}</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!