Question

J'ai un script Greasemonkey qui utilise un objet Javascript pour maintenir des objets stockés. Il couvre tout à fait un grand volume d'informations, mais beaucoup moins qu'il succès stockées et récupérées avant de rencontrer mon problème. Une valeur refuse de sauver, et je ne peux pas pour la vie de me déterminer pourquoi. Le code de problème suivant:

  • Travaux pour d'autres objets plus volumineux maintenu.
  • gère actuellement une plus petite quantité totale de données que précédemment travaillé.
  • est-ce pas entrer en collision avec une fonction ou d'autres définitions objet.
  • Can (en option) enregistrer la clé de stockage de problème avec succès comme "{}" lors du démarrage de 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} // SHOWS d'extension contenu complet comme prévu, mais il y a une bizarrerie -. Firebug met en évidence les clés d'objet en violet au lieu du noir habituel pour des objets anonymes
  2. { "54,10": { "x": 54, "y": 10, "name": "Lucky faisan"}}. // Le JSON correctement de chaîne de caractères
  3. bookmarks_HonoredMule mis à jour
  4. non défini

J'ai essayé de modifier le format des clés d'objet, sans effet. En outre rétrécissement de la question est que cette valeur particulière est enregistrée avec succès comme un objet vide ( « {} ») lors de l'initialisation de code, mais sauter qui fait aussi pas d'aide. Rechargement la page confirme que l'enregistrement de l'objet nonvide vraiment échoué.

Toute idée de ce qui pourrait provoquer ce problème? Je l'ai bien étudié la possibilité de toucher des contraintes de taille, mais il ne semble pas que cela puisse être le problème - comme mentionné précédemment, je l'ai déjà réduit l'utilisation du stockage. D'autres objets plus grands Epargnez encore, et le nombre total d'objets, ce qui n'a pas été déjà élevé, a encore été réduite par une plus grande quantité que la quantité de données que j'essaie de stocker ici.

Était-ce utile?

La solution

Il se trouve la question était celle de this.save () étant appelée à 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é:

Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue.

Au lieu des retours GM_setValue avoir rien fait, et les instructions d'exploitation ultérieures exécuter aussi, donc il n'y avait aucune indication de la question et le documentation peut être à jour.

Dans ma quête pour résoudre ce problème par tout moyen, j'Abstraite loin des fonctions de stockage GM_ pour que je puisse utiliser d'autres mécanismes de stockage, de sorte que la solution sera de mettre tous, sauf instructions dans une routine de nettoyage pré-existant qui fonctionne dans setInterval, similaire à la solution décrite dans la documentation ci-dessus. (L'utilisation d'un intervalle existant est d'empêcher la création excessive de minuteries qui ont dans le passé une dégradation des performances sur le temps de fonctionnement du navigateur.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top