2010-09-03 5 views
3

Je construis une extension firefox qui permet aux utilisateurs de glisser et déposer des choses. Maintenant, si un utilisateur ferme l'application ou recharge la page, je veux restaurer la dernière activité qu'il a faite.Extension Firefox: Stocker les données de l'addon

Example : User moves a box from point X to Y. 
There can be many more boxes as well. 

Maintenant, après rechargement de la page ou démarrage de l'application, si l'utilisateur met l'ON addon, je veux la position de la boîte à être Y. Donc, à cette fin, devrais-je utiliser la chose préférence Firefox ou est-il une autre meilleure façon de le faire.

Répondre

1

Il m'a été suggéré par Nickolay Ponomarev que l'utilisation de ce qui suit peut être une bonne option:

  • service Annotation
  • SQLite DB

En ce moment, je prévois d'utiliser la base de données pour l'usage.

+0

Est-ce que je suggère que pour stocker un seul drapeau? Si oui, oups: c'est définitivement trop lourd pour ce cas d'utilisation. En passant, la solution pour ce cas spécifique est en cours de discussion: Stockage dans Gecko sur dev.platform https://groups.google.com/d/topic/mozilla.dev.platform/vYbQqkqGzlo/discussion et https://bugzilla.mozilla.org/show_bug.cgi?id=866238 – Nickolay

2

J'ai écrit une extension Firefox pour accéder aux signets d'un site développé par un de mes amis. Je stocke localement les données de marque-pages sous la forme JSON dans un fichier texte dans le répertoire du profil d'extension de l'utilisateur, au cas où le service de signet serait hors service.

Ma fonction de sauvegarde des signets JSON est:

/** 
* Stores bookmarks JSON to local persistence asynchronously. 
* 
* @param bookmarksJson The JSON to store 
* @param fnSuccess The function to call upon success 
* @param fnError The function to call upon error 
*/ 
RyeboxChrome.saveBookmarkJson = function(bookmarksJson, fnSuccess, fnError) { 
    var cu = Components.utils; 
    cu.import("resource://gre/modules/NetUtil.jsm"); 
    cu.import("resource://gre/modules/FileUtils.jsm"); 

    var bookmarksJsonFile = RyeboxChrome.getOrCreateStorageDirectory(); 
    bookmarksJsonFile.append("bookmarks.txt"); 

    // You can also optionally pass a flags parameter here. It defaults to 
    // FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_TRUNCATE; 
    var ostream = FileUtils.openSafeFileOutputStream(bookmarksJsonFile); 

    var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); 
    converter.charset = "UTF-8"; 
    var istream = converter.convertToInputStream(bookmarksJson); 

    NetUtil.asyncCopy(istream, ostream, function(status) { 
     if (!Components.isSuccessCode(status) && typeof(fnError) === 'function') { 
      fnError(); 
     } else if (typeof(fnSuccess) === 'function') { 
      fnSuccess(); 
     } 
     return; 
    }); 
}; 

La fonction de lecture des données est:

/** 
* Reads bookmarks JSON from local persistence asynchronously. 
* 
* @param fnSuccess Function to call when successful. The bookmarks JSON will 
* be passed to this function. 
* 
* @param fnError Function to call upon failure. 
*/ 
RyeboxChrome.getBookmarksJson = function(fnSuccess, fnError) { 

    Components.utils.import("resource://gre/modules/NetUtil.jsm"); 

    var bookmarksJsonFile = RyeboxChrome.getOrCreateStorageDirectory(); 
    bookmarksJsonFile.append("bookmarks.txt"); 

    NetUtil.asyncFetch(bookmarksJsonFile, function(inputStream, status) { 
     if (!Components.isSuccessCode(status) && typeof(fnError) === 'function') { 
      fnError(); 
     } else if (typeof(fnSuccess) === 'function'){ 
      var data = NetUtil.readInputStreamToString(inputStream, inputStream.available()); 
      fnSuccess(data); 
     } 
    }); 
}; 

Enfin, ma fonction getOrCreateStorageDirectory est:

/** 
* Storage of data is done in a Ryebox directory within the user's profile 
* directory. 
*/ 
RyeboxChrome.getOrCreateStorageDirectory = function() { 

    var ci = Components.interfaces; 

    let directoryService = Components.classes["@mozilla.org/file/directory_service;1"].getService(ci.nsIProperties); 

    // Reference to the user's profile directory 
    let localDir = directoryService.get("ProfD", ci.nsIFile); 

    localDir.append("Ryebox"); 

    if (!localDir.exists() || !localDir.isDirectory()) { 
     localDir.create(ci.nsIFile.DIRECTORY_TYPE, 0774); 
    } 

    return localDir; 
}; 
Questions connexes