Components.interfaces.nsIProcess2 в Firefox 3.6 - куда это делось? - PullRequest
2 голосов
/ 08 февраля 2010

Я бета-тестирование приложения, которое включает в себя расширение 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 для асинхронного ожидания ответа и обработки кода выхода.

Неправильная строка подразумевает, что Components.interfaces.nsIProcess2 больше не определяется в FF3.6. Куда это делось? Я не могу найти ничего в документации Mozilla, указывающей, что это было изменено в последней версии.

1 Ответ

5 голосов
/ 08 февраля 2010

Метод на 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);

Вы все равно получите предупреждение, но ошибка исчезнет, ​​и ваш код будет отлично работать в обеих версиях. Вы также можете сохранить идентификатор интерфейса в переменной и использовать переменную:

let iid = ("nsIProcess2" in Components.interfaces) ?
  Components.interfaces.nsIProcess2 :
  Components.interfaces.nsIProcess;
otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(iid);
...