Изменить URL перед загрузкой страницы в firefox
Я хочу префикс URL, которые соответствуют моим шаблонам. Когда я открываю новую вкладку в Firefox и ввожу соответствующий URL-адрес, страница не должна загружаться нормально, URL-адрес должен быть сначала изменен, а затем загрузка страницы должна начаться.
можно ли изменить URL-адрес с помощью дополнения Mozilla Firefox до начала загрузки страницы?
4 ответов
просмотр HTTPS везде add-on предлагает следующие шаги:
- зарегистрировать обозреватель на "http-on-modify-request" тема наблюдателя с nsIObserverService
- продолжить, если предметом вашего уведомления наблюдателя является экземпляр nsIHttpChannel и
subject.URI.spec
(URL) соответствует вашим критериям - создать новый nsIStandardURL
- создать новый
nsIHttpChannel
- замените старый канал на новый. Код для этого в HTTPS везде довольно плотный и, вероятно, намного больше, чем вам нужно. Я бы предложил начать с
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();
код заменить запрос не перенаправить.
хотя я достаточно хорошо протестировал приведенный выше код, я не уверен в его реализации. Насколько я могу понять, он копирует все атрибуты запрошенного канала и устанавливает их в канал для переопределения. После чего как-то запрошенный выход первоначальный запрос подается по новому каналу.
P. S. Я видел такой пост, в котором этот подход был предложен.
вы можете слушать загрузки страницы событие или, может быть, событие. Или вы можете сделать nsIURIContentListener
но это, вероятно, сложнее.
можно ли изменить URL-адрес с помощью дополнения Mozilla Firefox до начала загрузки страницы?
да, это возможно.
используйте page-mod аддона SDK, установив contentScriptWhen: "start"
затем после полного предотвращения разбора документа вы можете либо
- принести другой документ из того же домена и ввести его на странице.
- после
document.URL
обработка сделатьlocation.replace()
звоните
вот пример выполнения 1. https://stackoverflow.com/a/36097573/6085033