javascript - 使用 HTTP-on-modify-request 重定向 URL

标签 javascript firefox-addon http-redirect firefox-addon-restartless firefox-addon-overlay

我正在为 Firefox 构建一个附加组件,如果 URL 匹配某些条件,它将请求重定向到新 URL。我已经尝试过了,但不起作用。

我在 HTTP-on-modify-request 上注册一个观察者来处理 URL,如果 URL 符合我的条件,我将重定向到新的 URL。

这是我的代码:

var Cc = Components.classes;
var Ci = Components.interfaces;
var Cr = Components.results;

var newUrl = "https://google.com";

function isInBlacklist(url) {
// here will be somemore condition, I just use youtube.com to test
    if (url.indexOf('youtube.com') != -1) {
        return true;
    }
    return false;
}

exports.main = function(options,callbacks) {
// Create observer
httpRequestObserver =
{
    observe: function (subject, topic, data) {
        if (topic == "http-on-modify-request") {
            var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
            var uri = httpChannel.URI;
            var domainLoc = uri.host;

            if (isInBlacklist(domainLoc) === true) {
                httpChannel.cancel(Cr.NS_BINDING_ABORTED);
                var gBrowser = utils.getMostRecentBrowserWindow().gBrowser;
                var domWin = channel.notificationCallbacks.getInterface(Ci.nsIDOMWindow);
                var browser = gBrowser.getBrowserForDocument(domWin.top.document);
                browser.loadURI(newUrl);
            }
        }
    },

    register: function () {
        var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
        observerService.addObserver(this, "http-on-modify-request", false);
    },

    unregister: function () {
        var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
        observerService.removeObserver(this, "http-on-modify-request");
    }
};
//register observer
httpRequestObserver.register();
};

exports.onUnload = function(reason) {
    httpRequestObserver.unregister();
};

我是 Firefox 插件开发的新手。

最佳答案

您可以通过调用nsIHttpChannel.redirectTo来重定向 channel 。 一旦 channel 打开,这是不可能的,但在 http-on-modify-request 中它可以工作。

因此,在您的代码中,您可以执行以下操作:

Cu.import("resource://gre/modules/Services.jsm");
// ...

if (condition) {
  httpChannel.redirectTo(
    Services.io.newURI("http://example.org/", null, null));
}

看来您可能正在使用附加 SDK。在这种情况下,请阅读 Using Chrome Authority .

关于javascript - 使用 HTTP-on-modify-request 重定向 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24947233/

相关文章:

ASP.NET Mvc Api : Set cookie then 302/303 Redirect loses the cookie

javascript - 将对象数组缩减为嵌套数组

JavaScript:在 div.container < window.height 时做一些事情

c# - 文本框接受 Javascript 中的以下值吗?

javascript - 调试 Firefox 扩展 - 如何查看 XPI 中包含的所有 JS 和 XUL 文件?

google-chrome - Chrome 会记住 301 重定向多久?

javascript - 用 JavaScript 实现的 Karatsuba 算法不准确

javascript - 使用 Mozmill 测试 Firefox 插件

javascript - 尝试在 Firefox 扩展中获取 HTTP POST 请求

java - 如何在 java 中跟踪重定向的 url?