检测/阻止由私有浏览引起的Firefox IndexedDB InvalidStateError

时间:2015-07-01 10:55:51

标签: javascript firefox incognito-mode

我正在集成一个使用IndexedDB的javascript库,但当Firefox处于隐私浏览/窗口模式时,它会“无意义地”失败。该库返回500内部错误,同时Firefox向控制台吐出InvalidStateError。

我想要做的是在实例化此库之前添加一个检查,如果IndexedDB不可用,则根本不使用该库。即某种类型的尝试/捕获测试。从我所看到的情况来看,Firefox似乎吐出了控制台错误,即使有问题的代码在try / catch中(但也许还有办法......)。

我实际上并不关心用户是否在私有窗口会话中,但这似乎是Firefox导致此InvalidStateError的唯一时间。

2 个答案:

答案 0 :(得分:0)

我使用indexedDB检查用户是否处于隐私浏览模式。在window.onerror上出现InvalidStateError并通过跟踪系统记录。 看起来开放发生在不同的线程中。我发现只有这个原始解决方案:设置全局处理程序window.onerror,以隐藏此错误。

    // Get old handler (maybe undefined)
    const oldHandler = window.onerror;
    // Empty handler
    const noop = () => 1;
    window.onerror = noop;

    const returnOldHandler = () => setTimeout(() => {
      // The ugly thing: we some external code could place own onerror handler
      // between our code evaluation.
      // For this case we should check is it changed.
      if (window.onerror === noop) {
        window.onerror = oldHandler;
      }
    }, 0);

    try {
      db = window.indexedDB.open('test');
      // Return global handler when DB opens.
      // It can create some errors due async process.
      db.onerror = returnOldHandler;
      db.onsuccess = returnOldHandler;
    } catch(e) {
      // never evaluate
    }

答案 1 :(得分:0)

你已经处理了onerror函数中的错误。

这不会告诉你明确的使用是"在私人",但会告诉你你不能使用indexedDB - 你可以根据需要插入 - 即如果它的FireFox和它的抛出和错误,那么他们很可能是私人的 - 直到Mozilla的人解决它。

node.sources = my-source
node.channels = my-channel
node.sinks = my-sink
# Since node 1 sink is avro-type, here we indicate avro as source type
node.sources.my-source.type = avro
node.sources.my-source.bind = 0.0.0.0
node.sources.my-source.port = 11112
node.sources.my-source.channels = my-channel
node.channels.my-channel.type = memory
node.channels.my-channel.capacity = 10000
node.channels.my-channel.transactionCapacity = 100
node.sinks.my-sink.type = logger
node.sinks.my-sink.channel = my-channel
node.sinks.my-sink.maxBytesToLog = 256

这仍然会向控制台发出InvalidStateError,但是js可以处理后果。