1. 为什么safari要用content blockers 而不继续使用extension了?
虽然Extension能够做到同样的事情,但是相对来说,content blockers效率更高,性能更好。而且,Content Blocker不会像Extension一样,在一些情况下,带来内存的严重耗损。
2. 怎么编写一个Blocker?
每个Blocker都由一组"[]"来表示,方括号中包含了你要屏蔽的各种规则,如下图一所示:
[
{
"trigger": {
"url-filter": "evil-tracker\\.js"
},
"action": {
"type": "block"
}
},
{
"trigger": {
"url-filter": ".*",
"resource-type": ["image", "style-sheet"]
"unless-domain": ["reputable-content-server.com"]
},
"action": {
"type": "block-cookies"
}
}
]
图一
每组规则又由一组"{}"来表示,里面包含了你要触发的条件"trigger",以及触发后要对内容做的处理"action"。
其中触发条件的关键字包括:
"url-filter"(
值为string类型,此关键字必须包含):匹配的资源的url,url是支持正则表达式的;
"url-filter-is-case-sensitive"(值为boolean类型,可选):设置"url-filter"匹配的时候是否大小写敏感,默认值是不敏感的;
"resource-type" (值为一组string,可选):匹配的资源的类型,如"document","image","style-sheet","script","font","raw","sag-document","media","popup"。因为,触发器是在载入页面之前进行的匹配,所以类型的匹配不是这个资源本身定义的类型,而是浏览器引擎使用这个资源的类型,如"<img src="something.css">"会被识别为"image";
"load-type"(值为一组string,可选):匹配页面与当前资源链接之间的关系,这个值只有两种类型:1. "first-party:",表示资源来自于同一个scheme,domain,和port;其他的都是"third-party";
"if-domain"/"unless-domain"(值为一组字符串,可选):匹配的域名。
触发器触发后的执行方案的关键字包括:
"type"(值为string
,此关键字必须包含):定义了当触发器激活后要做的事情,如"block","block-cookies","css-display-none"。;
"selector"(值为string,当"type"的值为"css-display-none"类型的时候,必须包含此关键字):定义的在页面上应用“type”的被选择对象(此选项在“type”值为"css-display-none"的时候配合使用)。
3. 正则表达式支持的类型?
匹配任何字符:".";
匹配范围:"[a-b]";
量化的:
"?
","+
"和
"*
";
组和括号;
支持一行的开头("^")和一行的结尾("$")。
参考文章:https://www.webkit.org/blog/3476/content-blockers-first-look/