在OSX上的Firefox中是否支持nslProcess加载?

时间:2013-11-06 03:03:12

标签: javascript macos firefox firefox-addon

我正在尝试编写一个插件,它使用nslProcess在幕后运行一些osascript命令,基于窗口小部件点击。我在这里找到了以下插件级代码,但是无法让它工作。

player.port.on("star1", function() {

//var args = ['-e','tell application "iTunes"','-e','"stop"','-e','"end tell"' ];

var cmd = '/usr/bin/say';
var args = ['value', 'test'];

var execFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);

execFile.initWithPath(cmd);

    if (execFile.exists()) {
        process.init(execFile);
        process.run(true, args, args.length);
    }


});

我正在使用Firefox 25.非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

是的,有可能。您可以通过chrome module访问所有XPCOM。

这是一个完整的示例(main.js

const {Cc, Ci} = require("chrome");

var cmd = '/usr/bin/say';
var args = ['value', 'test'];

var execFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);

execFile.initWithPath(cmd);

if (execFile.exists()) {
    process.init(execFile);
    process.run(true, args, args.length);
}

nsIProcess有一些警告:

  • 您需要始终提供绝对路径。
  • 您无法直接执行OSX App捆绑包。要么通过open(1),要么执行捆绑包中的实际可执行文件。
  • nsIProcess并不完全是活泼的。它将使用runAsync阻止UI(run)和更多内容,因为它等待进程完成。因此,请尽可能使用runAsync,并谨慎使用此API。