Механик, переставший работать к GM_setValue ()

У меня есть сценарий Механика, который использует объект 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));
    }
}

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

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

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

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

1
задан HonoredMule 1 May 2010 в 15:32
поделиться

1 ответ

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

Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue.

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

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

2
ответ дан 3 September 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: