summaryrefslogtreecommitdiff
path: root/src/adblock/adblockmanager.h
blob: 993fa9a7ec53b65b3f5020eeb143748296636265 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/* ============================================================
*
* This file is a part of the rekonq project
*
* Copyright (C) 2010-2012 by Andrea Diamantini <adjam7 at gmail dot com>
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
* ============================================================ */



#ifndef ADBLOCK_MANAGER_H
#define ADBLOCK_MANAGER_H


// NOTE: AdBlockPlus Filters (fast) summary
//
// ### Basic Filter rules
//
// RULE = http://example.com/ads/*
// this should block every link containing all things from that link
//
// ### Exception rules (@@)
//
// RULE = @@advice*
//
// this will save every site, also that matched by other rules, cointaining words
// that starts with "advice". Wildcards && regular expression allowed here.
//
// ### Beginning/end matching rules (||)
//
// RULE=||http://badsite.com
//
// will stop all links starting with http://badsite.com
//
// RULE=*swf||
//
// will stop all links to direct flash contents
//
// ### Comments (!)
//
// RULE=!azz..
//
// Every rule starting with a ! is commented out and should not be checked
//
// ### Filter Options
//
// There are 3 kind of filter options:
//
// --- ### TYPE OPTIONS
//
// You can also specify a number of options to modify the behavior of a filter.
// You list these options separated with commas after a dollar sign ($) at the end of the filter
//
// RULE=*/ads/*$element,match-case
//
// where $element can be one of the following:
// $script             external scripts loaded via HTML script tag
// $image              regular images, typically loaded via HTML img tag
// $background         background images, often specified via CSS
// $stylesheet         external CSS stylesheet files
// $object             content handled by browser plugins, e.g. Flash or Java
// $xbl                XBL bindings (typically loaded by -moz-binding CSS property) Firefox 3 or higher required
// $ping               link pings Firefox 3 or higher required
// $xmlhttprequest     requests started by the XMLHttpRequest object Firefox 3 or higher required
// $object-subrequest  requests started plugins like Flash Firefox 3 or higher required
// $dtd                DTD files loaded by XML documents Firefox 3 or higher required
// $subdocument        embedded pages, usually included via HTML frames
// $document           the page itself (only exception rules can be applied to the page)
// $other              types of requests not covered in the list above
//
//
// --- ### INVERSE TYPE OPTIONS
//
// Inverse type options are allowed through the ~ sign, for example:
//
// RULE=*/ads/*~$script,match-case
//
//
// --- ### THIRD-PARTY OPTIONS
//
// If "third-party" option is specified, filter is applied just to requests coming from a different
// origin than the currently viewed page.
// In the same way, the "~third-party" option restricts the filter to the requests coming from the
// same origin as the currently viewed page.
//
//
// ### Regular expressions
//
// They usually allow to check for (a lot of) sites, using just one rule, but be careful:
// BASIC FILTERS ARE PROCESSED FASTER THAN REGULAR EXPRESSIONS
// (That's true at least in ABP! In rekonq, I don't know...)
//
//
// ### ELEMENT HIDING (##)
//
// This is quite different from usual adblock (but, for me, more powerful!). Sometimes you will find advertisements
// that can’t be blocked because they are embedded as text in the web page itself.
// All you can do there is HIDE the element :)
//
// RULE=##div.advise
//
// The previous rule will hide every div whose class is named "advise". Usual CSS selectors apply here :)
//
// END NOTE ----------------------------------------------------------------------------------------------------------


// Rekonq Includes
#include "rekonq_defines.h"

// Local Includes
#include "adblockhostmatcher.h"
#include "adblockrule.h"

// KDE Includes
#include <KIO/Job>
#include <KSharedConfig>

// Qt Includes
#include <QObject>
#include <QStringList>
#include <QByteArray>

// Forward Includes
class QNetworkRequest;
class WebPage;

// Definitions
typedef QList<AdBlockRule> AdBlockRuleList;


class REKONQ_TESTS_EXPORT AdBlockManager : public QObject
{
    Q_OBJECT

public:
    /**
     * Entry point.
     * Access to AdBlockManager class by using
     * AdBlockManager::self()->thePublicMethodYouNeed()
     */
    static AdBlockManager *self();

    ~AdBlockManager();

    bool isEnabled();
    bool isHidingElements();

    bool blockRequest(const QNetworkRequest &request);

    void addCustomRule(const QString &, bool reloadPage = true);

    bool isAdblockEnabledForHost(const QString &host);
    
private:
    AdBlockManager(QObject *parent = 0);

    void updateSubscription(int);
    bool subscriptionFileExists(int);

    // load a file rule, given a path
    void loadRules(const QString &rulesFilePath);

    // load a single rule
    void loadRuleString(const QString &stringRule);

private Q_SLOTS:
    void loadSettings();
    void showSettings();

    void slotFinished(KJob *);

Q_SIGNALS:
    void reloadCurrentPage();

private:
    bool _isAdblockEnabled;
    bool _isHideAdsEnabled;

    AdBlockHostMatcher _hostBlackList;
    AdBlockHostMatcher _hostWhiteList;
    AdBlockRuleList _blackList;
    AdBlockRuleList _whiteList;
    QStringList _hideList;

    KSharedConfig::Ptr _adblockConfig;

    static QWeakPointer<AdBlockManager> s_adBlockManager;
};

#endif