我目前正在开发Firefox扩展程序,我需要能够区分每个打开的标签页。
这个想法是能够将传出的HTTP请求与其origin选项卡相关联。例如,对于观察到的每个“ on-modify-request ”事件,我知道它来自标签#2或标签#3。
这必须足以区分同一网站的多个实例。如果我打开了三个“www.google.com”标签,那么枚举所有打开的标签页将无效。
据我所知,Mozilla中的tabbrowser对象没有任何唯一标识符或属性。
有什么想法吗?
答案 0 :(得分:3)
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 UI或不同的浏览器窗口。您可以在该元素上设置自己的expando属性以获取选项卡标识符(选择唯一的名称以避免与其他扩展冲突)。像这样:
if (!("_myExtensionTabId" in browser))
browser._myExtensionTabId = ++maxTabId;
var tabId = browser._myExtensionTabId;
这里maxTabId
将是一个最初为零的全局变量。理想情况下,“myExtension”会被您的扩展程序所特有的内容所取代(例如,其名称)。