在 Firefox 中设置启动时的首选项

发布于 2024-08-21 23:27:54 字数 2971 浏览 5 评论 0原文

提前感谢大家 -

我需要在启动时加载任何窗口之前加载首选项。下面是我一直在使用的一些/组件代码。 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]);
}

Thanks to everyone in advance -

I need to load a preference before any windows are loaded at startup. Below is some /component code I have been working with. The SetPreference method seems to fail when it is called (nothing executes afterwords either) - I am assuming because the resources that it needs are not available at the time of execution...or I am doing something wrong. Any suggestions with this code or another approach to setting a preference at startup?

Thanks again,

Sam

For some reason the code formatting for SO is not working properly - here is a link to the code as well - 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]);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你怎么敢 2024-08-28 23:27:54

回答你真正的问题,即

我有在每个窗口加载时加载的代码,我需要确保每次 Firefox 启动时只执行一次。

..您应该只使用 模块,在您希望执行一次的加载处理程序中,检查从模块导出(即“居住在”)的对象上的标志,然后在运行所需的代码后,设置该标志。

由于该模块在所有窗口之间共享,因此该标志将保持设置状态,直到您关闭 Firefox。

至于你的中间问题,我建议将代码包装在 observe()try { ... } catch(e) {dump(e)} (您需要设置首选项并以特殊方式运行 Firefox以查看输出)并检查返回的错误。

我想 xpcom-startup 和 app-startup 还为时过早,无法扰乱首选项(我认为您需要一个配置文件),请注意,无论如何您都不会注册以获得 xpcom-startup 通知。您可能想注册profile-after-change

To answer your real question, which is

I have code that loads on every window load and I need to make sure that only gets executed once every time firefox starts up.

..you should just use a module, in the load handler that you wish to execute once, check a flag on the object exported from (i.e. "living in") the module, then after running the code you need, set the flag.

Since the module is shared across all windows, the flag will remain set until you close Firefox.

As for your intermediate problem, I'd suggest wrapping the code inside observe() in a try { ... } catch(e) {dump(e)} (you'll need to set a pref and run Firefox in a special way in order to see the output) and check the error returned.

I guess xpcom-startup and app-startup is too early to mess with preferences (I think you need a profile for that), note that you don't register to get xpcom-startup notification anyway. You probably want to register for profile-after-change instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文