我看到 Google 希望 Chrome 扩展开发者从 chrome.webRequest
chrome.declarativeNetRequest
。我看到静态规则,但问题是我们如何允许用户打开或关闭每个网站的单独规则?大多数用户希望覆盖白名单。这就是为什么我们使用 chrome.webRequest
来查看任何给定网页上的网络连接,如果这些 URL 中的任何一个与正则表达式规则集匹配,我们可以拒绝该请求,并且 Javascript 可以查看用户是否想要切换该请求在给定网站上关闭以将其列入白名单。有没有一种方法可以使用
declarativeNetRequest
查看任何网站并加载静态规则,用户可以根据需要从选项面板中关闭给定网站(白名单)?
如何避免在排除(列入白名单)的域上应用 DNR 规则?
没有必要(更好,我会说这是错误)去触动静态规则。
只需创建一个排除域的数组(可能会随着时间的推移而变化),并将该数组传递给具有更高优先级的动态规则。浏览器会处理剩下的事情。类似这样的:
....
const ALLOWALL_RULE_ID = 5999999;
const ALLOWALL_RULE_PRIORITY = 999999;
....
async function updateExcludedDomainsDynamicRule() {
await browser.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [ALLOWALL_RULE_ID],
addRules: [
{
id: ALLOWALL_RULE_ID,
priority: ALLOWALL_RULE_PRIORITY,
action: {
type: "allowAllRequests"
},
condition: {
requestDomains: excludedDomainsArray,
resourceTypes: ["main_frame", "sub_frame"]
}
}],
});
}
每次用户添加/删除排除域时,您都必须再次调用此函数。更新规则所需的时间因所使用的浏览器而异。
在 Chrome/Firefox 中为 5-8 毫秒。
在Safari(未解决问题最多的浏览器)中是6-8秒(!!!),在这种情况下,虽然功能几乎相同但有些差异,但在等待Apple时必须使用额外的技巧打算修复这个怪物)。
我最近
在苹果论坛上就这件事进行了讨论。
对于那些想要自行测试 DNR updateDynamicRules API 性能的人,我已经在 Github 上创建了一个关于它的存储库。