Adblock plus规则实现

简介: 上一篇说了adbock plus的匹配规则,但是有一些规则需要其他信息,而不是简单的url字符串就可以处理了。 比如域信息,像third-party规则等。 目前只打算支持script,image,stylesheet,third-party,domain规则 其中script,image,s...

上一篇说了adbock plus的匹配规则,但是有一些规则需要其他信息,而不是简单的url字符串就可以处理了。

比如域信息,像third-party规则等。
目前只打算支持script,image,stylesheet,third-party,domain规则
其中script,image,stylesheet规则通过url字符串的中的文件扩展名来匹配,
third-party,domain则借助KURL类进行解析,
因此设计新的FilterRule接口如下:

#ifndef FILTER_H

#define FILTER_H

#include "PlatformString.h"

#include "FilterManager.h"

#include <wtf/Vector.h>

#include <wtf/HashMap.h>

#include "KURL.h"

namespace WebCore {

       class FilterRule {

       public:

              /*

               首先manager已经判断过是过滤而不是隐藏规则了

               @@开始,则是白名单,manager会优先考虑

               ||开始则是不匹配协议名的过滤,并去掉||

               |开始,则去掉|,否则在开始处添加*

               含有$类型指定规则,去掉这些字符串,并处理类型

               |结尾,去掉|,否则在结尾处添加*

               */

              FilterRule( const String & rule);

              /*

               是否应该过滤,如果是白名单,匹配则应该不过滤,否则过滤

               类型用于只过滤adlbock plus规则中指定的类型。

               */

        bool shouldFilter(const KURL & mainURL,const KURL & url, FilterType t);

              //是否是白名单

        bool isWhiteFilter() { return m_isException;}

              //是否是通过类型来进行过滤,比如只过滤脚本等。这个可能需要很多信息,暂时不予考虑,比如domain类型过滤,

        bool isNeedMimeType() { return m_type!=0;}

        const String & getRegularFilter(){ return m_reFilter;}

        const String & getWholeRule() { return m_rule;}

              //inline const StringVector &  constantsForFastSearch() {return constants;}

              void print();

       private:

        bool m_isException; // start with @@ //白名单

        bool m_isMatchProtocol;

              /*

               adblock rule describe in regular expression

               */

        String m_reFilter;

              //StringVector constants;

        String m_rule;

              /*

               Type options: determine which types of elements a filter can block (or whitelist in case of an exception rule). Multiple type options can be specified to indicate that the filter should be applied to several types of elements. Possible types are:

               */

        FilterType m_type;

        /*

Restriction to third-party/first-party requests: If the third-party option is

specified, the filter is only applied to requests from a different origin

than the currently viewed page. Similarly, ~third-party restricts the filter

to requests from the same origin as the currently viewed page.

         */

        bool m_filterThirdParty;

        bool m_matchFirstParty;

        /*

Domain restrictions: The option domain=example.com means that the filter

should only be applied on pages from “example.com” domain. Multiple domains

can be specified using “|” as separator: with the option

domain=example.com|example.net the filter will only be applied on pages from

“example.com” or “example.net” domains. If a domain name is preceded with

“~”, the filter should not be applied on pages from this domain. For example,

domain=~example.com means that the filter should be applied on pages from any

domain but “example.com” and domain=example.com|~foo.example.com restricts

the filter to the “example.com” domain with the exception of

“foo.example.com” subdomain.

         */

        Vector<String> m_domains;

        Vector<String> m_inverseDomains;

    private:

        bool isMatchType(const KURL & url,FilterType t);

        bool isMatchThirdParty(const KURL & host,const KURL & other);

        bool isMatchDomains( const KURL & url);

        bool processDomains(String & ds);

       };

       //隐藏规则,含有##的规则

       class HideRule {

       public:

              /*

               ##之前的字符串解析为一组域名,后面的原封不动,作为css选择器来处理。

               */

              HideRule(const String & r);

              //隐藏规则适用的domain。如果为空,则适用于所有,否则只适用于指明的domain

              const StringVector & domains();

              //example.com,~foo.example.com##*.sponsor

              //*.sponsor就是selector

              const String & selector();

              void print();

       private:

              String m_sel;

              StringVector m_domains;

       };

}

#endif // FILTER_H


 

目录
相关文章
|
2月前
|
数据挖掘
Emlog程序屏蔽用户IP拉黑名单插件
Emlog程序屏蔽用户IP拉黑名单插件
38 9
Emlog程序屏蔽用户IP拉黑名单插件
|
3月前
|
前端开发 开发者
CSS样式覆盖规则详解,让你的网页更加出彩!
【8月更文挑战第23天】在Web前端开发中,理解CSS样式覆盖规则至关重要。当多个样式规则作用于同一元素时,哪些规则生效?本文通过实例解析这些规则。简单案例中,`.error`类选择器优先级高于`p`标签,文字显示红色。复杂案例涉及`.important`类与`!important`关键字,此时文字变为绿色。另外,内联样式拥有比外部样式更高的优先级。掌握这些原则有助于开发者高效管理样式。
94 0
织梦dedecms会员发布文章内容自动过滤外部链接的方法
织梦会员中心发布文章自动过滤外部外部链接,保留本站站内链接。这个织梦默认后台本身带有这样的功能的,只是会员模块里没有而已。
|
安全 前端开发 机器人
文字点选行为验证插件助您的网站更安全
随着互联网的快速发展,网络安全问题也日益突出。为了防止恶意机器人或自动程序的攻击,越来越多的网站采用了文字点选验证码作为一种有效的安全验证手段。
文字点选行为验证插件助您的网站更安全
|
存储 机器人 API
typecho博客增加评论过滤插件/违禁词拦截
typecho博客增加评论过滤插件/违禁词拦截
392 0
|
存储 开发者
苹果审核规则5.1.1(v)
苹果审核规则5.1.1(v)
139 0
|
SQL 安全 数据安全/隐私保护
|
Web App开发 网络安全
Firefox 屏蔽中国大陆用户安装 uBlock Origin 等广告拦截插件
Firefox 屏蔽中国大陆用户安装 uBlock Origin 等广告拦截插件
552 0
Firefox 屏蔽中国大陆用户安装 uBlock Origin 等广告拦截插件
|
缓存 算法 API
Akismet插件教程WordPress阻止过滤垃圾邮件插件
Akismet插件教程WordPress阻止过滤垃圾邮件插件
242 1
|
Web App开发
Chrome 私人珍藏-AdBlock插件实现浏览器广告屏蔽,超强力
Chrome 私人珍藏-AdBlock插件实现浏览器广告屏蔽,超强力
575 0
Chrome 私人珍藏-AdBlock插件实现浏览器广告屏蔽,超强力