【问题标题】:Connect Firefox extension with C# application将 Firefox 扩展与 C# 应用程序连接
【发布时间】:2011-04-17 06:58:28
【问题描述】:

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

【问题讨论】:

    标签: javascript c#-4.0 connection firefox-addon


    【解决方案1】:

    我会帮助您解决我熟悉的部分问题(基于 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 窗口时,您基本上有 2 个单独的代码副本在运行。因此,如果您关心 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!");
        }
    }
    

    然后您可以简单地附加上述事件处理程序,从它们对应的loadunload 事件中调用这两个方法。

    所以,这一切都很好,但现在您必须纠结于获取基线 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. Sqlite 数据库
    2. 命名管道
    3. 套接字

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

    tl;博士

    页面加载的东西应该很简单。查看 Addon Builder 以开始使用 FF 插件,查看 here 以了解检测页面加载。

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

    【讨论】:

    • 感谢您的详尽回答。我非常感激。我会试试这些!!
    • 我总是尝试帮助人们开始开发附加组件,因为没有一个庞大的社区。如果您有任何我可以回答的具体问题,请给我发电子邮件!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2013-12-25
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多