Xpoint
   [напомнить пароль]

runtime регистрация XPCOM

Метки: [без меток]
2007-06-11 18:08:50 [обр] Cube(2/2)[досье]

Пытаюсь регистрировать JS XPCOM во время выполнения расширения (xpt устанавливается вместе с расширением).
Код:

function test ()
{
   var fp = Components. classes["@mozilla.org/filepicker;1"].
            createInstance (Components. interfaces. nsIFilePicker);
   fp. init (window, "", Components. interfaces. nsIFilePicker. modeOpen);
   fp. appendFilter ("", "*.js");
   fp. appendFilters (Components. interfaces. nsIFilePicker. filterAll);
   
   var ret = fp. show ();
   if (ret == Components. interfaces. nsIFilePicker. returnOK) 
   {
      var cr = Components. manager.
               QueryInterface (Components. interfaces. nsIComponentRegistrar);
      var res;
      try
      {
         res = cr. autoRegister (fp. file);
         LOG ("res: " + res)
      }
      catch (e) {LOG(e);}
      res = cr. autoRegister (fp. file);
      LOG ("res: " + res)
   }
}

Если убрать блок try { ... } catch, то единственный autoRegister выдаёт ошибку (хотя согласно описанию http://www.xulplanet.com/refer......ces/nsIComponentRegistrar.html должен возвращать ns_ok/ns_error) и компонент не регистрируется.
Почему и как обойтись без ошибки ?

спустя 17 часов [обр] Владимир Палант(434/4445)[досье]
Вы бы все-таки сказали, какую именно ошибку он выдает. Документация имеет в виду, что он должен выдавать NS_ERROR_что_нибудь при ошибке — как, в принципе, и любой XPCOM-метод.
спустя 3 минуты [обр] Владимир Палант(434/4445)[досье]
Попробовал запустить этот код — никаких ошибок, компонента зарегистрировалась. Firefox 2.0.0.4/Win XP.
спустя 34 минуты [обр] Владимир Палант(434/4445)[досье]
Создал bug 384123, чтобы удалить бредовую документацию ошибок из этого интерфейса.
спустя 2 часа 22 минуты [обр] Cube(2/2)[досье]
какую именно ошибку он выдает

[Exception... "Component returned failure code: 0x80040154 (NS_ERROR_FACTORY_NOT_REGISTERED) [nsIComponentRegistrar.autoRegister]"  nsresult: "0x80040154 (NS_ERROR_FACTORY_NOT_REGISTERED)"  location: "JS frame :: chrome://tooltiptranslator/content/tooltiptranslator.js :: test :: line 287"  data: no]

Попробовал запустить этот код — никаких ошибок, компонента зарегистрировалась. Firefox 2.0.0.4/Win XP.

Софт аналогичный, ошибка возникает после удаления compreg.dat и xpti.dat, иными словами, в первый раз после установки расширения.

спустя 1 час 25 минут [обр] Владимир Палант(434/4445)[досье]
Так у вас компонента в принципе не работает — потому и ошибка.
спустя 24 минуты [обр] Cube(2/2)[досье]
Так у вас компонента в принципе не работает — потому и ошибка.
Как же это не работает ? Первый вызов autoRegister выдаёт ошибку, которую я вижу в консоли; второй вызов ошибку не генерирует, и компонентой далее можно пользоваться.
спустя 1 день 18 часов [обр] Владимир Палант(434/4445)[досье]
Вот эта компонента никаких ошибок ведь у вас не выдает? Или все-таки тоже выдает?
var module =
{
   registerSelf: function(compMgr, fileSpec, location, type)
   {
      compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
      compMgr.registerFactoryLocation(Components.ID("{12345678-1234-1234-1234-123456789abc}"), 
                              "Test module",
                              "@mozilla.org/testmodule;1",
                              fileSpec, location, type);
   },

   unregisterSelf: function(compMgr, fileSpec, location) {},

   getClassObject: function(compMgr, cid, iid)
   {
      return factory;
   },

   canUnload: function(compMgr)
   {
      return true;
   }
};

function NSGetModule(comMgr, fileSpec)
{
   return module;
}

/*
 * Factory object
 */

const factory = {
   // nsIFactory interface implementation
   createInstance: function(outer, iid) {
      return {};
   },

   // nsISupports interface implementation
   QueryInterface: function(iid) {
      return this;
   }
}
спустя 2 часа 31 минуту [обр] Cube(2/2)[досье]
Вот эта компонента никаких ошибок ведь у вас не выдает? Или все-таки тоже выдает?

Ай, спасибо : ) Не выдаёт. Сейчас и моя не выдаёт.

Так у вас компонента в принципе не работает

В принципе работает, но в registerSelf не хватало одного символа:

    registerSelf: function (compMgr, fileSpec, location, type)
    {
        if (this. firstTime)
        {
            this. firstTime = false;
            throw Components. results. NS_ERROR_FACTORY_REGISTER_AGAIN;
        }
      ...
    },

М-да... : ( Обидно.

Powered by POEM™ Engine Copyright © 2002-2005