根据具有 Chrome 扩展名的模式拦截 URL

Intercept URLs based on patterns with Chrome extension

场景:

我要在 webRequest.onBeforeRequest 中使用的 URL 个模式列表包含 bit.ly。然后我点击 URL 位。ly/2qlHCT 重定向到 google.com。在这种情况下,我会显示一条类似 "request was blocked" 的消息,但我不想通过在 onBeforeRequest 的回调中返回 { cancel: true } 来实际阻止请求。

如果用户试图在同一个选项卡中正常访问 google.com,那么我将显示一条消息 "nothing was blocked"。 因此,这类似于 Adblock 在为特定域添加过滤器时所做的事情。如果域被允许,Adblock 的图标变为绿色,否则变为红色。

我知道我可以使用 chrome.storage 来保存有关被阻止请求的信息,但是当 URL 模式不匹配时我该如何实现?

解决方案非常简单。我使用 chrome.tabs.query 来阻止选项卡,但这是一种异步方法,我需要一个同步响应。使用 localStorage 成功了。

function blockRequest(tabId) {
  let tabs = localStorage.blocked_tabs;
  tabs = (tabs !== undefined) ? JSON.parse(tabs) : [];
  tabs = tabs.filter(function (item) {
    return item !== tabId;
  });
  localStorage.setItem('blocked_tabs', JSON.stringify(tabs));
}

然后,我将函数 blockRequest 添加为 chrome.webRequest.onBeforeRequest 和一些过滤器的侦听器。

chrome.webRequest.onBeforeRequest.addListener(blockRequest, { urls: filters, types: ['main_frame'] });