2010-08-16 5 views

Répondre

24

Updatier: Le Mene + Shuman correctif est désormais Busted avec Firefox 30 et Firefox Firebug 2. 31 peut fournir des solutions de contournement (enquêtera). En attendant, utilisez les "stratégies générales de contournement" énumérées ci-dessous.


Mise à jour: Cette réponse est maintenant obsolète.

Si vous ouvrez about:config et
mis extensions.firebug.filterSystemURLs-false
vous pouvez utiliser Firebug pour déboguer le script Greasemonkey comme tout autre. Ce mode de fonctionnement fonctionne indépendamment du mode @grant.

Voir Mene's answer -- with an assist from Shuman.



ancienne réponse:

Parce que Greasemonkey fonctionne dans un bac à sable, Firebug ne peut pas le voir. Il n'y a pas de moyen facile de contourner cela.

stratégies de contournement générales:

  1. test toutes les parties d'un script GM qui n'utilisent pas GM_ fonctions, dans la console JavaScript de Firebug premier. Réduire au minimum l'utilisation des fonctions GM_ et ne pas utiliser du tout GM_log().

  2. Tous de Firebug's console functions fonctionnent parfaitement dans un script GM.

+0

Merci pour vos suggestions. – WolveFred

+1

Greasemonkey peut maintenant être débogué comme n'importe quel js. Voir ma réponse pour plus de détails. – Mene

1

J'ai essayé ChromeBug, il 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 faire d'étape 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 me faire travailler le débogage base de scripts Greasemonkey grâce à une explication dans un commentaire récent sur la page d'extension par f0rsvinn.Voici les instructions que je viens de publier à http://groups.google.com/group/greasemonkey-users/browse_thread/thread/994cfa58c79d222:

Il ne me vint que la façon dont il fonctionne est de créer son propre bac à sable autour du script plutôt que d'utiliser Greasemonkey de, vous avez fait tourner GM au large. Il y a quelques aspects de l'aspect GM que ne fonctionnera pas parce que le script n'est pas vraiment dans GreaseMonkey. Par exemple, GM_getValue renvoie undefined.

Néanmoins, cela fonctionne pour le débogage de base - et c'est bien mieux que rien.

étapes d'utilisation sont les suivantes:

  1. Installer Firebug 1.5.4 (les versions ultérieures ne semblent pas fonctionner)
  2. Installation FireBugMonkey
  3. Utilisez le gestionnaire de script dans FireBugMonkey pour sélectionner les fichiers que vous souhaitez déboguer
  4. Désactiver Greasemonkey (scripts courir à l'intérieur FireBugMonkey, pas
  5. Greasemonkey)
  6. Activer FireBugMonkey
  7. scripts dans Firebug Activer

Les scripts ajoutés dans le ScriptManager doit être visible dans la liste des scripts Firebug.

+2

Cela semble ne plus être disponible. – Motes

7
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 ajouter ceci à votre fichier xxx.user.js et l'installer dans greasemonkey.

Ensuite, vous pouvez déboguer votre js comme vous le souhaitez.

1

similaires à la suggestion de @ bigml, vous pouvez l'exécuter sans droits si vous configurez un serveur web local (apache) pour servir le fichier userscript, puis dans votre userscript ajouter quelque chose le long des lignes:

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 fonctionnerait pas dans un contexte privilégié. Mais de cette façon, vous pouvez facilement déboguer le script comme n'importe quel autre script.

+1

Bien. Vous vouliez dire "suggestion de bigml" en fait! Bien sûr, cette méthode implique que nous n'utilisons pas les fonctions GM. – WolveFred

+0

Grande solution, il y a beaucoup de serveurs web simples, comme SimpleHTTPServer de Python, ou mieux, WEBrick dans Ruby. – stellarpower

2

- Cette réponse est obsolète, s'il vous plaît utiliser @Brock solution Adams ci-dessus -

Chargez votre script principal à l'extérieur, au lieu de l'exécuter par GM. Donc, vous utilisez simplement GM pour injecter le script.

Ceci est un peu un hybride entre la solution @bigml et @ Yuval et il utilise jquery. Cela fonctionne également dans les 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() 
}); 
+1

Hmm, vous utilisez Jquery pour charger Jquery à partir du CDN de google. Est-ce logique? –

+3

Non, matejkranny. C'est incroyable qu'il ait fallu 10 mois pour que quelqu'un s'en aperçoive! Je l'ai modifié en conséquence. – sijpkes

8

Firefox et Firebug actuels peuvent maintenant déboguer les scripts Greasemonkey actuels comme n'importe quel autre javascript. Il suffit de trouver votre script *.user.js 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é les versions précédentes.

Screenshot of limited-case debugging


Note: Pour le faire fonctionner, vous avez sans doute de mettre extensions.firebug.filterSystemURLs à false. Voir "Profiling Greasemonkey scripts" in the Firebug, bug tracker. (Merci à Shuman)

+0

Etes-vous sûr? Vous pouvez * voir * les scripts GM mais les points d'arrêt, les montres, etc. ne fonctionnent pas - en particulier sur les scripts qui ne sont pas en mode @grant none et/ou qui utilisent des écouteurs d'événements. Si vous avez une recette qui fonctionne pour le débogage réel, publiez des détails. –

+0

Je n'ai rien fait de spécial. J'ai créé un nouveau script et je l'ai débogué. Les points d'arrêt fonctionnent bien (comme vous pouvez le voir sur la capture d'écran) et dans un autre script j'ai aussi utilisé des événements: addEventListener ('click', ...), dispatchEvent, fireEvent, ainsi qu'un MutationObserver. Tout dans un GM qui a '@grant none'. Tout a fonctionné comme prévu. – Mene

+0

Je viens de revérifier et je n'ai pas réussi à le faire fonctionner sur n'importe quel scénario, sauf le plus simple. Les points d'arrêt et les montres n'ont pas fonctionné sur l'un des trois scripts que j'ai exécutés sur cette page, par exemple. ([Voici l'un des scripts, vous pouvez tester vous-même] (http://stackapps.com/q/3082/7653).) –

0

Comme les autres l'ont dit, vous pouvez configurer un simple serveur HTTP et servir à 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 bonnes pour ça. Nous pouvons aussi exposer le GM fonctions du script en ajoutant un gestionnaire d'événements personnalisé au document dans les GreaseMonkey:

function gMHandler(e){ 
    GM_log(e.detail.message); 
    e.detail.response = "Hi!" 
} 

document.addEventListener("gM", gMHandler, false); 

puis dans le script servi, soulevant cet événement sur un élément DOM arbitraire exécutera gestionnaire et modifier 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); 
}); 
4

Aucune des autres solutions ici ont travaillé pour moi, mais Jan Odvarko est answer sur la façon de déboguer des extensions Firefox a parfaitement fonctionné pour les scripts GreaseMonkey ainsi:

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 à about: config et définissez les deux prefs suivants:

devtools.chrome.enabled: true 
devtools.debugger.remote-enabled: true 

Après avoir redémarré le navigateur, vous pouvez accéder au Debugger du navigateur par Outils> Développeur Web> Navigateur Debugger.

(notez que vous devez accepter la connexion entrante)

Voir plus: https://developer.mozilla.org/en/docs/Debugging_JavaScript

Ensuite, il suffit de chercher le nom de votre userscript et démarrer le débogage.

3

Cela peut être fait en utilisant le débogueur Firefox natif comme il 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 globale du débogueur de script: Open Menu ->Developer ->Browser Toolbox ->Debugger (ou Ctrl + Maj + Alt + I).

Recherchez le nom de votre script utilisateur et commencez debugging.

Questions connexes