【问题标题】:Firefox addon which refreshes the tap and auto resend data刷新点击和自动重新发送数据的 Firefox 插件
【发布时间】:2014-12-02 21:47:15
【问题描述】:

我正在尝试制作一个 firefox 插件,它会在某些情况下自动重新加载页面。

首先我将 contentScript 添加到选项卡中,以在我的插件中获取页面上的一些信息

tab.attach({
            contentScript:self.port.emit...

我让它工作到刷新点

tab.reload();

但是每次“如果它应该重新发送数据”时都会弹出一个警报。

我想自动重新发送数据。 我该怎么做?在哪里做?在附加组件中还是在 contentScript 中? 和 Load Flags 常量有关系吗?

【问题讨论】:

  • 你能按照提示的内容复制粘贴吗,我无法显示该弹出窗口,但一旦我有了它的文本,我就可以在 mxr 上四处寻找它。
  • 不确定它是否有助于导致它是德语:“Um diese Seite anzuzeigen, müssen die von Firefox gesendeten Daten erneut gesendet werden, wodurch alle zuvor durchgeführten Aktionen wiederholt werden (wie eine Suche oder eine Bestellungsaufgabe)。 "我可以点击“erneut senden”和“abbrechen”
  • 这有帮助,谢谢 好的,所以这些东西是从这个 cpp 文件中调用的:mxr.mozilla.org/mozilla-release/source/docshell/base/… 所以我们必须在这里寻找一些东西,所以乍一看,如果你明智地将 LOAD_CMD_RELOAD 标志从 loadType 中取出,它不会味精,但它会搞砸其他的东西,所以我们不想这样做。
  • 哦,好的,谢谢。我发现这个链接看起来有点像在谈论同一个link,但问题是它关闭了“确认弹出窗口”。
  • 哦,还有我想到的另一件事。是否有可能从 ff 插件中“单击”确认?我也不知道该怎么做。 (我只发现了如何制作弹出窗口而不是如何操作它window.confirm()

标签: post firefox-addon reload firefox-addon-sdk page-refresh


【解决方案1】:

这会在提示打开时单击接受按钮。但是您会看到大约几百毫秒的提示窗口。

我不得不使用 setTimeout 和 0 等待时间,否则 aDOMWindow.args 属性和 aDOMWindow.Dialog 和一堆其他的东西将是未定义的或 null 太奇怪了。但这有效:

var stringBundle = Services.strings.createBundle('chrome://browser/locale/appstrings.properties');

try {
    windowListener.unregister();
} catch (ignore) {}

var windowListener = {
    //DO NOT EDIT HERE
    onOpenWindow: function(aXULWindow) {
        // Wait for the window to finish loading
        let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
        aDOMWindow.addEventListener('load', function() {
            aDOMWindow.removeEventListener('load', arguments.callee, false);
            windowListener.loadIntoWindow(aDOMWindow, aXULWindow);
        }, false);
    },
    onCloseWindow: function(aXULWindow) {},
    onWindowTitleChange: function(aXULWindow, aNewTitle) {},
    register: function() {
        // Load into any existing windows
        let XULWindows = Services.wm.getXULWindowEnumerator(null);
        while (XULWindows.hasMoreElements()) {
            let aXULWindow = XULWindows.getNext();
            let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
            windowListener.loadIntoWindow(aDOMWindow, aXULWindow);
        }
        // Listen to new windows
        Services.wm.addListener(windowListener);
    },
    unregister: function() {
        // Unload from any existing windows
        let XULWindows = Services.wm.getXULWindowEnumerator(null);
        while (XULWindows.hasMoreElements()) {
            let aXULWindow = XULWindows.getNext();
            let aDOMWindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
            windowListener.unloadFromWindow(aDOMWindow, aXULWindow);
        }
        //Stop listening so future added windows dont get this attached
        Services.wm.removeListener(windowListener);
    },
    //END - DO NOT EDIT HERE
    loadIntoWindow: function(aDOMWindow, aXULWindow) {
        if (!aDOMWindow) {
            return;
        }
        if (aDOMWindow.location == 'chrome://global/content/commonDialog.xul') {
            var repostString = stringBundle.GetStringFromName('confirmRepostPrompt');
            var repostStringFormatted = stringBundle.formatStringFromName('confirmRepostPrompt', [aDOMWindow.Application.name], 1);
            aDOMWindow.setTimeout(function() {
                console.log('setimeout val 00:', aDOMWindow.args)
                    //aDOMWindow.args and aDOMWindow.Dialog is not available till after setTimeout of 0 so weird
                if (aDOMWindow.args.text == repostString || aDOMWindow.args.text == repostStringFormatted) {
                    console.log('this is resend prompt so accept it');
                    //aDOMWindow.Dialog.ui.button0.click(); //doesnt work
                    //aDOMWindow.Dialog.onButton0(); // doesnt work
                    //aDOMWindow.ondialogaccept(); //doesnt work
                    var dialog = aDOMWindow.document.getElementById('commonDialog');
                    var btnAccept = aDOMWindow.document.getAnonymousElementByAttribute(dialog, 'dlgtype', 'accept');
                    btnAccept.click();
                    console.log('clicked');
                }
            }, 0);
        }

    },
    unloadFromWindow: function(aDOMWindow, aXULWindow) {
        if (!aDOMWindow) {
            return;
        }
    }
};

windowListener.register();

打开暂存器。将环境设置为浏览器。运行代码。刷新页面以获得提示,您会看到它被点击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 2012-03-31
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2013-03-21
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多