Mozilla storageService:“无法执行语句:错误:权限被拒绝”

时间:2011-07-17 10:33:33

标签: javascript sqlite permissions storage mozilla

(在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

为什么?

1 个答案:

答案 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