Maison  >  Article  >  interface Web  >  Comment éviter les erreurs « Unchecked runtime.lastError : The Message Port Closed… » dans les extensions Chrome ?

Comment éviter les erreurs « Unchecked runtime.lastError : The Message Port Closed… » dans les extensions Chrome ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 14:37:02670parcourir

How to Prevent

Dévoilement du coupable : scripts orphelins et mises à jour d'extensions

Après avoir accidentellement rechargé une extension Chrome, vous pourriez rencontrer une erreur embêtante : "Exécution non vérifiée .lastError : le port de message s'est fermé avant qu'une réponse ne soit reçue." Cette erreur provient de la création de scripts orphelins, qui interrompent la communication entre la popup et les pages de contenu.

Comprendre le concept de script orphelin

Un script orphelin est un vestige fantomatique d'une extension précédemment chargée qui continue à persister même après que l'extension a été mise à jour ou rechargée. Ce script fantôme intercepte les messages destinés au nouveau script de contenu, entraînant des interruptions de communication.

Éradiquer les scripts orphelins

Pour bannir ce script spectral, il faut d'abord vérifier s'il est toujours réactif. Si c'est le cas, nous pouvons envoyer un message depuis le nouveau script de contenu via l'objet window. À la réception de ce message, le script orphelin doit désenregistrer tous les écouteurs d'événements et préparer le garbage collection.

Réapprovisionnement des scripts de contenu lors du rechargement

Pour éviter que ce problème ne se reproduise, nous peut vérifier la présence d'un script de contenu utilisable avant d'envoyer des messages depuis la page contextuelle. S'il n'en existe pas, nous pouvons réinjecter le script de contenu.

Exemple de code pour le script de contenu

Pour implémenter la solution susmentionnée, incorporez ce script content.js modifié :

<code class="javascript">var orphanMessageId = chrome.runtime.id + 'orphanCheck';
window.dispatchEvent(new Event(orphanMessageId));
window.addEventListener(orphanMessageId, unregisterOrphan);

// ... (register named functions for event listeners)

window.running = true;

function unregisterOrphan() {
  // ... (deregister listeners and nullify variables)
}

function onMessage(msg, sender, sendResponse) {
  // ... (handle message)
}

function onMouseMove(event) {
  // ... (DOM event handler)
}</code>

Vérification de la page popup

Pour garantir qu'un script de contenu est injecté avant la transmission du message, améliorez le script popup.js avec cet extrait :

<code class="javascript">async function sendMessage(data) {
  // ... (fetch active tab)
  if (await ensureContentScript(tab.id)) {
    return await chrome.tabs.sendMessage(tab.id, data);
  }
}

async function ensureContentScript(tabId) {
  // ... (check for existing content script)
  if (!result) {
    await chrome.scripting.executeScript({
      // ... (inject content script)
    });
  }
  return true;
}</code>

En mettant en œuvre ces mesures, vous pouvez exorciser les scripts orphelins et maintenir une communication transparente entre la fenêtre contextuelle de votre extension et les pages de contenu.

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!

Déclaration:
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