2

因此,我们有一个复杂的 HTML5 离线应用程序,其中包含大量旧数据(我们说的是数十兆字节),我们希望读取它的副本并将其写入用户的磁盘。

我们已经让这种类型的 HTML5 IndexedDB 工作了,但是 Chrome 处理大量数据时速度非常慢(加载大约 10 分钟),并且当前版本的 Firefox 有一个可爱的错误,它会随机且无法挽回地破坏整个数据库,所以这是 B 计划——此外,我们真的很想拥有一个用户可指定的文件,然后他们可以备份、邮寄等。

显然我们不能用普通的浏览器权限做到这一点,但是沙盒之外的 Firefox 扩展可以访问文件系统,我们已经了解了使用这个扩展的基本概念。唯一的问题是,扩展通过读取和写入 DOM 属性来传递数据,这对于我们正在谈论的数据量来说似乎不太理想:

在此处输入图像描述

但是,如果要相信确实是唯一的方法,因为 Gecko 严格隔离特权页面(如我们的扩展程序)和非特权页面(如我们的网站)。还有其他解决方案吗?

4

3 回答 3

1

您的扩展代码可以从网页中读取任意数据。它只需要通过获取.wrappedJSObject它正在处理的任何对象的属性来选择加入,以获得它的“网页”视图。

于 2012-05-28T06:53:22.153 回答
1

首先,如果您查看了 indexedDB 选项但没有说明为什么mozIStorageService(又名 sqlite)不起作用。那里的异步功能与自定义 dom 事件相结合似乎很合适,但这取决于您的数据需求。

我认为该问题的答案在于您关于如何从扩展程序获取数据到网页的声明。如果 dom 事件无法满足您的需求,那么您可能需要考虑编写自定义 xpcom 组件,但这是很多繁重的工作。

如果您不能这样做的原因与将大数据移入和移出服务器有关,那么您可以考虑使用流式阅读器/转换器(包括添加 gzip 压缩转换器)....但只有当您的“大量旧数据”作为流是有意义的。

于 2012-06-11T20:11:48.287 回答
0

这是我们在经历了太多痛苦之后如何让这项工作发挥作用的。向鲍里斯致敬,因为他为我们指明了正确的方向!

下面的所有代码都是针对必须由用户安装以启用此功能的 Firefox 扩展程序,并且代码在 Coffeescript 中,因为这就是我们滚动的方式。

第一步是挂钩扩展程序的onDocumentLoad事件,该事件在用户看到 Firefox 窗口之前触发:

  onDocumentLoad: =>
    gBrowser.addEventListener('DOMContentLoaded', @onLoad, true)

因此,在此之后,DOMContentLoaded每当用户打开窗口或选项卡时都会触发:

  onLoad: (event) =>
    doc = event.originalTarget
    loadedWindow = doc.defaultView.wrappedJSObject

砰,还有用户的全新窗口,可读可写!

    loadedWindow.myExtension = new myExtension()

然后我们只需将扩展代码挂接到用户的窗口中,现在该窗口中的任何 JavaScript 代码(将在 DOMContentLoaded 之后初始化并运行)都可以访问我们的扩展,如下所示:

    if window.myExtension
      window.myExtension.write(data)
      data = window.myExtension.read()
    else
      alert("Install my extension, you fool")
于 2012-06-15T05:03:43.383 回答