【问题标题】:XUL getNotificationBoxXUL getNotificationBox
【发布时间】:2010-12-10 05:32:46
【问题描述】:

我为 Firefox 开发了一个小插件,我在其中保存了一些 http 代理,因为我经常使用它们。所有代理一旦加载到 ff 中,就会在弹出窗口中询问用户名和密码。我的插件已保存此信息,因此我需要找出一种方法来设置显示的通知框中输入字段的值,以便对代理服务器进行身份验证,并避免每次更改时都必须手动输入这些详细信息代理。

我必须承认我也是 XUL 和 javascript 的绝对初学者。我在网上搜索并测试了各种 sn-ps 但我无法获取通知内容,确定它是否是我要查找的内容并输入正确的值。

我有一段代码可能接近我想要的,但它似乎不起作用:

function getNotificationBox() {
        const Ci = Components.interfaces;

        function getChromeWindow(aWindow) {
                var chromeWin = aWindow
                .QueryInterface(Ci.nsIInterfaceRequestor)
                .getInterface(Ci.nsIWebNavigation)
                .QueryInterface(Ci.nsIDocShellTreeItem)
                .rootTreeItem
                .QueryInterface(Ci.nsIInterfaceRequestor)
                .getInterface(Ci.nsIDOMWindow)
                .QueryInterface(Ci.nsIDOMChromeWindow);
                return chromeWin;
        }

        var notifyWindow = window.top;

        var chromeWin = getChromeWindow(notifyWindow);

        var notifyBox = chromeWin.getNotificationBox(notifyWindow);

        return notifyBox;
}

function clickNotificationButton() {
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

        var box = getNotificationBox();
        var bar = box.getNotificationWithValue("is requesting a username and password");
        var button = bar.getElementsByTagName("button").item("OK");
        button.doCommand();
}

window.addEventListener("DOMNodeInserted", function(e) { clickNotificationButton;
}, false);

您在此处看到的“正在请求用户名和密码”的字符串是通知窗口中显示的文本的一部分。如果我在这里做错了什么,有人可以发现吗?

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: javascript firefox xul


    【解决方案1】:

    您是否正确获取了通知框?您可以将 getChromeWindow 函数简化为:

    function getChromeWindow(aWindow) {
        var chromeWin = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
                               .getInterface(Ci.nsIWebNavigation)
                               .QueryInterface(Ci.nsIDocShell)
                               .chromeEventHandler.ownerDocument.defaultView;
        return chromeWin;
    }
    

    (http://mxr.mozilla.org/mozilla-central/source/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js#1208)

    您可能还需要一个 .wrappedJSObject 到您的 chromeWin 变量。

    (http://mxr.mozilla.org/mozilla-central/source/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js#1295)

    【讨论】:

    • 您需要 .wrappedJSObject 在 Firefox 4 之前的版本上,因为它们使用 XPCNativeWrapper 始终包装从包装对象返回的属性,但 Firefox 4 使用 XrayWrapper 注意到 chromeEventHandler 是 chrome 对象,因此不用费心包装它。
    【解决方案2】:

    根据您的描述,听起来您尝试拦截的对话框实际上是身份验证对话框,而不是通知栏(在输入密码以确认您是否要保存/更改密码后出现通知栏)。换句话说,听起来你想修复 Mozilla bug 223636 (https://bugzilla.mozilla.org/show_bug.cgi?id=223636)。 Firefox 4 测试版实际上已经针对这种情况进行了修复(https://bugzilla.mozilla.org/show_bug.cgi?id=521467),但默认情况下它是禁用的(需要使用 about:config 更改隐藏的首选项)。

    不幸的是,您粘贴的代码对此没有多大用处。要从当前发布的版本中的扩展中捕获身份验证对话框,您可能需要一个遵守“common-dialog-loaded”主题的代码和来自http://mxr.mozilla.org/mozilla-central/source/toolkit/components/passwordmgr/test/prompt_common.js 的对话框处理逻辑的组合。如果您在 irc.mozilla.org/#extdev 上找到我,我可以提供更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多