Единственный вариант - включить этот блок кода в каждую из моих функций? - PullRequest
4 голосов

Некоторые из моих функций требуют включения привилегии UniversalXPConnect.

netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

Итак, мои функции выглядят так:

function oneOfMyFunctions() {
    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

    // ...
}

На самом деле, я тоже trycatch исключение, когда в праве отказано.Выглядит следующим образом:

try {
    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

    // ...
} catch (e) {
    // ...
}

Я бы предпочел сделать эту функцию отдельной и вызывать ее из своих функций следующим образом:

function oneOfMyFunctions() {
    if (enablePrivilege()) {
        // ...
    } else {
        // ...
    }
}

Учитывая, что функция enablePrivilege будетбыть следующим:

function enablePrivilege() {
    try {
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
    } catch (e) {
        return false;
    }

    return true;
}

Но по соображениям безопасности это невозможно, поскольку привилегия предоставляется только в рамках запрашивающей функции.

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

ОБНОВЛЕНИЕ:

Как я собираюсь также try до catch некоторые другие исключения, которые я закончилсо следующим дизайном:

function readFile(path, start, length) {
    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

    var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath(path);

    var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
    istream.init(file, -1, -1, false);

    istream.QueryInterface(Components.interfaces.nsISeekableStream);
    istream.seek(0, start);

    var bstream = Components.classes['@mozilla.org/binaryinputstream;1'].createInstance(Components.interfaces.nsIBinaryInputStream);
    bstream.setInputStream(istream);

    return bstream.readBytes(length);
}

var filepath = 'C:\\test.txt', start = 440, length = 5;

try {
    console.log(readFile(filepath, start, length));
} catch (e) {
    if (e.name == 'Error') console.log('The privilege to read the file is not granted.');
    else console.log('An error happened trying to read the file.');
}

1 Ответ

2 голосов
/ 13 июля 2011

Вы можете сделать enablePrivilege своего рода функцией-оберткой, которая принимает функцию в качестве параметра, который она затем вызывает внутри себя, например,

function enablePrivilege(funcParam) {
    //enable privileges, in try-catch
    funcParam();
}

, чтобы при ее вызове это было так

enablePrivilege(oneOfMyFunctions);

функция, которой нужны привилегии, должна иметь их, так как она вызывается внутри области действия enablePrivilege.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...