2010-02-16 2 views
2

Спасибо всем заблаговременно -Настройка предпочтений при запуске в firefox

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

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

Сэм

По какой-то причине код форматирования для 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]); 
} 
+0

Исправлено форматирование кода для вас и удалено «по какой-либо причине форматирование кода SO не работает ..». :) –

+1

Зачем вам нужно задавать предпочтение перед запуском любых окон? – djc

+0

В основном потому, что у меня есть код, который загружается при каждой загрузке окна, и мне нужно убедиться, что он запускается только один раз при каждом запуске Firefox. Когда firefox завершается без событий на экране и т. П., Мое предпочтение is_running поддерживает его значение «true», и мое расширение не работает должным образом в следующий раз, когда запускается firefox. Какие-либо предложения? –

ответ

4

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

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

..you должны просто использовать module, в обработчике нагрузки, которую вы хотите выполнить один раз, проверьте флаг на объект экспортируемого из (т.е. «живут в») модуль, то после запуска кода, который вы необходимо установить флаг.

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

Что касается вашей промежуточной задачи, я предлагаю оборачивать код внутри observe() в try { ... } catch(e) {dump(e)} (вам нужно set a pref and run Firefox in a special way, чтобы увидеть выход) и проверить возвращается ошибка.

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

+0

muchos gracias! –

Смежные вопросы