连接Firefox扩展与c#应用程序

Connect Firefox extension with C# application

本文关键字:应用程序 扩展 Firefox 连接      更新时间:2023-09-26

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

我将帮助您解决问题中我熟悉的部分(基于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来监听位置的变化。这可能更接近您想要的,因为DOMContentLoaded也为iframe触发。

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模块的代码共享机制实现的。在应用程序的生命周期内,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来解决这个问题。about的所有代码(Javascript模块除外)都应该放在off -overlay.js文件中(假设您使用了链接的构建器)。

c#沟通

我对c#的进程间通信知之甚少。然而,也许我可以给你指出正确的方向,让那些聪明的人来填补剩下的部分。

我相信COM对象是Windows上进程间通信的一种方法。因此,您可以在附加组件中构建二进制组件来执行通信。然而,据我所知,设置二进制组件比标准的基于javascript的插件要困难得多。无论哪种方式,Mozilla都提供了在Visual Studio中设置它的指南。

如果你不想使用二进制组件,那么你只能使用SDK中启用javascript的组件。这包括套接字通信、文件、管道、sqlite数据库等。这个问题正好回答了你要问的问题。如果是我,我会按这个顺序选择它们。

  1. Sqlite数据库
  2. 命名管道
  3. 套接字

(1),因为有很多代码示例可用于此,并且很容易在两边实现。(2)因为这将是我实现IPC的方式,如果我被赋予对应用程序双方的完全控制。(3)是最后一个,因为我讨厌那些废话(也许我在大学里对分布式系统有偏见)。

<标题> tl;博士

页面加载应该非常简单。查看Addon Builder来使用FF插件,并在这里查看如何检测页面加载。

c#通信是可行的,并在此SO问题中解决。

如果是我,我会用sqlite数据库来做。