Components.interfaces.nsIProcess2 в Firefox 3.6 — куда это делось?

StackOverflow https://stackoverflow.com/questions/2221469

  •  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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top