Установка предпочтения при запуске в Firefox - PullRequest
2 голосов
/ 16 февраля 2010

Спасибо всем заранее -

Мне нужно загрузить настройки перед загрузкой любых окон при запуске. Ниже приведен некоторый код компонента, с которым я работал. Кажется, что метод SetPreference завершается сбоем при его вызове (кроме слов ничего не выполняется) - я предполагаю, потому что необходимые ему ресурсы недоступны во время выполнения ... или я делаю что-то неправильно Любые предложения с этим кодом или другой подход к настройке предпочтений при запуске?

Еще раз спасибо,

Sam

По некоторым причинам форматирование кода для SO не работает должным образом - здесь также есть ссылка на код - http://samingrassia.com/_FILES/startup.js

Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');

const Cc = Components.classes;
const Ci = Components.interfaces;

const ObserverService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService);

function MyStartupService() {};

MyStartupService.prototype = {
  observe : function(aSubject, aTopic, aData) {
    switch (aTopic) {
      case 'xpcom-startup':
        this.SetPreference("my.extension.is_running", "false");
        break;
      case 'app-startup':
        this.SetPreference("my.extension.is_running", "false");
        ObserverService.addObserver(this, 'final-ui-startup', false);
        break;
      case 'final-ui-startup':

        //make sure is_running is set to false
        this.SetPreference("my.extension.is_running", "false");

        ObserverService.removeObserver(this, 'final-ui-startup');
        const WindowWatcher = Cc['@mozilla.org/embedcomp/window-watcher;1'].getService(Ci.nsIWindowWatcher);
        WindowWatcher.registerNotification(this);
        break;
      case 'domwindowopened':
        this.initWindow(aSubject);
        break;
    }
  },
  SetPreference : function(Token, Value) {
    var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
    var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
    str.data = Value;
    prefs.setComplexValue(Token, Components.interfaces.nsISupportsString, str);

    //save preferences
    var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
    prefService.savePrefFile(null);  
  },
  initWindow : function(aWindow) {
    if (aWindow != '[object ChromeWindow]') return;
    aWindow.addEventListener('load', function() {
      aWindow.removeEventListener('load', arguments.callee, false);
      aWindow.document.title = 'domwindowopened!';
      // for browser windows
      var root = aWindow.document.documentElement;
      root.setAttribute('title', aWindow.document.title);
      root.setAttribute('titlemodifier', aWindow.document.title);
    }, false);
  },
  classDescription : 'My Startup Service',
  contractID : '@mystartupservice.com/startup;1',
  classID : Components.ID('{770825e7-b39c-4654-94bc-008e5d6d57b7}'),
  QueryInterface : XPCOMUtils.generateQI([Ci.nsIObserver]),
  _xpcom_categories : [{ category : 'app-startup', service : true }]
};

function NSGetModule(aCompMgr, aFileSpec) {
  return XPCOMUtils.generateModule([MyStartupService]);
}

1 Ответ

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

Чтобы ответить на ваш реальный вопрос, который

У меня есть код, который загружается при каждой загрузке окна, и мне нужно убедиться, что он выполняется только один раз при каждом запуске firefox.

.. вам нужно просто использовать модуль , в обработчике загрузки, который вы хотите выполнить один раз, проверить флаг на объекте, экспортированном из (то есть "живущем") модуля, затем после запуска код, который вам нужен, установите флаг.

Поскольку модуль является общим для всех окон, флаг будет оставаться установленным, пока вы не закроете Firefox.

Что касается вашей промежуточной проблемы, я бы предложил заключить код в observe() в try { ... } catch(e) {dump(e)} (вам нужно установить преф и запустить Firefox особым образом , чтобы см. вывод) и проверьте возвращенную ошибку.

Полагаю, что xpcom-startup и app-startup слишком рано связываться с настройками (я думаю, вам нужен профиль для этого), обратите внимание, что вы все равно не регистрируетесь, чтобы получать уведомления xpcom-startup. Вы, вероятно, хотите зарегистрироваться вместо profile-after-change .

...