webRequest.StreamFilter

StreamFilter 是一个用于监视和修改 HTTP 响应的对象。

要创建 StreamFilter,请调用 webRequest.filterResponseData(),并传入您想要过滤的 web 请求的 ID。

您可以将流过滤器看作位于网络堆栈和浏览器渲染引擎之间。过滤器在从网络接收到 HTTP 响应数据时会收到这些数据。在将数据传递给用于解析和渲染的渲染引擎之前,它可以检查和修改数据。过滤器完全控制响应体,在没有监听器或写入调用时,默认行为是拥有一个没有内容且永不关闭的流。

过滤器会生成四种不同的事件:

  • onstart:当过滤器即将开始接收响应数据时触发。
  • ondata:当过滤器接收到一部分响应数据并可供检查或修改时触发。
  • onstop:当过滤器完成接收响应数据时触发。
  • onerror:如果在初始化和操作过滤器时发生错误,则触发。

您可以通过为每个事件的属性分配一个监听器函数来监听它。

js
filter.onstart = (event) => {
  console.log("started");
};

请注意,在任何事件监听器执行期间,请求都会被阻塞。

过滤器提供了一个 write() 函数。从 onstart 事件开始,您可以随时使用此函数将数据写入输出流。

如果您为过滤器的任何事件分配了监听器,那么传递给渲染引擎的所有响应数据都将通过您对 write() 的调用来提供。因此,如果您添加了一个监听器但没有调用 write(),则渲染的页面将是空白的。

完成与响应的交互后,请调用以下任一函数:

  • disconnect():此函数将过滤器与请求断开连接,以便剩余的响应被正常处理。
  • close():此函数会关闭请求,因此不会再处理其他响应数据。

过滤器还提供了 suspend()resume() 函数来暂停和恢复请求。

方法

webRequest.StreamFilter.close()

关闭请求。

webRequest.StreamFilter.disconnect()

将过滤器与请求断开连接。

webRequest.StreamFilter.resume()

恢复请求的处理。

webRequest.StreamFilter.suspend()

暂停请求的处理。

webRequest.StreamFilter.write()

将一些数据写入输出流。

属性

webRequest.StreamFilter.ondata

当有传入数据可用时调用的事件处理程序。

webRequest.StreamFilter.onerror

发生错误时调用的事件处理程序。

webRequest.StreamFilter.onstart

即将开始接收数据时调用的事件处理程序。

webRequest.StreamFilter.onstop

流没有更多数据可提供并已关闭时调用的事件处理程序。

webRequest.StreamFilter.error

当调用 webRequest.StreamFilter.onerror 时,将描述错误。

webRequest.StreamFilter.status

描述流的当前状态。

示例

此代码监听 onstartondataonstop。它会记录这些事件以及作为 ArrayBuffer 的响应数据本身。

js
function listener(details) {
  let filter = browser.webRequest.filterResponseData(details.requestId);

  filter.onstart = (event) => {
    console.log("started");
  };

  filter.ondata = (event) => {
    console.log(event.data);
    filter.write(event.data);
  };

  filter.onstop = (event) => {
    console.log("finished");
    filter.disconnect();
  };

  // return {}; // not needed
}

browser.webRequest.onBeforeRequest.addListener(
  listener,
  { urls: ["https://example.org/"], types: ["main_frame"] },
  ["blocking"],
);

浏览器兼容性