Как сделать редирект в Firefox page-mod?
Я пытаюсь перенести расширение Google Chrome в Firefox Add-On SDK, и мне нужно расширение, чтобы фильтровать страницы с моего сайта и делать редиректы. Например, если пользователь открывает "http://example.com/special" мне нужно отправить его в "http://example.com/redirect" в той же вкладке браузера.
Вот как я пытался это сделать:
var pageMod = require("page-mod").PageMod({
include: "*",
contentScriptWhen: "start",
contentScript: "",
onAttach: function(worker) {
if (worker.tab.url == worker.url &&
worker.url.indexOf("example.com/special") > -1) {
worker.tab.url = "http://example.com/redirect";
}
}
});
Проблема в том, что мой браузер иногда зависает после перенаправления (сразу после того, как была создана новая страница отображается на вкладке). Что я делаю не так?
использование Firefox 16.0.2, Add-On SDK 1.11
1 ответ:
Лучше всего будет сделать это на более низком уровне:
const { Cc, Ci, Cr } = require("chrome"); var events = require("sdk/system/events"); var utils = require("sdk/window/utils"); function listener(event) { var channel = event.subject.QueryInterface(Ci.nsIHttpChannel); var url = event.subject.URI.spec; // Here you should evaluate the url and decide if make a redirect or not. // Notice that "shouldIredirect" and "newUrl" are guessed objects you must replace! if (shouldIredirect) { // If you want to redirect to another url, the you have to abort current request // See https://developer.mozilla.org/en-US/docs/XUL/School_tutorial/Intercepting_Page_Loads channel.cancel(Cr.NS_BINDING_ABORTED); // Aet the current gbrowser object (since the user may have several windows and tabs) and load the fixed URI var gBrowser = utils.getMostRecentBrowserWindow().gBrowser; var domWin = channel.notificationCallbacks.getInterface(Ci.nsIDOMWindow); var browser = gBrowser.getBrowserForDocument(domWin.top.document); browser.loadURI(newUrl); } else { // do nothing, let Firefox keep going on the normal flow } }; }; exports.main = function() { events.on("http-on-modify-request", listener); };
Если вы хотите увидеть этот код в actiton, посмотрите на этот аддон (отказ от ответственности: это аддон, который я разработал).