我需要能够创建一个事件,以便每次用户加载新页面并关闭firefox时,我需要它在我的C#应用程序中调用一个方法来负责维护用户模型。我知道我确定需要创建一些类型的firefox扩展,我使用javascript来检查这样的事件。但是,我不知道如何将我的C#应用程序与firefox扩展集成。有人可以给我一些指导吗?
答案 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!");
}
}
然后,您只需附加上述事件处理程序,即可从相应的load
和unload
事件中调用这两种方法。
所以,这一切都很棒,一切都很,但现在你必须弄清楚获得基线Firefox附加设置的细节。幸运的是,Mozilla提供了一个方便的Addon Builder来缓解这个问题。所有关于(Javascript模块除外)的代码都应该放在ff-overlay.js文件中(假设你使用了链接的构建器)。
我对使用C#进行进程间通信知之甚少。但是,也许我可以指出你正确的方向,让SO的聪明人填补其余部分。
我相信 COM对象是Windows上进程之间的通信方法。因此,您可以在Binary Component中构建加载项以执行通信。但是,据我所知,设置二进制组件比基于标准javascript的加载项困难得多。无论哪种方式,Mozilla都提供guide来在Visual Studio中进行设置。
如果您想远离二进制组件,您将获得SDK的启用javascript的组件。这包括套接字通信,文件,管道,sqlite数据库等。这个SO question完全解决了你所问的问题。如果是我,我会按此顺序选择它们。
(1)因为有很多可用的代码示例,并且很容易在双方实现。 (2)因为如果我完全控制了应用程序的两面,这就是我实现IPC的方式。 (3)是最后一个因为我讨厌那个垃圾(也许我在大学里偏离分布式系统)。
页面加载的东西应该非常简单。查看Addon Builder以获取FF插件,并here查看有关检测网页加载的信息。
C#通信是可行的,并在此SO Question中解决。如果是我的话,我会使用sqlite数据库来轻松实现。
答案 1 :(得分:1)