Изменить URL перед загрузкой страницы в firefox

Я хочу префикс URL, которые соответствуют моим шаблонам. Когда я открываю новую вкладку в Firefox и ввожу соответствующий URL-адрес, страница не должна загружаться нормально, URL-адрес должен быть сначала изменен, а затем загрузка страницы должна начаться.

можно ли изменить URL-адрес с помощью дополнения Mozilla Firefox до начала загрузки страницы?

4 ответов


просмотр HTTPS везде add-on предлагает следующие шаги:

  1. зарегистрировать обозреватель на "http-on-modify-request" тема наблюдателя с nsIObserverService
  2. продолжить, если предметом вашего уведомления наблюдателя является экземпляр nsIHttpChannel и subject.URI.spec (URL) соответствует вашим критериям
  3. создать новый nsIStandardURL
  4. создать новый nsIHttpChannel
  5. замените старый канал на новый. Код для этого в 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"

затем после полного предотвращения разбора документа вы можете либо

  1. принести другой документ из того же домена и ввести его на странице.
  2. после document.URL обработка сделать location.replace() звоните

вот пример выполнения 1. https://stackoverflow.com/a/36097573/6085033