http-on-modify-request
дает вам фактический объект запроса. Оттуда вам нужно получить соответствующее окно, путь для этого - nsILoadContext здесь. Я использую этот код:
function getRequestWindow(request)
{
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;
}
Это окно контента (и, возможно, даже фрейм). Так что вам нужно найти соответствующую вкладку - используйте gBrowser.getBrowserForDocument () . Как это:
var wnd = getRequestWindow(request);
var browser = (wnd ? gBrowser.getBrowserForDocument(wnd.top.document) : null);
Теперь у вас есть элемент <browser>
, к которому относится запрос - если таковой имеется. Потому что запрос также может исходить из пользовательского интерфейса Firefox или другого окна браузера. Вы можете установить собственное свойство expando для этого элемента, чтобы получить идентификатор вкладки (выберите уникальное имя, чтобы избежать конфликтов с другими расширениями). Примерно так:
if (!("_myExtensionTabId" in browser))
browser._myExtensionTabId = ++maxTabId;
var tabId = browser._myExtensionTabId;
Здесь maxTabId
будет глобальной переменной, которая изначально равна нулю. И «myExtension» в идеале должно быть заменено чем-то уникальным для вашего расширения (например, его именем).