根据具有 Chrome 扩展名的模式拦截 URL
Intercept URLs based on patterns with Chrome extension
场景:
- 根据模式过滤一些重定向 URLs
- 显示一条消息,指出 URL 由于重定向
而被阻止
- "unblock" 如果先前的请求被阻止,则同一选项卡中的请求
我要在 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'] });
场景:
- 根据模式过滤一些重定向 URLs
- 显示一条消息,指出 URL 由于重定向 而被阻止
- "unblock" 如果先前的请求被阻止,则同一选项卡中的请求
我要在 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'] });