2

事前にみんなに感謝します-

起動時にウィンドウが読み込まれる前に、設定を読み込む必要があります。以下は、私が取り組んできた /component コードです。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]);
}
4

1 に答える 1

5

あなたの本当の質問に答えるには、

すべてのウィンドウの読み込み時に読み込まれるコードがあり、Firefox が起動するたびに 1 回だけ実行されるようにする必要があります。

..モジュールを使用する必要があります。一度実行したいロードハンドラーで、モジュールからエクスポートされた(つまり、「住んでいる」)オブジェクトのフラグを確認し、必要なコードを実行した後、フラグを設定します。

モジュールはすべてのウィンドウで共有されるため、フラグは Firefox を閉じるまで設定されたままになります。

observe()中間の問題については、コードを a でラップすることをお勧めしtry { ... } catch(e) {dump(e)}ます (出力を表示するには、環境設定を設定し、Firefox を特別な方法で実行する必要があります)、返されたエラーを確認します。

xpcom-startup と app-startup は設定をいじるには早すぎると思います (そのためにはプロファイルが必要だと思います)。とにかく、xpcom-startup 通知を受け取るために登録しないことに注意してください。代わりにprofile-after-changeに登録することをお勧めします。

于 2010-02-16T22:14:34.377 に答える