2010-04-13 4 views
0

Comment pouvez-vous appeler GM_xmlhttpRequest à l'intérieur d'un eval où vous êtes eval ing un code complexe, dont certains appels GM_xmlhttpRequest.Greasemonkey: effectuer GM_xmlhttpRequest() de eval (suivi)

Ceci est un suivi de Perform GM_xmlhttpRequest() from eval

Voici quelques exemples de code:

// ==UserScript== 
// @name   Test GM AJAX 
// ==/UserScript== 

console = unsafeWindow.console; 
function fetch(msg) { 
    console.log('fetching: '+msg); 
    GM_xmlhttpRequest({ 
     method: 'GET', 
     url: 'http://google.com', 
     onload: function(responseDetails) { 
      console.log(msg); 
     } 
    }); 
} 

function complicated(arg1, arg2) { 
    fetch(arg1 + arg2); 
} 
console.log('trying'); 
var code = 'complicated("Ya", "y!")'; 
function myEval(code) { 
    eval(code); 
    eval('setTimeout(function(){'+code+'},0)'); 
    eval('setTimeout(fetch,0)'); 
    eval('setTimeout(function(){console.log("here");fetch("cool")},0)'); 
    fetch("BOO"); 
} 
myEval(code); 

qui sort:

trying 
fetching: Yay! 
fetching: BOO 
fetching: Yay! 
fetching: 30 
here 
fetching: cool 
BOO 
30 

La seule FETCH travaillé était le setTimeout(fetch,0) mais j'ai besoin pour exécuter réellement le code qui comprend un code compliqué.

Des idées?

+1

Pourriez-vous justifier votre raison d'utiliser 'eval'? Par expérience, je peux dire qu'il existe une alternative dans 99,7% des cas. "J'ai du code compliqué" n'est pas une justification. –

+0

Je construis un système de plugin, où tous les plugins sont de petits morceaux de javascript stockés sur le serveur, et envoyés au client pour être exécutés. Chaque plugin peut appeler dans la bibliothèque client pour effectuer certaines actions. Existe-t-il un meilleur moyen que 'eval()' pour les systèmes de plugins? –

+0

Je suppose que cela pourrait tomber dans l'autre 0,3%. –

Répondre

1

comme j'ai le même problème, quelques mois plus tard et leur semble pas de réponse là-bas.

Si vous voulez seulement exécuter ce code sur une machine ou dans un environmetn développement comme moi, vous pouvez envisager de modifier la source Greasemonkey Addon: Il est seulement deux lettres: « // » dans les composants/Greasemonkey .js, ligne 47 ff

if (stack.filename != null && 
     stack.filename != gmSvcFilename && 
     stack.filename.substr(0, 6) != "chrome") { 
    GM_logError(new Error("Greasemonkey access violation: unsafeWindow " + 
       "cannot call " + apiName + ". --> DISABED")); 
    // return false; OUT-COMMENT THIS LINE 
    } 

Mais attention, car vous avez des problèmes de sécurité avec les scripts mal.