2009-09-16 17 views
3

J'essaie d'apprendre à écrire un plugin Firefox. J'ai téléchargé l'exemple npruntime de Mozilla compilé et l'a exécuté. Obtenir des propriétés à partir du plugin a bien fonctionné, mais quand j'ai essayé d'appeler une méthode , Firefox s'est figé. Je pensais que quelque chose ne va pas avec l'exemple, donc j'ai écrit mon propre plugin scriptable de base qui a une propriété et une méthode qui renvoie une chaîne. La propriété a bien fonctionné, mais l'appel de la méthode a provoqué une nouvelle congélation de Firefox.Firefox [npapi] développement de plugin - firefox gèle lors de l'appel d'une méthode

Ai-je raté quelque chose? J'ai essayé de déboguer le plugin et tout semble bien. Toutes les bonnes fonctions sont appelées et la valeur est renvoyée correctement. Si j'essaie d'arrêter le processus alors que Firefox se bloque, je suis arrêté sur une DLL Windows, pas dans mon code et pas dans le code Firefox.

Si quelqu'un peut me pointer vers la bonne direction ...

Merci.

+1

Un exemple de code serait utile. – sdwilsh

Répondre

6

J'espère que vous l'avez résolu. Si ce n'est pas le cas, je viens de découvrir que l'exemple (je suppose que c'était le "npruntime sample") était imparfait.

Lors du renvoi d'une chaîne, l'exemple utilisait la fonction strdup pour allouer une chaîne passée avec une méthode NP_something. Le fait est que NPAPI prend en charge la chaîne allouée à partir de ce point et, quand elle essaie de la détruire, elle ne peut pas le faire puisque strdup utilise malloc et non NPN_MemAlloc.

La solution est de ne jamais utiliser malloc ou nouveau pour les objets que nous passons aux fonctions NPAPI. Dans l'échantillon npruntime l'erreur est à la ligne 452:

STRINGZ_TO_NPVARIANT(strdup("foo return val"), *result); 

et ligne 466:

STRINGZ_TO_NPVARIANT(strdup("default method return val"), *result); 

Je l'ai corrigé avec ce code:

char* src = "foo return val"; 
char* out = (char *)NPN_MemAlloc(strlen(src) + 1); 
strcpy(out, src); 
STRINGZ_TO_NPVARIANT(out, *result); 

et cela a fonctionné. Mais on pourrait penser qu'une telle faille dans un échantillon devrait être corrigée par les mainteneurs du SDK mozilla.

+1

Bonne trouvaille! Pourriez-vous s'il vous plaît trouver un bug - https://bugzilla.mozilla.org/enter_bug.cgi?product=Core&component=Plug-ins et si les gens ne réagissent pas dans quelques semaines, essayez de trouver les bonnes personnes à regarder à lui (par exemple en demandant autour dans irc.mozilla.org/developers)? – Nickolay

+0

Salut, merci! Un de nos développeurs a déposé un bug et mis en place un correctif avec votre correctif. Si vous souhaitez obtenir un crédit nommé, inscrivez-le et indiquez votre nom. https://bugzilla.mozilla.org/show_bug.cgi?id=530138 – sdwilsh

0

J'ai développé npruntime pour chaque navigateur. Cela a bien fonctionné dans tous les navigateurs, mais Firefox ne s'est figé que sous Windows 7.

J'ai résolu le problème en éditant la config firefox "dom.ipc.plugins.enabled" à false. Je ne sais pas si ça va marcher, mais ça mérite d'essayer.