Как отличить вкладки Firefox? - PullRequest
0 голосов
/ 22 июня 2011

В настоящее время я разрабатываю расширение Firefox, и мне нужна возможность различать каждую открытую вкладку.

Идея состоит в том, чтобы иметь возможность связывать исходящие HTTP-запросы с вкладкой источника. Например, для каждого наблюдаемого события ' on-modify-request ' я бы знал, что оно пришло из вкладки № 2 или из вкладки № 3.

Это должно быть достаточно, чтобы различать несколько экземпляров одного и того же сайта. Перечисление по всем открытым вкладкам не будет работать, если у меня, например, открыто три вкладки "www.google.com".

Насколько я знаю, объекты tabbrowser в Mozilla не имеют уникальных идентификаторов или свойств.

Есть идеи?

1 Ответ

3 голосов
/ 22 июня 2011

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» в идеале должно быть заменено чем-то уникальным для вашего расширения (например, его именем).

...