Greasemonkey无法GM_setValue()

时间:2010-05-01 14:45:10

标签: javascript greasemonkey local-storage setvalue

我有一个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} // Expansion按预期显示完整的内容,但有一个奇怪的地方 - Firebug突出显示紫色的对象键,而不是匿名对象的常用黑色。
  2. {“54,10”:{“x”:54,“y”:10,“name”:“Lucky Pheasant”}} //正确字符串化的JSON。
  3. bookmarks_HonoredMule已更新
  4. 未定义
  5. 我尝试改变对象键的格式,没有效果。进一步缩小问题的是,在代码初始化期间,此特定值已成功保存为空对象(“{}”),但跳过这也无济于事。重新加载页面确认保存非空对象确实失败。

    知道什么可能导致这种行为吗?我已经彻底探索了达到大小限制的可能性,但似乎没有问题 - 如前所述,我已经减少了存储使用量。其他较大的对象保存不变,并且已经不高的对象总数进一步减少了大于我试图在此处存储的数据量。

1 个答案:

答案 0 :(得分:2)

事实证明,问题是从unsafeWindow上下文调用this.save()的问题。这是违反安全规则的行为,但应该导致违反了访问冲突异常:

Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue.

相反,GM_setValue返回没有做任何事情,后续的日志记录指令也会执行,因此没有提示问题,documentation可能已过期。

在我以任何方式解决这个问题的过程中,我抽象了GM_存储函数,因此我可以使用其他存储机制,因此解决方法是将所有保存指令放在一个在setInterval中运行的预先存在的清理例程中,类似于上述文档中描述的修复程序。 (使用现有的间隔是为了防止过度创建过去因浏览器正常运行时间而性能下降的定时器。)