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

Posted

技术标签:

【中文标题】帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)【英文标题】:Help me create a Firefox extension (Javascript XPCOM Component) 【发布时间】: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);

【问题讨论】:

【参考方案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 宣传为您的接口之一。 感谢您的关注。那是我的问题。

以上是关于帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)的主要内容,如果未能解决你的问题,请参考以下文章

Firefox 4 扩展文件。创建唯一异常:NS_ERROR_FAILURE

Firefox扩展程序,用于创建新图标或替换位置/地址栏中的现有图标

Firefox 84.0 正在更改下载文件的自定义文件扩展名

火狐。如何创建引导扩展?

将图像从 Firefox 拖放到 Microsoft Powerpoint

Firefox 网络扩展 - 读取本地文件(最后下载的文件)