Использовать HTTP-запрос на изменение для перенаправления URL
Я создаю надстройку для 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.
2 ответа
Вы можете перенаправить канал, позвонив nsIHttpChannel.redirectTo
, Это невозможно после открытия канала, но в http-on-modify-request
это будет работать.
Таким образом, в вашем коде вы можете сделать что-то вроде:
Cu.import("resource://gre/modules/Services.jsm");
// ...
if (condition) {
httpChannel.redirectTo(
Services.io.newURI("http://example.org/", null, null));
}
Похоже, вы используете SDK надстройки. В этом случае ознакомьтесь с разделом Использование Chrome Authority.
Вы могли бы просто сделать
httpChannel.URI.spec = newUrl;
вместо
httpChannel.cancel(Cr.NS_BINDING_ABORTED);
...
browser.loadURI(newUrl);
Не уверен, насколько "безопасно" это будет в вашем случае, так как я не совсем уверен, как другие заголовки в запросе (например, Cookie
) будет изменяться при изменении URL-адреса, чтобы указать на совершенно другой домен на этом этапе.