Mozilla storageService: «Невозможно выполнить инструкцию: ошибка: в доступе отказано» - PullRequest
1 голос
/ 17 июля 2011

(перекрестная публикация в 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 , я получаю следующее исключение:

Невозможно выполнить инструкцию: Ошибка: в доступе отказановызвать метод Безымянный класс.createStatement

почему?

1 Ответ

1 голос
/ 17 июля 2011

Так работает enablePrivilege - вы должны вызывать его в каждой функции, требующей привилегий.См. Также Единственный вариант - включить этот блок кода в каждую из моих функций?

Пока мы здесь, я процитирую комментарий bz из этой темы:

Я настоятельно рекомендую вам вообще не использовать enablePrivilege.Это устарело и находится на пути к удалению.- Борис Збарский 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), но гораздо больше документации для обновления.- Борис Збарский 14 июля в 5: 11

...