使用C#应用程序连接Firefox扩展

时间:2011-04-17 06:58:29

标签: javascript c#-4.0 connection firefox-addon

我需要能够创建一个事件,以便每次用户加载新页面并关闭firefox时,我需要它在我的C#应用​​程序中调用一个方法来负责维护用户模型。我知道我确定需要创建一些类型的firefox扩展,我使用javascript来检查这样的事件。但是,我不知道如何将我的C#应用​​程序与firefox扩展集成。有人可以给我一些指导吗?

2 个答案:

答案 0 :(得分:3)

我会帮助你解决我熟悉的问题部分(基于Javascript的附加组件),并为其他部分提供一些建议。这里什么都没有!

附加组件

Firefox附加组件可轻松提供检测页面加载和打开/关闭firefox所需的工具。

要检测网页加载,您可以在窗口中注册DOMContentLoaded事件的监听器。

window.addEventListener("DOMContentLoaded", function(event){
    var url = event.originalTarget.location.href;
    alert("Oh yeah, a document is loading: " + url);
}, false);

或者,您可以注册nsIWebProgressListener来收听location changes。这可能更接近您想要的内容,因为iframe也会触发DOMContentLoaded

var listener = {
    //unimplemented methods (just give functions which do nothing)
    onLocationChange: function(aWebProgress, aRequest, aLocation){
        var url = aLocation.asciiSpec;
        alert("Oh yeah, a the location changed: " + url);
    }
};
gBrowser.addTabsProgressListener(listener);

要检测firefox打开/关闭,您需要先了解firefox附加组件如何处理多个窗口。当启动一个新的firefox窗口时,你基本上有两个单独的代码副本运行。所以,如果你关心打开和关闭firefox windows ,你可以这样做:

window.addEventListener("load", function(event){ 
    alert("Looks like you just opened up a new window");
}, false);

window.addEventListener("unload", function(event){
    alert("Awh, you closed a window");
}, false);

但是,您很可能想要检测打开/关闭firefox作为整个应用程序。这是使用名为Javascript Modules的代码共享机制实现的。 Javascript模块在应用程序的生命周期内只加载一次。因此,它们使您能够在窗口之间共享信息。只需计算打开和关闭的窗口数就足以实现此功能。

var EXPORTED_SYMBOLS = ["windowOpened", "windowClosed"];
var windowsOpened = 0;
function windowOpened(){
    if( windowsOpened === 0) {
        alert("The first window has been opened!");
    }
    windowsOpened++;
}

function windowClosed(){
    windowsOpened++;
    if( windowsOpened === 0) {
        alert("The last window has been closed!");
    }
}

然后,您只需附加上述事件处理程序,即可从相应的loadunload事件中调用这两种方法。

所以,这一切都很棒,一切都很,但现在你必须弄清楚获得基线Firefox附加设置的细节。幸运的是,Mozilla提供了一个方便的Addon Builder来缓解这个问题。所有关于(Javascript模块除外)的代码都应该放在ff-overlay.js文件中(假设你使用了链接的构建器)。

C#通信

我对使用C#进行进程间通信知之甚少。但是,也许我可以指出你正确的方向,让SO的聪明人填补其余部分。

我相信 COM对象是Windows上进程之间的通信方法。因此,您可以在Binary Component中构建加载项以执行通信。但是,据我所知,设置二进制组件比基于标准javascript的加载项困难得多。无论哪种方式,Mozilla都提供guide来在Visual Studio中进行设置。

如果您想远离二进制组件,您将获得SDK的启用javascript的组件。这包括套接字通信,文件,管道,sqlite数据库等。这个SO question完全解决了你所问的问题。如果是我,我会按此顺序选择它们。

  1. Sqlite数据库
  2. 命名管道
  3. 套接字
  4. (1)因为有很多可用的代码示例,并且很容易在双方实现。 (2)因为如果我完全控制了应用程序的两面,这就是我实现IPC的方式。 (3)是最后一个因为我讨厌那个垃圾(也许我在大学里偏离分布式系统)。

    TL;博士

    页面加载的东西应该非常简单。查看Addon Builder以获取FF插件,并here查看有关检测网页加载的信息。

    C#通信是可行的,并在此SO Question中解决。如果是我的话,我会使用sqlite数据库来轻松实现。

答案 1 :(得分:1)