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"],
);

瀏覽器相容性