我需要能够创建一个事件,以便每次用户加载新页面并关闭firefox时,我需要它在我的C#应用程序中调用一个方法来负责维护用户模型.我知道我确定需要创建一些类型的firefox扩展,我使用javascript来检查这样的事件.但是,我不知道如何将我的C#应用程序与firefox扩展集成.有人可以给我一些指导吗?
附加组件
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.这可能更接近您想要的,因为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窗口被打开和关闭,你可以简单地做:
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!");
}
}
然后,您可以简单地附加上述事件处理程序,从相应的加载和卸载事件中调用这两个方法.
所以,这一切都很棒,但现在你必须弄清楚获得基线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)因为有很多可用的代码示例,并且很容易在双方实现. (2)因为如果我完全控制了应用程序的两面,这就是我实现IPC的方式. (3)是最后一次因为我讨厌那个垃圾(也许我在大学里偏向于分布式系统).
TL;博士
页面加载的东西应该非常简单.查看Addon Builder以获取FF插件,并查看here以了解检测页面加载情况.
C#通信是可行的,并在SO Question中解决.如果是我的话,我会使用sqlite数据库来轻松实现.