web-dev-qa-db-fra.com

Comment déboguer le script Greasemonkey avec l'extension Firebug?

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.

49
WolveFred

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.

Screenshot of limited-case debugging


Remarque: Pour que cela fonctionne, vous devez probablement définir extensions.firebug.filterSystemURLs à faux. Voir "Profiling Greasemonkey scripts" dans Firebug, bug tracker. (Merci à Shuman )

8
Mene
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.

8
bigml

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.

5
Hjulle

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 .

5
Annarfych

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.

3
johnjbarton

- 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()
});
2
sijpkes

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.

1
Yuval

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:

  1. Installez FireBug 1.5.4 (les versions ultérieures ne semblent pas fonctionner)
  2. Installez FireBugMonkey
  3. Utilisez le gestionnaire de scripts dans FireBugMonkey pour sélectionner les fichiers que vous souhaitez déboguer
  4. Désactivez GreaseMonkey (les scripts s'exécuteront dans FireBugMonkey, pas
  5. Mécano)
  6. Activer FireBugMonkey
  7. Activer les scripts dans FireBug

Les scripts que vous avez ajoutés dans ScriptManager doivent être visibles dans la liste des scripts FireBug.

1
studgeek

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);
});
0
stellarpower