Изменить URL перед загрузкой страницы в Firefox
Я хочу добавить префикс URL, который соответствует моим шаблонам. Когда я открываю новую вкладку в Firefox и ввожу соответствующий URL-адрес, страница не должна загружаться нормально, сначала необходимо изменить URL-адрес, а затем начать загрузку страницы.
Можно ли изменить URL-адрес с помощью аддона Mozilla Firefox до начала загрузки страницы?
4 ответа
Просмотр дополнения HTTPS Everywhere предлагает следующие шаги:
- Зарегистрируйте наблюдателя для темы наблюдателя "http-on-modify-request" с помощью nsIObserverService
- Продолжите, если предмет вашего уведомления наблюдателя является экземпляром nsIHttpChannel и
subject.URI.spec
(URL) соответствует вашим критериям - Создать новый nsIStandardURL
- Создать новый
nsIHttpChannel
- Замените старый канал новым. Код для выполнения этого в HTTPS Everywhere довольно плотный и, вероятно, гораздо больше, чем вам нужно. Я бы предложил начать с
chrome/content/IOUtils.js
,
Обратите внимание, что вы должны зарегистрировать один наблюдатель "http-on-modify-request" для всего вашего приложения, что означает, что вы должны поместить его в компонент XPCOM (см. Пример HTTPS Everywhere).
Следующие статьи не решают вашу проблему напрямую, но содержат много примеров кода, которые могут оказаться полезными:
Благодаря Iwburk, я смог сделать это.
Мы можем сделать это, переопределив nsiHttpChannel
с новым делать это немного сложно, но, к счастью, это дополнение https-everywhere
реализует это, чтобы заставить соединение https.
https-everywhere
исходный код доступен здесь
Большая часть кода, необходимого для этого, находится в файлах
IO Util.js
ChannelReplacement.js
Мы можем работать только с вышеуказанными файлами, если у нас есть базовые переменные, такие как Cc,Ci, настроенные и функция xpcom_generateQI
определены.
var httpRequestObserver =
{
observe: function(subject, topic, data) {
if (topic == "http-on-modify-request") {
var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
var requestURL = subject.URI.spec;
if(isToBeReplaced(requestURL)) {
var newURL = getURL(requestURL);
ChannelReplacement.runWhenPending(subject, function() {
var cr = new ChannelReplacement(subject, ch);
cr.replace(true,null);
cr.open();
});
}
}
},
get observerService() {
return Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
},
register: function() {
this.observerService.addObserver(this, "http-on-modify-request", false);
},
unregister: function() {
this.observerService.removeObserver(this, "http-on-modify-request");
}
};
httpRequestObserver.register();
Код заменит запрос не перенаправляя.
Хотя я достаточно хорошо протестировал приведенный выше код, я не уверен в его реализации. Насколько я могу разобрать, он копирует все атрибуты запрошенного канала и устанавливает их для канала, который будет переопределен. После чего каким-то образом вывод, запрошенный исходным запросом, подается с использованием нового канала.
PS Я видел SO сообщение, в котором этот подход был предложен.
Можно ли изменить URL-адрес с помощью аддона Mozilla Firefox до начала загрузки страницы?
Да, это возможно.
Используйте страницу-мод Add-SDK, установив contentScriptWhen: "start"
Затем, после полного предотвращения разбора документа, вы можете
- получить другой документ из того же домена и вставить его на страницу.
- после некоторого
document.URL
обработка сделатьlocation.replace()
вызов
Вот пример выполнения 1. /questions/40391588/perehvat-i-izmenenie-dom-prezhde-chem-stranitsa-budet-otobrazhatsya-polzovatelyu/40391603#40391603
Вы можете прослушать событие загрузки страницы или, может быть, DOMContentLoaded
событие вместо Или вы можете сделать nsIURIContentListener
но это, наверное, сложнее.