所以我们有一个包含数据的一个大的老wodge(我们谈论的几十兆)复杂的HTML5离线应用程序,我们希望读写它复制到用户的硬盘。
我们已经得到了这个胜负的使用HTML5索引工作,但Chrome是有大量数据(约10分钟加载)和Firefox的最新版本愣神慢有一个可爱的错误是随机和不可挽回象垃圾一样清除整个数据库,所以这是B计划 - 再加上我们很想有一个用户指定的文件,他们可以再备份,邮件四周,等
显然,我们不能用普通的浏览器权限做到这一点,但在沙箱外Firefox扩展访问文件系统,我们已经得到了基本概念与工作这个扩展 。 唯一的问题是,扩展由周围传递数据读取和写入DOM属性 ,这似乎不是很理想的数据,我们在谈论音量:
但是,如果这是可以相信这是真的是做到这一点的唯一途径,因为壁虎严格偏析特权的页面(如我们的扩展)和非特权的网页(如网站)。 有另一种解决方案?
您的扩展代码可以用来读取网页的任意数据。 它只是在通过获取到选择到.wrappedJSObject
任何物体它的工作,得到了它的“网页”视图的属性。
首先,如果你已经看过了IndexedDB的选项,但没有说明为什么mozIStorageService (又名源码)是行不通的。 异步功能有定制的DOM envents合并似乎是一个不错的配合,但取决于你的数据需求。
我相信的是,这个问题的答案在于你如何从扩展到网页获取数据的语句。 如果你的需求不能与DOM事件被满足,那么你可能需要看看编码一个自定义的XPCOM组件 ,但是这是很多繁重的工作。
如果你不能做到这一点的原因是涉及到大量数据移动,并从您的服务器,那么你可以看看使用流读取器/转换器(包括添加gzip压缩转换器)......但这只是如果你的“大数据旧wodge”有意义的,因为流。
下面是我们如何方法后得到了这个工作太痛了。 帽尖鲍里斯在正确的方向指向我们!
下面所有的代码是为必须由用户安装启用此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")
文章来源: Reading and writing large amounts of data to a user's local storage in Firefox