Javascript 本地存储和';文件:';协议不持久,SQLite提供了安全性错误 介绍

Javascript 本地存储和';文件:';协议不持久,SQLite提供了安全性错误 介绍,javascript,sqlite,webkit,local,local-storage,Javascript,Sqlite,Webkit,Local,Local Storage,我使用RapidWeaver-MacOSXCMS应用程序,它不使用服务器环境。它有一个编辑器和一个预览模式。预览模式是基于Webkit的渲染器,我可以使用“Inspect Element”,就像您在Safari中通常所做的那样 我想使用localStorage或SQLite存储工具栏的一些设置。我已经阅读了一些关于indexedDB的信息,尽管我没有找到关于如何使用它的具体实现 本地存储的问题 当我停留在预览模式时,localStorage工作正常,当我在编辑器和预览模式之间切换时,url-lo

我使用RapidWeaver-MacOSXCMS应用程序,它不使用服务器环境。它有一个编辑器和一个预览模式。预览模式是基于Webkit的渲染器,我可以使用“Inspect Element”,就像您在Safari中通常所做的那样

我想使用localStorage或SQLite存储工具栏的一些设置。我已经阅读了一些关于indexedDB的信息,尽管我没有找到关于如何使用它的具体实现

本地存储的问题 当我停留在预览模式时,localStorage工作正常,当我在编辑器和预览模式之间切换时,url-location.href-略有改变:

file:///private/var/folders/s7/x8y2s0sd27z6kdt2jjdw7c_c0000gn/T/TemporaryItems/RapidWeaver/98970/document-143873968-28/RWDocumentPagePreview/code/styled/index.html

file:///private/var/folders/s7/x8y2s0sd27z6kdt2jjdw7c_c0000gn/T/TemporaryItems/RapidWeaver/98970/document-143873968-29/RWDocumentPagePreview/code/styled/index.html
文件-143873968-28更改为 文件-143873968-29

据我所知,localStorage基本上是FireFox的globalStorage[location.hostname]。据我所知,Safari不支持globalStorage,所以我不能尝试

SQLite的问题 当我尝试打开数据库时:

var shortName = 'mydatabase';
var version = '1.0';
var displayName = 'My Important Database';
var maxSize = 65536; // in bytes
var db = openDatabase(shortName, version, displayName, maxSize);
我在我的控制台中看到:

SECURITY_ERR: DOM Exception 18: An attempt was made to break through the security policy of the user agent.

这基本上结束了我的问题,我将真诚地感谢您的回答或评论。

localStorage是一种html5机制,它为脚本提供了比cookies多一点的空间。Safari支持它:

我不知道它对基于file:///的应用程序应该有什么路径限制(如果有的话)


编辑:进一步查看路径限制,我发现您所得到的应该适用于Safari,FF最近修复了一个使其无法在那里工作的错误:

使用以下解决方案:经过一些修改,我能够使其工作

以下委托方法适用于我(放置在您的webViewDelegate中):


默认情况下,数据库被指定为0字节,这会导致上面出现模糊的错误消息。当空间不足时,在尝试创建数据库后调用上述方法。请注意,此方法是在WebUIDelegatePrivate.h()中定义的,使用可能会阻止您将应用提交到mac app store。

这对我不起作用,而且我使用MAMP在localhost上测试了localStorage,但运气不佳。
- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id) origin database:(NSString *)databaseIdentifier
{
  static const unsigned long long defaultQuota = 5 * 1024 * 1024;
  if ([origin respondsToSelector: @selector(setQuota:)]) {
    [origin performSelector:@selector(setQuota:) withObject:[NSNumber numberWithLongLong: defaultQuota]];
  } else { 
    NSLog(@"could not increase quota for %@", defaultQuota); 
  }
}