使用SQLite Chrome浏览器打包应用程序? [英] Chrome Packaged App with SQLite?

查看:151
本文介绍了使用SQLite Chrome浏览器打包应用程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图整合 sql.js (基于JS的SQLite https://github.com/kripken/sql.js/ )到我的Chrome应用程序中,但当我启动我的应用程序时,控制台显示以下错误:

 拒绝将字符串评估为JavaScript,因为'unsafe-eval'不是下列内容安全策略指令中允许的脚本源:default-src'self'chrome -extension资源。请注意,'script-src'没有明确设置,所以'default-src'被用作后备。 
Uncaught EvalError:拒绝评估字符串为JavaScript,因为'unsafe-eval'不是下面内容安全策略指令允许的脚本源:default-src'self'chrome-extension-resource:。

我的清单文件如下所示:

 {
manifest_version:2,
name:Chrome App,
description:这是测试程序! !,
版本:1,
图标:{
128:icon_128.png
},
权限 :[storage],
app:{
background:{
scripts:[background.js]
},
content_security_policy:script-src'self''unsafe-eval'; object-src'self'
},
minimum_chrome_version:28
}


解决方案

@MarcRochkind我想为您的书添加一些知识, Chrome应用中的href =https://github.com/kripken/sql.js/ =nofollow> SQL.js 。



非常小的努力很可能(考虑到政策和规则的服从)。



为了集成任何使用 eval 的东西,您需要对该脚本的特定部分进行沙箱。对于SQL.js,它是整个库。



这可以通过iframe来完成,该iframe需要在 .html主文件中设置需要创建(或主要)窗口的文档,例如 chrome.app.window.create('index-app.html',{..



主文档和iframe之间的通信将使用 postMessage 发送和接收邮件。



假设这个iframe的来源被称为 /iframes/sqljs-sandboxed.html
manifest.json 您需要指定 sqljs-sandboxed.html 作为沙箱。指定的沙箱可以运行 eval eval 类似于新函数的结构

  {
manifest_version:1,
name:SQL.js测试,
..
sandbox:{
pages:[
iframes / sqljs-sandboxed.html,
]
}

sqljs-sandboxed.html 使用事件侦听器对 message 类型的事件作出反应。在这里,您可以简单地添加逻辑(为了简单起见,我使用了一个switch语句)来执行任何使用SQL.js构造的任何内容。 $ b

sqljs例如:

 < script src =/ vendor / kripken / sql.js>< /脚本> 
< script>
(function(window,undefined){

//一个测试数据库
var db = new SQL.Database();
//用一些测试值
sqlstr =CREATE TABLE hello(a int,b char);;
sqlstr + =INSERT INTO hello VALUES(0,'hello');;
sqlstr + =INSERT INTO hello VALUES(1,'world');;
//运行查询而不返回任何内容
db.run(sqlstr);

//我们事件侦听器
window.addEventListener('message',function(event){
var params = event.data.params,
data = event.data.data,
context = {};

try {
switch(params.cmd){
case'/ do / hello':

//处理任何东西使用sql.js
var result = db.exec(SELECT * FROM hello);

//设置响应上下文
context = {
message: /办/地狱o',
hash:params.hash,
response:result
};

//向源发送一个响应(父文档)
event.source.postMessage(context,event.origin);

//为简单起见,请重新发送一个响应,以查看
//'index-app.html'中的事件是否被第二次触发(即
// shouldn' t)
setTimeout(function(){
event.source.postMessage(context,event.origin);
},'1000');

break;
}
} catch(err){
console.log(err);
}
});

})(window);
< / script>

测试数据库仅创建一次,事件侦听器使用简单的开关镜像API。这意味着为了使用SQL.js,您需要针对API编写代码。这可能乍一看有点不舒服,但从本质上讲,这个想法在实施REST服务时是等同的,在我看来,这从长远来看非常舒适。



为了发送请求, index-app.html 是发起者。指出可以异步