mic*_*lle 5 javascript connection firefox-addon c#-4.0
我需要能够创建一个事件,以便每次用户加载新页面并关闭firefox时,我需要它在我的C#应用程序中调用一个方法来负责维护用户模型.我知道我确定需要创建一些类型的firefox扩展,我使用javascript来检查这样的事件.但是,我不知道如何将我的C#应用程序与firefox扩展集成.有人可以给我一些指导吗?
我将帮助您解决问题中我熟悉的部分(基于 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# 的进程间通信知之甚少。然而,也许我可以为你指明正确的方向,并让 SO 的聪明人填补剩下的部分。
我相信 COM 对象是 Windows 上进程之间通信的一种方法。因此,您可以在附加组件中构建二进制组件来执行通信。然而,据我了解,设置二进制组件比标准的基于 javascript 的附加组件要困难得多。无论哪种方式,Mozilla 都提供了在 Visual Studio 中进行设置的指南。
如果您想远离二进制组件, 则可以使用 SDK 的支持 javascript 的组件。这包括套接字通信、文件、管道、sqlite 数据库等。这个问题 正好解决了您要问的问题。如果是我的话,我会按照这个顺序来选择。
(1) 因为有很多可用的代码示例,并且双方都很容易实现。(2) 因为如果我能够完全控制应用程序的双方,这将是我实现 IPC 的方式。(3) 是最后一个,因为我讨厌那些废话(也许我对大学里的分布式系统有偏见)。
页面加载的内容应该非常简单。查看Addon Builder以开始使用 FF 插件,并在此处查看有关检测页面加载的信息。
C# 通信是可行的,并在此SO Question中得到解决。如果是我的话,我会使用 sqlite 数据库来轻松完成此操作。
| 归档时间: |
|
| 查看次数: |
2687 次 |
| 最近记录: |