2010-05-01 5 views
1

J'ai un script Greasemonkey qui utilise un objet Javascript pour gérer certains objets stockés. Il couvre un assez grand volume d'informations, mais beaucoup moins que ce qu'il a réussi à stocker et récupérer avant de rencontrer mon problème. Une valeur refuse de sauver, et je ne peux pas pour la vie de moi déterminer pourquoi. Le code de problème suivant:Greasemonkey échouant à GM_setValue()

  • Fonctionne pour d'autres objets plus gros en cours de maintenance.
  • Gère actuellement une quantité totale de données plus petite que précédemment travaillée.
  • N'entre en collision avec aucune fonction ou autre définition d'objet.
  • Peut (facultativement) enregistrer avec succès la clé de stockage de problème en tant que "{}" lors du démarrage du code.
this.save = function(table) { 
    var tables = this.tables; 
    if(table) 
     tables = [table]; 
    for(i in tables) { 
     logger.log(this[tables[i]]); 
     logger.log(JSON.stringify(this[tables[i]])); 
     GM_setValue(tables[i] + "_" + this.user, JSON.stringify(this[tables[i]])); 
     logger.log(tables[i] + "_" + this.user + " updated"); 
     logger.log(GM_getValue(tables[i] + "_" + this.user)); 
    } 
} 

Le problème est toujours reproductible et les statments de journalisation produire la sortie suivante dans Firebug:

  1. Object {= 54,10 Object} // extension indique le contenu complet comme prévu, mais il est une curiosité - Firebug met en évidence les touches d'objet en violet au lieu du noir habituel pour les objets anonymes.
  2. {"54,10": {"x": 54, "y": 10, "nom": "Lucky Pheasant"}} // Le JSON correctement enchaîné.
  3. bookmarks_HonoredMule mis à jour
  4. non définie

J'ai essayé de modifier le format des clés d'objet, sans effet. En outre, le problème est que cette valeur particulière est enregistrée avec succès en tant qu'objet vide ("{}") lors de l'initialisation du code, mais ignorer cela n'aide pas non plus. Recharger la page confirme que la sauvegarde de l'objet non vide a vraiment échoué.

Une idée de ce qui pourrait causer ce problème? J'ai exploré à fond la possibilité d'atteindre des contraintes de taille, mais cela ne semble pas être le problème - comme je l'ai déjà mentionné, j'ai déjà réduit l'utilisation du stockage. D'autres objets plus volumineux enregistrent encore, et le nombre total d'objets, qui n'était pas déjà élevé, a encore été réduit d'un montant supérieur à la quantité de données que je tente de stocker ici.

Répondre

2

Il s'avère que le problème était que this.save() était appelé à partir d'un contexte unsafeWindow. Ceci est une violation de la sécurité, mais qui devrait ont donné lieu à une exception de violation d'accès étant jetés:

Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue. 

Au lieu des retours GM_setValue avoir rien fait, et les instructions de journalisation suivantes exécutent également, donc il n'y avait aucune trace de le problème et le documentation peuvent être obsolètes. Dans ma quête pour résoudre ce problème, j'ai supprimé les fonctions de stockage de GM_ pour pouvoir utiliser d'autres mécanismes de stockage. La solution consiste donc à placer toutes les instructions de sauvegarde dans une routine de nettoyage préexistante qui s'exécute dans setInterval , similaire au correctif décrit dans la documentation susmentionnée. (L'utilisation d'un intervalle existant permet d'éviter la création excessive de temporisateurs qui ont par le passé dégradé les performances pendant la disponibilité du navigateur.)

Questions connexes