Как отличить вкладки Firefox?
В настоящее время я разрабатываю расширение для Firefox, и мне нужна возможность различать каждую открытую вкладку.
Идея состоит в том, чтобы иметь возможность связывать исходящие HTTP-запросы с вкладкой источника. Например, для каждого события "при изменении запроса", которое наблюдается, я знаю, что оно пришло из вкладки № 2 или № 3.
Это должно быть достаточно, чтобы различать несколько экземпляров одного и того же сайта. Перечисление по всем открытым вкладкам не будет работать, если у меня, например, открыты три вкладки "www.google.com".
Насколько я знаю, объекты tabbrowser в Mozilla не имеют уникальных идентификаторов или свойств.
Есть идеи?
1 ответ
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" в идеале должно быть заменено чем-то уникальным для вашего расширения (например, его именем).