场景:
- 根据模式过滤一些重定向网址
- 显示一条消息,指出 URL 因重定向而被阻止
- 如果上一个请求被阻止,则在同一选项卡中"取消阻止"请求
我在webRequest.onBeforeRequest中使用的URL模式列表包含bit.ly。然后我点击了重定向到 google.com 的 URLbit.ly/2qlHCT。在这种情况下,我将显示一条类似"请求被阻止"的消息,但我不想通过在 onBeforeRequest 的回调中返回 { cancel: true } 来实际阻止请求。
如果用户尝试在同一选项卡中正常访问 google.com,那么我将显示一条消息"未阻止任何内容"。 因此,当您为特定域添加过滤器时,这与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));
}
然后,我只是将功能块请求作为侦听器添加到chrome.webRequest.onBeforeRequest
和一些过滤器中。
chrome.webRequest.onBeforeRequest.addListener(blockRequest, { urls: filters, types: ['main_frame'] });