(在Mozilla上交叉发布:http://forums.mozillazine.org/viewtopic.php?f=7&t=2254955)
我正在尝试使用Mozilla storageService。在以下代码中,要求用户授予创建本地数据库('database.sqlite')并创建表的权限。
<html>
<head>
<script type="text/javascript">
var con=null;
function executeStatement()
{
try
{
var stmt=con.createStatement("SELECT * FROM instances");
}
catch(e)
{
alert("Cannot execute statement :"+e);
}
}
function init()
{
try
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}
catch (e)
{
alert("Permission to write to file was denied.");
return;
}
try
{
var file = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties)
.get("Home", Components.interfaces.nsIFile);
file.append("database.sqlite");
var storageService = Components.classes["@mozilla.org/storage/service;1"]
.getService(Components.interfaces.mozIStorageService);
con = storageService.openDatabase(file);
con.executeSimpleSQL(
"CREATE TABLE IF NOT EXISTS instances("+
"id INTEGER PRIMARY KEY AUTOINCREMENT"+
")"
);
}
catch(e)
{
alert(e);
}
}
window.addEventListener("load", init,true);
</script>
</head>
<body>
<button onClick="executeStatement();">Test</button>
</body>
</html>
但是当我点击按钮调用方法 executeStatement 时,我得到以下异常:
无法执行语句:错误:&lt; file://&gt;的权限被拒绝至 调用方法UnnamedClass.createStatement
为什么?
答案 0 :(得分:1)
这就是enablePrivilege
的工作原理 - 你必须在每个需要特权的功能中调用它。另请参阅The only option is to include that block of code into each of my functions?
虽然我们正在讨论这个问题,但我会从该主题中引用bz的评论:
我强烈建议你不要使用enablePrivilege。它被弃用并且正在被移除。 - Boris Zbarsky 7月13日14:10
...
替换正在使用扩展名。我不确定这有多清楚,但是即将推出的Firefox版本会在你使用enablePrivilege时发出警告,你不能再使用enablePrivilege来进行跨站点XMLHttpRequest。在某些地方(例如https://developer.mozilla.org/en/Mochitest#How_can_I_get_around_the_error_.22Permission_denied_to_get_property_XPCComponents.classes.22.3f)提到了这一点,但还有更多文档需要更新。 - Boris Zbarsky 7月14日5:11