Расширение Firefox: Хранить данные дополнений - PullRequest
3 голосов
/ 03 сентября 2010

Я создаю расширение для Firefox, которое позволяет пользователям перетаскивать объекты. Теперь, если пользователь закрывает приложение или перезагружает страницу, я хочу восстановить последнее действие, которое он сделал.

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

Теперь, после перезагрузки страницы или запуска приложения, если пользователь включает надстройку, я хочу, чтобы позиция ящика была Y. Так что для этой цели я должен использовать предпочтение Firefox или есть какой-то другой лучший способ сделать это.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2012

Я написал расширение Firefox для доступа к закладкам с сайта, разработанного моим другом. Я храню данные закладок локально как JSON в текстовом файле в каталоге профилей расширения пользователя на случай, если служба закладок не работает.

Моя функция для сохранения закладок JSON:

/**
 * 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;
    });
};

Функция для чтения данных:

/**
* 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);
        }
    });
};

Наконец, моя функция getOrCreateStorageDirectory:

/**
 * 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;
};
1 голос
/ 04 сентября 2010

Николай Пономарев предложил мне, что использование следующего может быть хорошим вариантом:

  • Служба аннотаций
  • БД SQLite

Прямо сейчас я планирую использовать базу данных для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...