繁体   English   中英

帮我创建一个Firefox扩展(Javascript XPCOM组件)

[英]Help me create a Firefox extension (Javascript XPCOM Component)

我一直在寻找不同的教程,我知道我很接近,但我在实现细节上迷失了,因为其中一些有点过时了,自Firefox 3以来有些事情发生了变化。我已经编写了javascript for firefox扩展 ,现在我需要将它变成一个XPCOM组件。

这是我需要的功能:我的Javascript文件很简单,我有两个函数startServer()stopServer 我需要在浏览器启动时运行startServer() ,在firefox退出时运行stopServer()

编辑:

我用一个有效的解决方案更新了我的代码(感谢Neil)。 以下是MyExtension/components/myextension.js

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
const CI = Components.interfaces, CC = Components.classes, CR = Components.results;

// class declaration
function MyExtension() {}

MyExtension.prototype = {
    classDescription: "My Firefox Extension",
    classID:          Components.ID("{xxxx-xxxx-xxx-xxxxx}"),
    contractID:       "@example.com/MyExtension;1",
    QueryInterface: XPCOMUtils.generateQI([CI.nsIObserver]),

    // add to category manager
    _xpcom_categories: [{
        category: "profile-after-change"
    }],

    // start socket server
    startServer: function () { /* socket initialization code */ },

    // stop socket server
    stopServer: function () { /* stop server */ },


    observe: function(aSubject, aTopic, aData) 
    {
        var obs = CC["@mozilla.org/observer-service;1"].getService(CI.nsIObserverService);

        switch (aTopic) 
        {
            case "quit-application":
                this.stopServer();
                obs.removeObserver(this, "quit-application");
                break;
            case "profile-after-change":
                this.startServer();
                obs.addObserver(this, "quit-application", false);
                break;
            default:
                throw Components.Exception("Unknown topic: " + aTopic);
        }
    }
};

var components = [MyExtension];

function NSGetModule(compMgr, fileSpec) {
    return XPCOMUtils.generateModule(components);
}

据我所知,您的所有代码都会进入您的组件。

您需要一个代表组件的JavaScript对象,并将其注册到组件注册器。 (它可以是一个新对象,也可以多任务一个现有对象。)这样做的方式取决于你是针对Firefox 3.x还是Firefox 4。

您需要使用类别管理器注册profile-after-changeprofile-after-change通知。 这样做的方式还取决于你是针对Firefox 3,Firefox 3.5 / 6还是Firefox 4。

触发更改后的通知触发后,将创建组件并调用observe方法。 这是您启动服务器的位置,还要求观察退出应用程序通知。 请注意,这也会调用observe方法,因此必须检查它获取的通知。

function myExt() {}
myExt.prototype = {
  observe: function(aSubject, aTopic, aData) {
    switch (aTopic) {
      case "quit-application":
        stopServer();
        obs.removeObserver(this, "quit-application");
        break;
      case "profile-after-change":
        startServer();
        obs.addObserver(this, "quit-application", false);
        break;
    }
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM