【问题标题】:Help me create a Firefox extension (Javascript XPCOM Component)帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)
【发布时间】:2011-01-29 02:06:54
【问题描述】:

我一直在看不同的教程,我知道我已经接近了,但我迷失在实现细节上,因为其中一些有点过时了,而且自 Firefox 3 以来有一些事情发生了变化。我已经@ 987654321@,现在我要把它做成一个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 firefox-addon xpcom


    【解决方案1】:

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

    您需要一个表示您的组件的 JavaScript 对象并将其注册到组件注册器。 (它可以是一个新对象,或者您可以对现有对象进行多任务处理。)执行此操作的方式取决于您的目标是 Firefox 3.x 还是 Firefox 4。

    您需要使用类别管理器注册profile-after-change 通知。执行此操作的方式还取决于您的目标是 Firefox 3、Firefox 3.5/6 还是 Firefox 4。

    当 profile-after-change 通知触发时,您的组件将被创建并调用 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;
        }
      }
    };
    

    【讨论】:

    • 到目前为止,我已经用我的更改更新了我的代码。该组件已在 compreg.dat 中注册,但未调用 observe: 函数。
    • 那么,compreg.dat 在 a) [COMPONENTS] b) [CLASSIDS] c) [CONTRACTIDS] d) [CATEGORIES] 下是否有您的组件条目?
    • 是的,通过不使用 XPCOMUtils 模块进行查询接口和 XPCOM 注册,我终于让它工作了。我不得不编写更多代码,但我仍然很好奇为什么我使用该模块时它不起作用。
    • 感谢您的更新,这让我意识到您的 QueryInterface 宣传了错误的接口,您需要将 nsIObserver 宣传为您的接口之一。
    • 感谢您的关注。那是我的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多