Chrome de la transmission de message d'erreur : Tentative d'utilisation d'un port déconnecté de l'objet
Mon extension chrome utilise à long terme "Port" objet pour la transmission de messages entre le contenu du script " et "popup". Le "popup" est en mesure d'envoyer un message au contenu du script' écouteur d'événement. Mais, le 'Port' objet dans le contenu du script' est pas en mesure d'envoyer un message à l' 'popup' page.
var port = chrome.extension.connect({"name":"swap"});
//listener for incoming connections
chrome.extension.onConnect.addListener(function( incomingPort ){
//listener on incoming messages
incomingPort.onMessage.addListener(function( msg ){
if( msg.command === 'get_scripts' ){
//do work
}
var scrs = { 'scripts' : 'name' };
var result = port.postMessage( scrs );
});
});
Lors de l'exécution de port.postMessage(Object obj)", le plugin jette l'Erreur suivante,
Error in event handler for 'undefined': Attempting to use a disconnected port object Error: Attempting to use a disconnected port object
at PortImpl.postMessage (miscellaneous_bindings:54:5)
at chrome-extension://loiamkgdhfjdlkcpehnebipeinpcicfj/swap.js:27:31
at [object Object].dispatch (event_bindings:203:41)
at Object.<anonymous> (miscellaneous_bindings:250:22) event_bindings:207
J'ai essayé d'utiliser le 'Port' objet et 'incomingPort' objet, à la fois de lancer la même "Erreur".
Il se sent comme il a à voir avec le champ d'application de la pré-créé le 'Port' objet.
Le code du plugin est disponible à ce dépôt git https://github.com/snambi/chrome_plugin/tree/master/src/chrome
Ce qui est mauvais dans ce plugin?
OriginalL'auteur Nambi | 2012-08-02
Vous devez vous connecter pour publier un commentaire.
J'ai regardé à travers votre code, et il ne fait aucun sens pour moi:
onMessage
etpostMessage
méthode des deux côtés? Un seul port est suffisant pour communiquer dans les deux sens.Depuis votre poste n'a pas de page d'arrière-plan, et relativement inutile pour le contenu du script, je suppose que votre poste de base est le navigateur d'action de la fenêtre pop-up. Au lieu d'injecter un contenu de script par défaut, vous pouvez également utiliser le flux suivant:
popup.html
etpopup.js
sont exécutées.chrome.moment de l'exécution.le logiciel onConnect
, au port de réception de la demande.chrome.onglets.requête({active:c'est vrai, windowId:-2}, callback_function);
pour sélectionner la fenêtre en cours dans l'onglet en cours. (-2 est lachrome.de windows.WINDOW_ID_CURRENT
constante)callback_function
reçoit un argument: Un tableau d'onglets. Comme il est impossible que la fenêtre actuelle n'a pas d'onglets, sélectionnez le premier élément du tableau:var tab = tabs[0];
chrome.onglets.executeScript(tab.id, {file:'swap.js'});
pour exécuter un script contenu.chrome.moment de l'exécution.se connecter
.J'ai vu aussi que vous êtes à l'aide de
port == null
pour vérifier si un port valide ou pas. Si vous le faites, assurez-vous que la comparaison n'a de sens, en éliminant la variable lorsque le port est déconnecté:Vous êtes toujours en cours d'exécution le contenu du script via le fichier manifeste. Assurez-vous que thaty ou suivez toutes les étapes de ma réponse.
votre suggestion fonctionne. Maintenant que le plugin fonctionne, je tiens à utiliser une messagerie entre le plugin-popup et le contenu du script. Est-ce une mauvaise conception? ou non une solution de conception de patter pour chrome plugins?
Pourquoi serait-il une mauvaise conception? C'est une solution solide qui fonctionne correctement.
Lorsque le chargement de la page le contenu du script est exécuté, essaie d'envoyer un message et ne parvient pas. Bien sûr, chrome poignées de cette erreur. Mais, ce n'est pas une conception optimale, mais il fonctionne. si le contenu du script peut trouver à l'état du Port " ( déconnecté , connecté etc ), il peut être mieux gérés. Est-il possible?
OriginalL'auteur Rob W