Components.interfaces.nsIProcess2 в Firefox 3.6 — куда это делось?
-
19-09-2019 - |
Вопрос
Я провожу бета-тестирование приложения, которое включает расширение Firefox в качестве одного компонента.Первоначально он был развернут, когда FF3.5.5 была последней версией, и сохранился до версий 3.5.6 и 3.5.7.Однако в FF3.6 я получаю следующее в своей консоли ошибок:
Warning: reference to undefined property Components.interfaces.nsIProcess2
Source file: chrome://overthewall/content/otwhelper.js
Line: 55
Error: Component returned failure code: 0x80570018 (NS_ERROR_XPC_BAD_IID)
[nsIJSCID.createInstance]
Source file: chrome://overthewall/content/otwhelper.js
Line: 55
Функция, выдающая ошибку, является:
48 function otwRunHelper(cmd, aCallback) {
49 var file =
50 Components.classes["@mozilla.org/file/local;1"].
51 createInstance(Components.interfaces.nsILocalFile);
52 file.initWithPath(otwRegInstallDir+'otwhelper.exe');
53
54 otwProcess = Components.classes["@mozilla.org/process/util;1"]
55 .createInstance(Components.interfaces.nsIProcess2);
56
57 otwProcess.init(file);
58 var params = new Array();
59 params = cmd.split(' ');
60
61 otwNextCallback = aCallback;
62 otwObserver = new otwHelperProcess();
63 otwProcess.runAsync(params, params.length, otwObserver, false);
64 }
Как вы можете видеть, все, что делает эта функция, - это запускает внешний вспомогательный файл EXE (расположенный в разделе реестра) с некоторыми параметрами командной строки и настраивает Observer на асинхронное ожидание ответа и обработку кода выхода.
Оскорбительная строка подразумевает , что Компоненты.интерфейсы.nsIProcess2 больше не определено в FF3.6.Куда он делся?Я не могу найти в документации Mozilla ничего, указывающего на то, что она была изменена в последней версии.
Решение
Метод в nsIProcess2 был перенесен в nsIProcess.Чтобы ваш код работал в обеих версиях, измените эту строку:
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess2);
к этому:
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess2 || Components.interfaces.nsIProcess);
Вы по-прежнему получите предупреждение, но ошибка исчезнет, и ваш код будет работать просто отлично в обеих версиях.Вы также можете сохранить iid интерфейса в переменной и использовать эту переменную:
let iid = ("nsIProcess2" in Components.interfaces) ?
Components.interfaces.nsIProcess2 :
Components.interfaces.nsIProcess;
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(iid);