2012-07-12 4 views
2

Puisque le script injecté ne peut pas faire des requêtes xmlhttp interdomaines, j'ai essayé, comme il est conseillé dans les manuels d'envoyer un message du script injecté au script d'arrière-plan pour qu'il fasse le travail. Mais je n'arrive pas à faire passer les messages.pourquoi ne peut pas poster des messages entre le script de fond et le script injecté dans l'opéra 12?

Ceci est mon code, ce n'est que trois fichiers, aussi simple extension qu'il pourrait être.

config.xml

<?xml version="1.0" encoding="utf-8"?> 
<widget xmlns="http://www.w3.org/ns/widgets" id="http://www.example.org/helloworld"> 
    <name>postMessage-testcase</name> 
    <description>check if opera's postMessage fails</description> 
</widget> 

index.html

<!doctype html> 
<html lang="en"> 
<head> 
<script> 
    opera.extension.onmessage = function(event) { 
    alert("get the message!"); 
    opera.extension.postMessage("posting reply"); 
    }; 
</script> 
</head> 
<body></body> 
</html> 

includes/user.js

// ==UserScript== 
// @include  *apod.nasa.gov* 
// ==/UserScript== 

opera.extension.onmessage = function(event) { 
    alert("got reply !"); 
}; 

alert("yep, I'm on apod, proceeding with messages"); 
opera.extension.postMessage("message body"); 

Le script doit renvoyer en arrière des messages lorsque l'utilisateur ouvre apod.nasa.gov, mais seulement un msg est envoyer ici, pas de messagerie a lieu, aussi pas erreur apparaît dans la console.

+0

Pourquoi ne pas simplement utiliser l'API des webmasters HTML5? Ressemble à peu près à la même chose que ce que vous faites, et fonctionne définitivement dans Opera 11.6+. – Utkanos

+0

Si je connais un exemple comment le mettre en œuvre dans le contexte de l'opéra ext. Le truc, c'est que les web workers sont pour télécharger des fichiers depuis le serveur, et avec l'extension je dois accéder aux fichiers locaux. – rsk82

+0

Juste flottant comme une idée - pas certain qu'il serait approprié pour vous, mais je pense que les travailleurs du Web sont OK avec les fichiers locaux, pas sûr. [Voir cette réponse] (http://stackoverflow.com/questions/11291637/daemon-thread-in-javascript/11292100#11292100) pour une démo de travailleurs Web simple que vous pourriez vouloir essayer. Désolé je ne pourrais pas être plus d'aide. – Utkanos

Répondre

2

La méthode opera.extension.postMessage() ne peut pas être appelée à partir du processus d'arrière-plan car elle ne sait pas à quelle page/onglet afficher le message. Au lieu de cela, opera.extension.broadcastMessage() peut être utilisé pour envoyer un message à tous les onglets (voir: http://dev.opera.com/articles/view/extensions-api-messaging-broadcastmessage/)

Vous pouvez également envoyer un message au script injecté dans un onglet particulier:

  1. Écouter pour un événement de connexion (opera.extension.onconnect) dans le processus d'arrière-plan
  2. Exécuter postMessage() de source objet

de l'événement Voir: http://dev.opera.com/articles/view/opera-extensions-messaging/#backgroundscript_injectedscript

Par ailleurs, ne pas oublier que ce que vous utilisez XHR interdomaines dans le processus d'arrière-plan, vous aurez besoin pour permettre l'accès au domaine cible dans votre fichier config.xml, par exemple:

<access origin="http://apod.nasa.gov" subdomains="true"/> 
Questions connexes