是否有可能知道HTTPRequest的目标DOMWindow

Is it possible to know the target DOMWindow for an HTTPRequest?

本文关键字:目标 DOMWindow HTTPRequest 有可能 是否      更新时间:2023-09-26

我正在开发一个Firefox扩展,它要求我通过过滤掉一些HTTPRequest来拦截页面加载。我使用此处给出的说明完成了此操作。请注意,我的问题来自此链接的内容。

我使用了HTTPObservers部分下给出的方法。它奏效了,我确实能够提取正在发送的请求的相应网址。

但是,我真正需要的另一件事是获取目标 DOM 窗口,其中与 HTTPRequest 相关的内容即将加载。可以使用HTTPObservers吗?

在上面的链接中,描述了使用WebProgressListeners的另一种方式。

我也试过了。onLocationChange() 方法只返回 url 栏中的位置更改。是否有可能以某种方式使用这些进度侦听器中的任何一个来获取HTTPRequest网址?因为如果是这样,那么如果我理解正确,aWebProgress.DOMWindow会给我我需要的窗口。

注意:我使用 gwt 作为扩展,使用 JSNI 作为上述部分。

通常,您可以使用附加到请求或其负载组nsILoadContext接口(遗憾的是几乎没有文档记录)来做到这一点。以下是您将如何执行此操作:

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 请求都与窗口相关联。