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

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

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

4 ответа

Решение

Просмотр дополнения HTTPS Everywhere предлагает следующие шаги:

  1. Зарегистрируйте наблюдателя для темы наблюдателя "http-on-modify-request" с помощью nsIObserverService
  2. Продолжите, если предмет вашего уведомления наблюдателя является экземпляром nsIHttpChannel иsubject.URI.spec(URL) соответствует вашим критериям
  3. Создать новый nsIStandardURL
  4. Создать новыйnsIHttpChannel
  5. Замените старый канал новым. Код для выполнения этого в HTTPS Everywhere довольно плотный и, вероятно, гораздо больше, чем вам нужно. Я бы предложил начать сchrome/content/IOUtils.js,

Обратите внимание, что вы должны зарегистрировать один наблюдатель "http-on-modify-request" для всего вашего приложения, что означает, что вы должны поместить его в компонент XPCOM (см. Пример HTTPS Everywhere).

Следующие статьи не решают вашу проблему напрямую, но содержат много примеров кода, которые могут оказаться полезными:

Благодаря Iwburk, я смог сделать это.

Мы можем сделать это, переопределив nsiHttpChannel с новым делать это немного сложно, но, к счастью, это дополнение https-everywhere реализует это, чтобы заставить соединение https.

https-everywhere исходный код доступен здесь

Большая часть кода, необходимого для этого, находится в файлах

IO Util.jsChannelReplacement.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"

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

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

Вот пример выполнения 1. /questions/40391588/perehvat-i-izmenenie-dom-prezhde-chem-stranitsa-budet-otobrazhatsya-polzovatelyu/40391603#40391603

Вы можете прослушать событие загрузки страницы или, может быть, DOMContentLoaded событие вместо Или вы можете сделать nsIURIContentListener но это, наверное, сложнее.

Другие вопросы по тегам