唯一的选择是将该代码块包含在我的每个函数中?

Пол*_*ндр 5 javascript firefox scope universalxpconnect

我的几个功能需要UniversalXPConnect启用权限。

netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
Run Code Online (Sandbox Code Playgroud)

所以,我的功能是这样的:

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

其实,我也trycatch了异常,当特权被拒绝。看起来如下:

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

    // ...
} catch (e) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我宁愿将它作为一个单独的函数并从我的函数中调用它,如下所示:

function oneOfMyFunctions() {
    if (enablePrivilege()) {
        // ...
    } else {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于该enablePrivilege功能如下:

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

    return true;
}
Run Code Online (Sandbox Code Playgroud)

但是,出于安全原因,这是不可能的,因为权限仅在请求功能的范围内授予。

那么,唯一的选择是将该代码块包含在我的每个函数中?

更新:

由于我还将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.');
}
Run Code Online (Sandbox Code Playgroud)

she*_*man 2

您可以将enablePrivilege设置为一种包装函数,该函数接受函数作为参数,然后在其内部调用该函数,如下所示

function enablePrivilege(funcParam) {
    //enable privileges, in try-catch
    funcParam();
}
Run Code Online (Sandbox Code Playgroud)

这样当你这样称呼它时

enablePrivilege(oneOfMyFunctions);
Run Code Online (Sandbox Code Playgroud)

需要特权的函数应该拥有它们,因为它是在enablePrivilege范围内调用的。