Инициализация nsIPrefBranch в компоненте
Столкнулся с проблемой - если вызывать
Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
в компоненте, то Branch будет содержать только дефолтные значения. Его можно каким-то образом инициализировать, чтобы были доступны userDefined значения?
Видимо вызываете до инициализации настроек/профиля. В каком это браузере? Я с этой проблемой столкнулся только в SeaMonkey, там пришлось регистрировать observer для события profile-after-change.
Firefox 2.0.
Т.е. если метод компоненты вызывать из самой компоненты - возвращаются дефолтные значения, а если метод компоненты вызвать из оверлея, то возвращаются правильные значения.
Т.е. если метод компоненты вызывать из самой компоненты - возвращаются дефолтные значения, а если метод компоненты вызвать из оверлея, то возвращаются правильные значения.
Вы же во время загрузки компоненты вызываете? Оверлей намного позже загружается, тогда уже все инициализировалось.
PS: Понял, почему у меня работает, а у вас — нет. У меня инициализация не во время загрузки компоненты, а при первом запросе к объекту. Соответственно происходит это позже, профиль успевает инициализироваться.
Вызывайте после окончания инициализации. Для этого зарегистрируйте свою компоненту в категории app-startup и реализуйте nsIObserver. При завершении инициализации приложения ваш observer вызовется с topic app-startup — вот тогда и можете читать настройки. Раньше не стоит.
Примеру кода: http://www.xulplanet.com/tutorials/mozsdk/observerserv.php#cmnote-0, http://developer.mozilla.org/e......P_request_headers#Example_Code
Сделал все как в примере:
[...] observe: function(subject, topic, data){ if (topic == "app-startup") { alert("----------------------------> app-startup"); this.prefSvc = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); alert(this.prefSvc.prefHasUserValue(PREF_SCHEDULER_MM)); alert(this.prefSvc.getIntPref(PREF_SCHEDULER_MM)); return; } }, [...]
Обсервер вызывается, но this.prefSvc
по прежнему содержит только дефолтные значения, prefHasUserValue
возвращает false.