重新访问-在Firefox中加载顶级页面之前修改URL

Revisited - Modify URL Before TOP LEVEL Page Loading in Firefox

本文关键字:URL 修改 加载 新访问 访问 Firefox      更新时间:2023-09-26

我想知道如何在加载页面时使用Firefox插件修改页面的URL。我收到了以下建议。具体而言,当用户转到"https://www.google.com"通过地址栏,我想重定向到"https://www.google.co.uk".

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

有没有任何方法可以使用Mozilla的观察者框架通过只检查当前选项卡的URL来重定向?如果没有,是否有其他解决方案仍然使用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();
}

检查LOAD_INITIAL_DOCUMENT_URI标志,如果是,则中止/重新提取。否则不要。如果这个标志存在,它就是顶级页面。

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

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