Можно ли узнать целевой DOMWindow для HTTPRequest?

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

Я использовал метод, приведенный в разделе HTTPObservers. И это сработало, я действительно могу извлечь соответствующие URL отправляемых запросов.

Тем не менее, еще одна вещь, которая мне действительно нужна, - это получить целевое окно DOM, в которое должно было быть загружено содержимое, относящееся к HTTPRequest. Возможно ли использовать HTTPObservers?

В приведенной выше ссылке другой способ был описан с использованием WebProgressListeners.

Я тоже это попробовал. Метод onLocationChange () возвращает только изменения местоположения в строке URL. Возможно ли каким-то образом получить URL-адреса HTTPRequest с помощью любого из этих обработчиков прогресса? Потому что если так, то, если я правильно понимаю, aWebProgress.DOM Window выдаст мне окно, которое мне нужно.

Примечание: я использую gwt для расширения и JSNI для вышеупомянутой части.

1 ответ

Решение

Обычно вы можете сделать это с помощью nsILoadContext интерфейс (к сожалению, едва документированный) подключен к запросу или его группе загрузки. Вот как вы это сделаете:

function getWindowForRequest(request)
{
  if (request instanceof Components.interfaces.nsIRequest)
  {
    try
    {
      if (request.notificationCallbacks)
      {
        return request.notificationCallbacks
                      .getInterface(Components.interfaces.nsILoadContext)
                      .associatedWindow;
      }
    } catch(e) {}

    try
    {
      if (request.loadGroup && request.loadGroup.notificationCallbacks)
      {
        return request.loadGroup.notificationCallbacks
                      .getInterface(Components.interfaces.nsILoadContext)
                      .associatedWindow;
      }
    } catch(e) {}
  }

  return null;
}

Обратите внимание, что эта функция должна возвращать null иногда - не каждый HTTP-запрос связан с окном.

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