Изменить URL перед загрузкой страницы в Firefox - PullRequest
9 голосов
/ 05 марта 2011

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

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

Ответы [ 4 ]

8 голосов
/ 06 марта 2011

Просмотр надстройки 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).

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

2 голосов
/ 28 сентября 2012

Благодаря 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, в котором был предложен этот подход.

0 голосов
/ 19 марта 2016

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

ДА, возможно.

Использовать страницу-мод изAddon-SDK, установив contentScriptWhen: "start"

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

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

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

0 голосов
/ 06 марта 2011

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

...