2010-11-06 4 views
1

J'ai une version expérimentale de wxWebConnect (en intégrant XULRunner dans wxWidgets) à https://github.com/jonmmorgan/wxwebconnect/. Il propose une méthodeRechercher et signaler les erreurs de compilation Javascript dans XULRunner en utilisant nsIScriptContext ou l'API SpiderMonkey

wxString wxWebControl::ExecuteScriptWithResult(const wxString& js_code) 

qui exécute la chaîne Javascript utilisant nsIScriptContext :: EvaluateStringWithValue, convertit la valeur en une chaîne avec JS_ValueToString, puis retourne la chaîne. Cependant, j'ai trouvé avec l'implémentation actuelle que si la chaîne Javascript était syntaxiquement invalide (par exemple WebControl.ExecuteScriptWithResult ('{a: 2')) alors le programme se bloquerait en essayant de convertir le résultat en une chaîne. J'ai découvert le paramètre aIsUndefined, que je peux utiliser pour déterminer si l'exécution du script a réussi ou non et empêcher le crash. Cependant, cela ne m'aide pas à trouver ce qu'est l'erreur réelle, et je pense qu'il serait bon de signaler cela (comme Firebug me dit "SyntaxError: missing} dans l'instruction composée"). Autant que je puisse voir, même en utilisant quelque chose comme nsIScriptContext :: CompileScript, je vais juste me dire si la compilation a réussi ou non, et ne me donne pas un moyen d'obtenir l'erreur de syntaxe réelle.

Après http://chadaustin.me/2009/02/evaluating-javascript-in-an-embedded-xulrunnergecko-window/, j'ai essayé d'utiliser JS_GetPendingException, mais il ne semble jamais retourner vrai. Même lorsque je lance webcontrol.ExecuteScriptWithResult ("throw new Error ('a');") il n'a toujours pas d'exception en attente, mais dit que le résultat est indéfini.

Existe-t-il un autre moyen d'obtenir une erreur de compilation ou d'exécution à partir de nsIScriptContext ou de l'API SpiderMonkey? Une idée de pourquoi JS_GetPendingException ne semble pas faire cela?

Répondre

1

J'ai trouvé une réponse à ceci: Dans nsJSContext, il enregistre une fonction de reporter d'erreur. Dans le cadre de cette fonction de rapport d'erreur, il efface les exceptions en attente. Si vous enregistrez votre propre rapport d'erreur, il l'annule et vous permet de faire quelque chose avec l'erreur. Cela signifie que votre erreur ne s'affichera pas dans la console d'erreur. Je ne sais pas si vous perdez toute autre fonctionnalité importante en remplaçant le gestionnaire d'erreurs intégré.

Questions connexes