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

mic*_*lle 5 javascript connection firefox-addon c#-4.0

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

ska*_*bes 3

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

附加组件

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

要检测页面加载,您可以在 window 中注册DOMContentLoaded事件的侦听器。

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

或者,您可以注册nsIWebProgressListener来侦听位置更改。这可能更接近您想要的,因为DOMContentLoadediframe 也会触发。

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);
Run Code Online (Sandbox Code Playgroud)

要检测 Firefox 打开/关闭,您需要首先了解 Firefox 附加组件如何在多个窗口中工作。当 Firefox 的新窗口启动时,基本上会运行 2 个独立的代码副本。因此,如果您关心 Firefox窗口的打开和关闭,您可以简单地执行以下操作:

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);
Run Code Online (Sandbox Code Playgroud)

但是,您很可能希望将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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以简单地附加上述事件处理程序,以从其相应的事件中调用这两个load方法unload

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

C# 通信

我对 C# 的进程间通信知之甚少。然而,也许我可以为你指明正确的方向,并让 SO 的聪明人填补剩下的部分。

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

如果您想远离二进制组件, 则可以使用 SDK 的支持 javascript 的组件。这包括套接字通信、文件、管道、sqlite 数据库等。这个问题 正好解决了您要问的问题。如果是我的话,我会按照这个顺序来选择。

  1. SQLite数据库
  2. 命名管道
  3. 插座

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

太长了;博士

页面加载的内容应该非常简单。查看Addon Builder以开始使用 FF 插件,并在此处查看有关检测页面加载的信息。

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