Greasemonkey не удается GM_setValue () - PullRequest
1 голос
/ 01 мая 2010

У меня есть скрипт Greasemonkey, который использует объект Javascript для поддержки некоторых сохраненных объектов. Он охватывает довольно большой объем информации, но существенно меньше, чем он успешно сохранялся и извлекался до того, как столкнулся с моей проблемой. Одно значение сохранить отказывается, и я не могу за всю жизнь определить почему. Следующий код проблемы:

  • Работает с другими крупными объектами.
  • В настоящее время обрабатывает меньший общий объем данных, чем раньше.
  • Не сталкивается ни с какой функцией или другими определениями объекта.
  • Может (дополнительно) успешно сохранить ключ хранилища проблем как "{}" во время запуска кода.
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));
    }
}

Проблема постоянно воспроизводима, и записи журнала приводят к следующему выводу в Firebug:

  1. Object {54,10 = Object} // Расширение показывает полное содержимое, как и ожидалось, но есть одна странность - Firebug выделяет ключи объекта фиолетовым цветом вместо обычного черного для анонимных объектов.
  2. {"54,10": {"x": 54, "y": 10, "name": "Lucky Pheasant"}} // Правильно структурированный JSON.
  3. bookmarks_HonoredMule обновлено
  4. 1024 * неопределенный *

Я попытался изменить формат клавиш объекта, но безрезультатно. Дальнейшее сужение проблемы заключается в том, что это конкретное значение успешно сохраняется как пустой объект ("{}") во время инициализации кода, но пропуск, который также не помогает. Перезагрузка страницы подтверждает, что сохранение непустого объекта действительно не удалось.

Есть идеи, что может вызвать такое поведение? Я тщательно изучил возможность ограничения размера, но не похоже, что это может быть проблемой - как упоминалось ранее, я уже сократил использование хранилища. Другие более крупные объекты сохраняются еще, и общее количество объектов, которое уже не было высоким, было дополнительно уменьшено на величину, превышающую количество данных, которые я пытаюсь сохранить здесь.

1 Ответ

2 голосов
/ 01 мая 2010

Оказывается, проблема была в том, что this.save () вызывался из контекста unsafeWindow. Это нарушение безопасности, но должно привести к исключению нарушения прав доступа:

Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue.

Вместо этого GM_setValue возвращает ничего не сделанное, и последующие инструкции по журналированию также выполняются, поэтому намека на проблему не было, и документация может быть устаревшей.

В своем стремлении решить эту проблему любыми способами я абстрагировал функции хранения GM_, чтобы я мог использовать другие механизмы хранения, поэтому обходной путь будет заключаться в том, чтобы поместить все инструкции сохранения в уже существующую процедуру очистки, которая выполняется в setInterval, аналогично исправлению, описанному в вышеупомянутой документации. (Использование существующего интервала предотвращает чрезмерное создание таймеров, которые в прошлом снижали производительность по сравнению с временем безотказной работы браузера.)

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