Firefox Addon - 当域匹配某种模式时更改地址栏 url

Firefox Addon - Change address bar url when domain matches some pattern

我想知道当 domain 匹配某些 pattern 时如何更改 address bar url? url 必须在加载 url 之后更改。我尝试了以下代码。它有效,但有时无效。也许取决于加载速度,我不知道。我的意思是这段代码不太一致。我认为它可以增强。也许使用 observer 和: http-on-examine-response 怎么样?我正在寻找一致的代码。

var {getMostRecentBrowserWindow} = require("sdk/window/utils");
var {Cc, Ci, Cu} = require("chrome");

var domain = "yahoo.com";
var display_url = "http://www.mybeautifulemail.com"

function change_addressbar_url(url) {
    var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
    var uri = ioService.newURI(url, null, null);
    var win = getMostRecentBrowserWindow();
    win.gBrowser.webNavigation.setCurrentURI(uri);
}

var win = getMostRecentBrowserWindow();
win.gBrowser.addEventListener("DOMContentLoaded", function () {
    var url_regexp = new RegExp(escape_regexp(domain)+"$", "i");
    if (this.currentURI.host.match(url_regexp))
        change_addressbar_url(display_url);
}, false);

function escape_regexp(str) {
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\^$\|]/g, "\$&");
}

非常感谢!

[代码修订 001]

var {getMostRecentBrowserWindow} = require("sdk/window/utils");
var {Cc, Ci, Cu} = require("chrome");

var domain = "yahoo.com";
var display_url = "http://www.mybeautifulemail.com"

function escape_regexp(str) {
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\^$\|]/g, "\$&");
}

function change_addressbar_url(url, tab) {
    var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
    var uri = ioService.newURI(url, null, null);
    tab.linkedBrowser.webNavigation.setCurrentURI(uri);
}

var win = getMostRecentBrowserWindow();
win.gBrowser.addEventListener("DOMContentLoaded", function (e) {
    var contWin = e.target;
    if (contWin.top) {
        return; // this is a frame load so ignore it
    }
    var contDoc = contWin.document;
    var DOMWin = contWin.QueryInterface(Ci.nsIInterfaceRequestor)
                    .getInterface(Ci.nsIWebNavigation)
                    .QueryInterface(Ci.nsIDocShellTreeItem)
                    .rootTreeItem
                    .QueryInterface(Ci.nsIInterfaceRequestor)
                    .getInterface(Ci.nsIDOMWindow);

    console.log("... CODE NEVER ARRIVES THIS POINT");

    var gBrowser = DOMWin.gBrowser;
    var tab = gBrowser._getTabForContentWindow(contWin);
    var url_regexp = new RegExp(escape_regexp(domain) + "$", "i");
    if (tab.linkedBrowser.currentURI.host.match(url_regexp)) {
        change_addressbar_url(display_url, tab);
        console.log("... host matched pattern!");
    }
}, false);

您的问题是第 win.gBrowser.webNavigation.setCurrentURI 行以及 if (this.currentURI.host.match(url_regexp)) 这些行在 window 中当前选定的选项卡上起作用。您需要做的是获取正确的选项卡元素,然后在该选项卡上设置 uri,如下所示:win.gBrowser.tabContainer.childNode[0].linkedBrowser.webNavigation.setCurrentURI 将在选项卡 1 中设置地址栏,注意 .childNode[0]

这就是您获得正确标签的方式:

var win = getMostRecentBrowserWindow();
win.gBrowser.addEventListener("DOMContentLoaded", function (e) {
    var contWin = e.originalTarget.defaultView;
    if (contWin.fameElement) {
        // this is a frame load so ignore it
        return;
    }
    var contDoc = contWin.document;
    var DOMWin = contWin.QueryInterface(Ci.nsIInterfaceRequestor)
                    .getInterface(Ci.nsIWebNavigation)
                    .QueryInterface(Ci.nsIDocShellTreeItem)
                    .rootTreeItem
                    .QueryInterface(Ci.nsIInterfaceRequestor)
                    .getInterface(Ci.nsIDOMWindow);
    var gBrowser = DOMWin.gBrowser;

    var tab = gBrowser._getTabForContentWindow(contWin);
    var url_regexp = new RegExp(escape_regexp(domain)+"$", "i");
    if (tab.linkedBrowser.currentURI.host.match(url_regexp))
        change_addressbar_url(display_url, tab);
}, false);

function change_addressbar_url(url, tab) {
    var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
    var uri = ioService.newURI(url, null, null);
    tab.linkedBrowser.webNavigation.setCurrentURI(uri);
}