2012-05-23 2 views
4

Я разрабатываю расширение firefox, которое требует от меня перехвата загрузок страницы, отфильтровывая некоторые HTTPRequests. Я сделал это, используя приведенные инструкции here. Обратите внимание, что мой вопрос основан на содержании этой ссылки.Возможно ли узнать цель DOMWindow для HTTPRequest?

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

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

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

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

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

ответ

7

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

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 связан с окном.

+0

Большое спасибо за ответ! У меня был маленький вопрос. Этот метод предполагается использовать по методу HTTPObserver, упомянутому в вопросе? Если это так, для параметра «запрос» в функции было бы достаточно передать параметр aSubject (в контексте [HTTPObsevers] (https://developer.mozilla.org/en/XUL_School/Intercepting_Page_Loads#HTTP_Observers))? –

+1

@SaurabhAgarwal: Да по обоим вопросам - предполагается получить 'nsIRequest' /' nsIChannel', который соответствует параметру 'aSubject' в наблюдателе' http-on-modify-request'. –

+0

можно ли получить docShell из loadContext, используя этот метод? Я хочу получить xul-элементы вкладки, в которую она загрузилась. Я могу получить все html-окна и dom с loadContext fine https://github.com/Noitidart/loadcontext-and-http-modify-observer – Noitidart

Смежные вопросы