重访 - 在Firefox中添加TOP LEVEL页面之前修改URL

时间:2014-10-07 15:50:57

标签: javascript windows url firefox firefox-addon

我想知道如何在加载时使用Firefox插件修改页面的URL。我被引导到诸如the following之类的建议。具体来说,当用户前往" https://www.google.com"通过地址栏,我想重定向到" https://www.google.co.uk"。

出于我的特定目的,上述解决方案几乎可行,但它重定向了太多的URL。我发现的一个问题如下:虽然我每次都可以重定向,但有时我会不想重定向。例如,似乎在Windows中,我不仅在当前标签的网址是常规Google时重定向,而且每当页面发出的某些查询包含上述链接时(例如新闻文章),我也会重定向。

有没有办法通过只检查当前标签的URL来使用Mozilla的观察框架进行重定向?如果没有,是否有一些替代解决方案仍然使用Mozilla的附加SDK?

编辑:以下是我的错误源代码。

var myObserver = {
    register: function() {
        var observerService = Components.classes["@mozilla.org/observer-service;1"]
        .getService(Components.interfaces.nsIObserverService);
        observerService.addObserver(this, TOPIC_MODIFY_REQUEST, false);
    },
    //observe function to capture the changed event
    observe : function(aSubject, aTopic, aData) {
        if (TOPIC_MODIFY_REQUEST == aTopic ) {
            var url;
            aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);

            url = aSubject.URI.spec;
            url = encodeURIComponent(url);


            if (url.indexOf("google.nl") !=-1 || url.indexOf("hl%3Dnl") !=-1
               || url.indexOf("google.com%2Fnl") !=-1 || url == "https%3A%2F%2Fwww.google.com" 
               || url == "https%3A%2F%2Fwww.google.com%2Fncr" || url == 
               "https%3A%2F%2Fwww.google.com%2F%3Fgws_rd%3Dssl")
            {
                aSubject.cancel(Components.results.NS_BINDING_ABORTED);
                loadURL("https://www.google.co.uk/");
            }
    }
}

function loadURL(url) {
    // Set the browser window's location to the incoming URL
    window._content.document.location = url;
    // Make sure that we get the focus
    window.content.focus();
}

1 个答案:

答案 0 :(得分:1)

检查LOAD_INITIAL_DOCUMENT_URI标志,如果是,则中止/重新标记它。否则不要。如果此标志存在,则它是顶级页面。

编辑: 根据你的代码,你需要测试QueryInterface的aSubject,如果它有这样的标志:

var oHttp = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
if (oHttp.loadFlags & Components.interfaces.nsIHttpChannel.LOAD_INITIAL_DOCUMENT_URI) {
  //is top level load
}