我正在尝试编写一个插件,它使用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.非常感谢任何帮助,谢谢。
答案 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
有一些警告:
open(1)
,要么执行捆绑包中的实际可执行文件。nsIProcess
并不完全是活泼的。它将使用runAsync
阻止UI(run
)和更多内容,因为它等待进程完成。因此,请尽可能使用runAsync
,并谨慎使用此API。