Je n'ai pas trouvé de moyen de déboguer les scripts Greasemonkey avec l'extension Firebug.
Est-ce que quelqu'un sait comment faire ça ?
Merci.
Firefox et Firebug actuels peuvent désormais déboguer les scripts Greasemonkey actuels comme tout autre javascript. Trouvez simplement votre *.user.js
script dans le menu déroulant. La console fonctionne également.
Cela fonctionne au moins sur Firefox 28.0 et Firebug 1.12.7; Je n'ai pas essayé de versions antérieures.
Remarque: Pour que cela fonctionne, vous devez probablement définir extensions.firebug.filterSystemURLs
à faux. Voir "Profiling Greasemonkey scripts" dans Firebug, bug tracker. (Merci à Shuman )
var e = document.createElement("script");
e.src = 'http://www.xxxxxxxx.com/yyyyyyyy.js';
e.type="text/javascript";
document.getElementsByTagName("head")[0].appendChild(e);
vous pouvez l'ajouter à votre xxx.user.js et l'installer dans greasemonkey.
Ensuite, vous pouvez déboguer vos js comme vous le souhaitez.
Aucune des autres solutions ici n'a fonctionné pour moi, mais Jan Odvarko 's answer sur la façon de déboguer les extensions Firefox a également parfaitement fonctionné pour les scripts GreaseMonkey:
Sur Firefox 19 ou version ultérieure, il est possible d'utiliser le débogueur JS intégré sur le navigateur lui-même. Allez dans about: config et définissez les deux préférences suivantes:
devtools.chrome.enabled: true devtools.debugger.remote-enabled: true
Après avoir redémarré le navigateur, vous pouvez accéder au débogueur de navigateur via Outils> Développeur Web> Boîte à outils du navigateur.
(notez que vous devez accepter la connexion entrante)
Voir plus sur: https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Debugging_JavaScript#JavaScript_Debugger
Ensuite, recherchez simplement le nom de votre script utilisateur et commencez le débogage.
Cela peut être fait en utilisant le débogueur natif de Firefox comme cela a été mentionné précédemment. Voici les instructions pour les versions modernes de Firefox.
Définissez les préférences suivantes dans about:config
:
devtools.chrome.enabled: true
devtools.debugger.remote-enabled: true
devtools.debugger.Prompt-connection: false
Ouvrez la fenêtre de débogage de script global via Outils → Développeur Web → Boîte à outils du navigateur → Débogueur (ou Ctrl+Shift+Alt+I).
Recherchez le nom de votre script utilisateur et lancez débogage .
Chromebug peut voir des scripts en bac à sable, http://getfirebug.com/wiki/index.php/Chromebug_User_Guide , mais je ne l'ai pas essayé sur Greasemonkey.
- Cette réponse est obsolète, veuillez utiliser la solution @Brock Adams ci-dessus -
Chargez votre script principal en externe, au lieu de l'exécuter via GM. Donc, vous utilisez simplement GM pour injecter le script.
C'est un peu un hybride entre @bigml et la solution de @ Yuval et il utilise jquery. Il fonctionne également dans des cadres.
// ==UserScript==
// @name My GM script
// @include The website I want this to run on
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// ==/UserScript==
$(document).ready(function() {
// fetch jquery dependent scripts using $.getScript()
});
Semblable à la suggestion de @ bigml, vous pouvez l'exécuter sans privilèges si vous configurez un serveur Web local (Apache) pour servir le fichier script utilisateur, puis dans votre script utilisateur ajoutez quelque chose dans le sens:
if (typeof GM_addStyle == "undefined") {
loadScript("http://localhost/path/to/script.user.js");
}
else {
runScript();
}
function loadScript(url) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(res);
}
function runScript() {
// ... whatever your userscript does ...
}
Bien sûr, vous ne courriez pas dans un contexte privilégié. Mais de cette façon, vous pouvez facilement déboguer en continu le script comme tout autre script.
J'ai essayé ChromeBug, cela ne semble pas fonctionner.
Avec FireBug j'ai eu le point de départ du succès en ajoutant "debugger" à mon code GM. Cela provoque un point d'arrêt et je peux inspecter les variables sur la pile, mais le bon fichier n'est pas affiché donc Je ne peux pas marcher ou quoi que ce soit.
J'ai eu le meilleur succès avec FirebugMonkey (https: // addons.mozilla.org/en-US/firefox/addon/13623/), que je viens de travailler pour faire le débogage de base des scripts GreaseMonkey grâce à quelques explications dans une récente commentaire sur la page d'extension par f0rsvinn. Voici les instructions que je viens de publier sur http://groups.google.com/group/greasemonkey-users/browse_thread/thread/994cfa58c79d222 :
Il ne m'est jamais venu à l'esprit que la façon dont cela fonctionne est de créer son propre bac à sable autour du script plutôt que d'utiliser Greasemonkey, vous devez réellement désactiver GM off. Il y en a GM aspect choses qui ne fonctionneront pas parce que le script n'est vraiment pas dans GreaseMonkey. Par exemple, GM_getValue renvoie undefined.
Pourtant, cela fonctionne pour le débogage de base - et c'est bien mieux que rien.
Les étapes d'utilisation sont les suivantes:
Les scripts que vous avez ajoutés dans ScriptManager doivent être visibles dans la liste des scripts FireBug.
Comme les autres l'ont dit, vous pouvez configurer un simple serveur HTTP et le servir sur votre page en utilisant Greasemonkey comme ceci:
function loadScript(url) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
WEBrick et Python -m SimpleHTTPServer sont bons pour cela. Nous pouvons également exposer les fonctions GM _... au script en ajoutant un gestionnaire d'événements personnalisé au document dans GreaseMonkey:
function gMHandler(e){
GM_log(e.detail.message);
e.detail.response = "Hi!"
}
document.addEventListener("gM", gMHandler, false);
puis dans le script servi, déclencher cet événement sur un élément DOM arbitraire exécutera le gestionnaire et modifiera le paramètre de réponse de l'élément:
$(document).ready(function() {
var event = new CustomEvent(
"gM",
{
detail: { message: "Hello World!" }
bubbles: true,
cancelable: true,
}
);
document.getElementById("AnyElement").dispatchEvent(event);
alert("Response was: " + event.detail.response);
});